Skip to content

Operator SDK 实战

Operator SDK vs kubebuilder

特性kubebuilderOperator SDK
语言GoGo / Ansible / Helm
底层controller-runtimecontroller-runtime(Go)
适合复杂 Operator快速开发
社区K8s SIGRed Hat

安装

bash
# 安装 operator-sdk
export ARCH=$(case $(uname -m) in x86_64) echo -n amd64 ;; aarch64) echo -n arm64 ;; *) echo -n $(uname -m) ;; esac)
export OS=$(uname | awk '{print tolower($0)}')
export OPERATOR_SDK_DL_URL=https://github.com/operator-framework/operator-sdk/releases/download/v1.33.0
curl -LO ${OPERATOR_SDK_DL_URL}/operator-sdk_${OS}_${ARCH}
chmod +x operator-sdk_${OS}_${ARCH} && mv operator-sdk_${OS}_${ARCH} /usr/local/bin/operator-sdk

Go Operator

bash
# 初始化项目
operator-sdk init --domain mycompany.io --repo github.com/mycompany/my-operator

# 创建 API
operator-sdk create api --group apps --version v1alpha1 --kind MyApp --resource --controller

# 生成代码
make generate && make manifests

# 运行
make install && make run

Ansible Operator(无需 Go)

bash
# 初始化 Ansible Operator
operator-sdk init --plugins=ansible --domain mycompany.io

# 创建 API
operator-sdk create api --group apps --version v1alpha1 --kind MyApp --generate-role

# 目录结构
roles/
└── myapp/
    ├── tasks/
   └── main.yml    # Ansible 任务
    ├── defaults/
   └── main.yml    # 默认变量
    └── templates/
        └── deployment.yaml.j2
yaml
# roles/myapp/tasks/main.yml
- name: 创建 Deployment
  kubernetes.core.k8s:
    state: present
    definition:
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: "{{ ansible_operator_meta.name }}"
        namespace: "{{ ansible_operator_meta.namespace }}"
      spec:
        replicas: "{{ replicas | default(1) }}"
        selector:
          matchLabels:
            app: "{{ ansible_operator_meta.name }}"
        template:
          metadata:
            labels:
              app: "{{ ansible_operator_meta.name }}"
          spec:
            containers:
            - name: app
              image: "{{ image }}"

- name: 创建 Service
  kubernetes.core.k8s:
    state: present
    definition:
      apiVersion: v1
      kind: Service
      metadata:
        name: "{{ ansible_operator_meta.name }}"
        namespace: "{{ ansible_operator_meta.namespace }}"
      spec:
        selector:
          app: "{{ ansible_operator_meta.name }}"
        ports:
        - port: 80
          targetPort: 8080

OLM(Operator Lifecycle Manager)

bash
# 安装 OLM
operator-sdk olm install

# 打包 Operator
make bundle IMG=my-registry/my-operator:v0.1.0
make bundle-build bundle-push BUNDLE_IMG=my-registry/my-operator-bundle:v0.1.0

# 运行 Operator(通过 OLM)
operator-sdk run bundle my-registry/my-operator-bundle:v0.1.0

本站内容由 褚成志 整理编写,仅供学习参考