Operator SDK 使用 Ansible 开发 Operator 教程

Operator SDK 使用 Ansible 开发 Operator 教程

operator-sdk Operator SDK是一个开源的Kubernetes Operator开发框架,用于简化Kubernetes应用程序的部署、管理和升级。 - 功能:Kubernetes Operator开发;应用程序管理;部署;升级。 - 特点:易于使用;支持多种编程语言;与Kubernetes集成;自动化部署和管理。 operator-sdk 项目地址: https://gitcode.com/gh_mirrors/op/operator-sdk

前言

在现代云原生应用开发中,Operator 模式已经成为管理复杂应用的标准方式。Operator SDK 是开发 Operator 的强大工具,它支持多种开发方式,包括 Go、Helm 和 Ansible。本文将重点介绍如何使用 Operator SDK 的 Ansible 插件来构建一个 Operator。

准备工作

在开始之前,请确保您已完成以下准备工作:

  1. 已安装 Operator SDK
  2. 当前用户具有集群管理员权限
  3. 拥有可访问的镜像仓库(如公共镜像仓库或 Quay.io)并已登录命令行环境
  4. 如果使用私有仓库或自定义 CA,需要配置认证和证书

项目概述

我们将创建一个名为 memcached-operator 的示例项目,该 Operator 将实现以下功能:

  1. 当 Memcached 自定义资源(CR)创建时,自动部署 Memcached 实例
  2. 确保 Deployment 的副本数与 CR 中指定的数量一致
  3. 使用状态写入器更新 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 会:

  1. 确保 Memcached Deployment 存在
  2. 设置 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:

  1. 作为集群外的 Go 程序运行
  2. 作为 Kubernetes 集群内的 Deployment 运行
  3. 由 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.yamlspec.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 命令的一些设置。

operator-sdk Operator SDK是一个开源的Kubernetes Operator开发框架,用于简化Kubernetes应用程序的部署、管理和升级。 - 功能:Kubernetes Operator开发;应用程序管理;部署;升级。 - 特点:易于使用;支持多种编程语言;与Kubernetes集成;自动化部署和管理。 operator-sdk 项目地址: https://gitcode.com/gh_mirrors/op/operator-sdk

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芮川琨Jack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值