0
0
Lập trình
Sơn Tùng Lê
Sơn Tùng Lê103931498422911686980

Kubernetes: Tìm hiểu về Operator và CustomResourceDefinition

Đăng vào 1 tuần trước

• 4 phút đọc

Giới thiệu

Kubernetes là một hệ thống quản lý container phổ biến, và trong quá trình sử dụng, có thể bạn đã gặp phải khái niệm về OperatorCustomResourceDefinition (CRD). Nhưng bạn đã thực sự hiểu rõ về chúng chưa? Bài viết này sẽ giúp bạn nắm rõ hơn về cách hoạt động của Operator, CRD và sự khác biệt giữa Operator và Controller trong Kubernetes.

Mục lục

Sự khác biệt giữa Kubernetes Controller và Kubernetes Operator

Kubernetes Controller

Kubernetes Controller là một dịch vụ theo dõi tài nguyên trong cụm và điều chỉnh trạng thái của chúng sao cho tương ứng với mô tả trong cơ sở dữ liệu etcd. Có nhiều Controller mặc định trong Kubernetes như ReplicaSet Controller và Deployment Controller.

Kubernetes Operator

Kubernetes Operator là một dạng Controller nâng cao, có thể xem như là một Custom Controller. Nó có thể giao tiếp với API Kubernetes để nhận và cập nhật thông tin về tài nguyên. Khác với các Controller mặc định, Operator cho phép bạn định nghĩa các tài nguyên tùy chỉnh thông qua CRD.

Các framework cho Kubernetes Operator

Có một số giải pháp giúp đơn giản hóa việc tạo ra các Operator, bao gồm:

  • Kubebuilder: Framework cho việc tạo Controller bằng ngôn ngữ Go.
  • Kopf: Framework cho việc tạo Operator bằng Python.
  • Operator SDK: Giúp làm việc với Controller thậm chí thông qua Helm mà không cần mã.

Tạo CustomResourceDefinition

Khái niệm về CRD

CustomResourceDefinition (CRD) cho phép bạn mở rộng API Kubernetes với các loại tài nguyên tùy chỉnh. Để bắt đầu, chúng ta sẽ tạo một CRD mô tả tài nguyên MyApp với các trường như hình ảnh Docker và một trường tùy chỉnh.

Ví dụ CRD cho MyApp

yaml Copy
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: myapps.demo.rtfm.co.ua
spec:
  group: demo.rtfm.co.ua
  versions:
    - name: v1
      served: true
      storage: true
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                image:
                  type: string
                banner:
                  type: string
                  description: "Optional banner text for the application"
  scope: Namespaced
  names:
    plural: myapps
    singular: myapp
    kind: MyApp
    shortNames:
      - ma

Thêm CRD vào Kubernetes

Sau khi tạo file CRD, bạn có thể áp dụng nó vào cụm Kubernetes:

bash Copy
$ kubectl apply -f myapp-crd.yaml

Xây dựng một Kubernetes Operator với Kopf

Thiết lập môi trường

Để tạo một Operator, trước tiên bạn cần thiết lập môi trường Python và cài đặt các thư viện cần thiết:

bash Copy
$ python -m venv venv
$ source venv/bin/activate
$ pip install kopf kubernetes PyYAML

Viết mã cho Operator

Dưới đây là một ví dụ về mã cho Operator sử dụng Kopf:

python Copy
import os
import kopf
import kubernetes
import yaml

@kopf.on.create('demo.rtfm.co.ua', 'v1', 'myapps')
def create_myapp(spec, name, namespace, logger, **kwargs):
    image = spec.get('image')
    if not image:
        raise kopf.PermanentError("Field 'spec.image' must be provided.")

    banner = spec.get('banner')
    pod_template = "..."  # Định nghĩa pod template ở đây
    pod_yaml = pod_template.format(name=name, image=image)
    pod_spec = yaml.safe_load(pod_yaml)

    api = kubernetes.client.CoreV1Api()
    api.create_namespaced_pod(namespace=namespace, body=pod_spec)
    logger.info(f"Pod {name}-pod created.")

Chạy Operator

Chạy Operator bằng lệnh:

bash Copy
$ kopf run myoperator.py --verbose

Mẫu tài nguyên: Kopf và Kubebuilder

Thay vì sử dụng file mẫu riêng, bạn có thể định nghĩa tài nguyên trực tiếp trong mã Operator. Điều này giúp giảm thiểu số lượng file và dễ quản lý hơn.

Thực tế về các Operator trong Kubernetes

Trong thực tế, các Operator có thể tương tác với các tài nguyên bên ngoài như AWS. Dưới đây là một ví dụ về cách sử dụng SDK AWS từ một CustomResource để tạo ALB:

python Copy
@kopf.on.create('demo.rtfm.co.ua', 'v1', 'myingresses')
def create_ingress(spec, name, namespace, logger, **kwargs):
    # Thực hiện tạo ALB tại đây
    pass

Kết luận

Kubernetes Operator và CustomResourceDefinition là những công cụ mạnh mẽ giúp bạn mở rộng khả năng của Kubernetes. Bằng cách hiểu rõ về chúng, bạn có thể quản lý và tự động hóa các tài nguyên của mình một cách hiệu quả hơn. Hãy bắt đầu xây dựng các Operator của riêng bạn ngay hôm nay để tối ưu hóa quy trình làm việc trong Kubernetes!

Câu hỏi thường gặp

  1. CRD là gì?
    CRD là một cách để mở rộng API của Kubernetes bằng cách định nghĩa các loại tài nguyên tùy chỉnh.
  2. Kubernetes Operator có gì khác biệt so với Controller?
    Operator là một loại Controller nâng cao, cho phép quản lý các tài nguyên tùy chỉnh.

Thực hành

Hãy thử tạo một CRD và một Operator đơn giản cho riêng bạn để hiểu rõ hơn về cách hoạt động của chúng trong Kubernetes.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào