Operator SDK 实战
Operator SDK vs kubebuilder
| 特性 | kubebuilder | Operator SDK |
|---|---|---|
| 语言 | Go | Go / Ansible / Helm |
| 底层 | controller-runtime | controller-runtime(Go) |
| 适合 | 复杂 Operator | 快速开发 |
| 社区 | K8s SIG | Red 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-sdkGo 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 runAnsible 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.j2yaml
# 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: 8080OLM(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