Operator SDK 使用 Ansible 开发 Operator 教程
前言
在现代云原生应用开发中,Operator 模式已经成为管理复杂应用的标准方式。Operator SDK 是开发 Operator 的强大工具,它支持多种开发方式,包括 Go、Helm 和 Ansible。本文将重点介绍如何使用 Operator SDK 的 Ansible 插件来构建一个 Operator。
准备工作
在开始之前,请确保您已完成以下准备工作:
- 已安装 Operator SDK
- 当前用户具有集群管理员权限
- 拥有可访问的镜像仓库(如公共镜像仓库或 Quay.io)并已登录命令行环境
- 如果使用私有仓库或自定义 CA,需要配置认证和证书
项目概述
我们将创建一个名为 memcached-operator 的示例项目,该 Operator 将实现以下功能:
- 当 Memcached 自定义资源(CR)创建时,自动部署 Memcached 实例
- 确保 Deployment 的副本数与 CR 中指定的数量一致
- 使用状态写入器更新 Memcached CR 的状态,包含相关 Pod 的名称
创建新项目
首先创建项目目录并初始化项目:
mkdir memcached-operator
cd memcached-operator
operator-sdk init --plugins=ansible --domain example.com
这个命令会生成一个 Kubebuilder PROJECT 文件,后续的 operator-sdk 命令会读取这个文件并知道这是一个 Ansible 类型的项目。
接下来创建 Memcached API:
operator-sdk create api --group cache --version v1alpha1 --kind Memcached --generate-role
生成的 Operator 结构包含:
- Memcached 自定义资源定义(CRD)和示例资源
- 一个"Manager"负责协调集群状态到期望状态
- 一个协调器,即 Ansible Role 或 Playbook
- watches.yaml 文件,将 Memcached 资源连接到 memcached Ansible Role
实现协调逻辑
我们需要提供协调逻辑,形式为 Ansible Role,它会在 Memcached 资源创建、更新或删除时运行。
编辑 roles/memcached/tasks/main.yml
:
---
- name: start memcached
kubernetes.core.k8s:
definition:
kind: Deployment
apiVersion: apps/v1
metadata:
name: '{{ ansible_operator_meta.name }}-memcached'
namespace: '{{ ansible_operator_meta.namespace }}'
spec:
replicas: "{{size}}"
selector:
matchLabels:
app: memcached
template:
metadata:
labels:
app: memcached
spec:
containers:
- name: memcached
command:
- memcached
- -m=64
- -o
- modern
- -v
image: "公共镜像仓库/memcached:1.4.36-alpine"
ports:
- containerPort: 11211
这个 Role 会:
- 确保 Memcached Deployment 存在
- 设置 Deployment 的副本数
虽然 Kubernetes 允许在创建资源时输入任意字段,但最佳实践是在 CRD 中定义这些字段,这样用户在使用自定义资源时可以看到将被使用的字段。
设置 Ansible Role 中使用的变量的默认值,编辑 roles/memcached/defaults/main.yml
:
---
# defaults file for Memcached
size: 1
更新示例 Memcached 资源 config/samples/cache_v1alpha1_memcached.yaml
:
apiVersion: cache.example.com/v1alpha1
kind: Memcached
metadata:
name: memcached-sample
spec:
size: 3
自定义资源 spec 中的键值对会作为额外变量传递给 Ansible。
配置 Operator 镜像
构建并推送 Operator 镜像到指定的镜像仓库。Makefile 使用项目初始化时写入的值或 CLI 参数来组合镜像标签。特别是 IMAGE_TAG_BASE 允许您为所有镜像标签定义公共镜像仓库、命名空间和部分名称。
更新 IMG 变量定义后,运行以下命令构建并推送 Operator 镜像:
make docker-build docker-push
运行 Operator
有三种方式可以运行 Operator:
- 作为集群外的 Go 程序运行
- 作为 Kubernetes 集群内的 Deployment 运行
- 由 Operator Lifecycle Manager (OLM) 以 bundle 格式管理
1. 在集群外本地运行
安装 CRD 并在本地运行 manager:
make install run
2. 作为集群内的 Deployment 运行
默认会创建一个名为 <project-name>-system
的新命名空间(例如 memcached-operator-system)用于部署。
通常,Operator 作者可能需要修改 config/rbac
以给 Operator 必要的权限来进行协调。
运行以下命令自定义清单并部署 Operator:
make deploy
3. 使用 OLM 部署 Operator
首先安装 OLM:
operator-sdk olm install
打包 Operator,然后构建并推送 bundle 镜像:
make bundle bundle-build bundle-push
最后运行 bundle:
operator-sdk run bundle example.com/memcached-operator-bundle:v0.0.1
创建 Memcached CR
更新示例 Memcached CR 清单并定义 spec:
apiVersion: cache.example.com/v1alpha1
kind: Memcached
metadata:
name: memcached-sample
spec:
size: 3
创建 CR:
kubectl apply -f config/samples/cache_v1alpha1_memcached.yaml
验证 Operator 是否创建了具有正确副本数的 Deployment:
kubectl get deployment
检查 Pod 和 CR 状态以确认状态已更新为包含 Memcached Pod 名称:
kubectl get pods
kubectl get memcached/memcached-sample -o yaml
更新副本数
更新 config/samples/cache_v1alpha1_memcached.yaml
将 spec.size
从 3 改为 5:
kubectl patch memcached memcached-sample -p '{"spec":{"size": 5}}' --type=merge
确认 Operator 是否更改了 Deployment 的副本数:
kubectl get deployment
清理
运行以下命令删除所有已部署的资源:
kubectl delete -f config/samples/cache_v1alpha1_memcached.yaml
make undeploy
进阶学习
建议阅读 Ansible 开发部分获取更多技巧,包括如何在本地运行 Operator。
本教程中,scaffolded 的 watches.yaml
可以直接使用,但它还有额外的可选功能。
这个示例构建了一个命名空间范围的 Operator,但 Ansible Operator 也可以用于集群范围。
OLM 将管理运行 Operator 所需的大多数(如果不是全部)资源,使用其他 operator-sdk 命令的一些设置。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考