apiVersion: "test1.example.com/v1alpha1"
kind: "Test1"
metadata:
name: "example"
annotations:
ansible.operator-sdk/reconcile-period: "30s"
熟悉了在本地使用Kubernetes Collection for Ansible之后,您可以在自定义资源 (CR) 发生更改时在操作符内部触发相同的Ansible逻辑。此示例将Ansible角色映射到操作符监视的特定Kubernetes资源。此映射在watches.yaml
文件中完成。
Red Hat支持的Operator SDK CLI工具版本(包括与Operator项目相关的脚手架和测试工具)已弃用,并计划在未来版本的OpenShift Container Platform中删除。Red Hat将在当前发布生命周期内为此功能提供错误修复和支持,但此功能将不再接收增强功能,并将从未来的OpenShift Container Platform版本中删除。 不建议使用Red Hat支持的Operator SDK版本创建新的Operator项目。拥有现有Operator项目的Operator作者可以使用OpenShift Container Platform 4.17随附的Operator SDK CLI工具版本来维护其项目并创建针对更新版本的OpenShift Container Platform的操作符版本。 以下与Operator项目相关的基础镜像未被弃用。这些基础镜像的运行时功能和配置API仍然支持错误修复和解决CVE。
有关OpenShift Container Platform中已弃用或删除的主要功能的最新列表,请参阅OpenShift Container Platform发行说明中的“已弃用和删除的功能”部分。 有关不受支持的社区维护的Operator SDK版本的信息,请参阅Operator SDK (Operator Framework)。 |
操作符使用Kubernetes扩展机制,自定义资源定义 (CRD),因此您的自定义资源 (CR) 的外观和行为就像内置的原生Kubernetes对象一样。
CR文件格式是一个Kubernetes资源文件。该对象具有必填字段和可选字段。
字段 | 描述 |
---|---|
|
要创建的CR的版本。 |
|
要创建的CR的种类。 |
|
要创建的Kubernetes特定元数据。 |
|
传递给Ansible的变量的键值列表。此字段默认为空。 |
|
总结对象的当前状态。对于基于 Ansible 的 Operator, |
|
要添加到 CR 的 Kubernetes 特定注释。 |
以下 CR 注释列表修改了 Operator 的行为
注释 | 描述 |
---|---|
|
指定 CR 的协调间隔。此值使用标准 Golang 包 |
apiVersion: "test1.example.com/v1alpha1"
kind: "Test1"
metadata:
name: "example"
annotations:
ansible.operator-sdk/reconcile-period: "30s"
您可以使用 Operator 项目顶层目录中的make run
命令来测试在本地运行的基于 Ansible 的 Operator 内部的逻辑。make run
Makefile 目标在本地运行ansible-operator
二进制文件,该文件从watches.yaml
文件读取,并使用您的~/.kube/config
文件与 Kubernetes 集群通信,就像k8s
模块一样。
您可以通过设置环境变量 |
Ansible Runner v2.3.3+
Ansible Runner HTTP 事件发射器插件 v1.0.0+
执行了以前在本地测试 Kubernetes Collection 的步骤
安装自定义资源定义 (CRD) 和自定义资源 (CR) 的适当基于角色的访问控制 (RBAC) 定义
$ make install
/usr/bin/kustomize build config/crd | kubectl apply -f -
customresourcedefinition.apiextensions.k8s.io/memcacheds.cache.example.com created
运行make run
命令
$ make run
/home/user/memcached-operator/bin/ansible-operator run
{"level":"info","ts":1612739145.2871568,"logger":"cmd","msg":"Version","Go Version":"go1.15.5","GOOS":"linux","GOARCH":"amd64","ansible-operator":"v1.10.1","commit":"1abf57985b43bf6a59dcd18147b3c574fa57d3f6"}
...
{"level":"info","ts":1612739148.347306,"logger":"controller-runtime.metrics","msg":"metrics server is starting to listen","addr":":8080"}
{"level":"info","ts":1612739148.3488882,"logger":"watches","msg":"Environment variable not set; using default value","envVar":"ANSIBLE_VERBOSITY_MEMCACHED_CACHE_EXAMPLE_COM","default":2}
{"level":"info","ts":1612739148.3490262,"logger":"cmd","msg":"Environment variable not set; using default value","Namespace":"","envVar":"ANSIBLE_DEBUG_LOGS","ANSIBLE_DEBUG_LOGS":false}
{"level":"info","ts":1612739148.3490646,"logger":"ansible-controller","msg":"Watching resource","Options.Group":"cache.example.com","Options.Version":"v1","Options.Kind":"Memcached"}
{"level":"info","ts":1612739148.350217,"logger":"proxy","msg":"Starting to serve","Address":"127.0.0.1:8888"}
{"level":"info","ts":1612739148.3506632,"logger":"controller-runtime.manager","msg":"starting metrics server","path":"/metrics"}
{"level":"info","ts":1612739148.350784,"logger":"controller-runtime.manager.controller.memcached-controller","msg":"Starting EventSource","source":"kind source: cache.example.com/v1, Kind=Memcached"}
{"level":"info","ts":1612739148.5511978,"logger":"controller-runtime.manager.controller.memcached-controller","msg":"Starting Controller"}
{"level":"info","ts":1612739148.5512562,"logger":"controller-runtime.manager.controller.memcached-controller","msg":"Starting workers","worker count":8}
现在 Operator 正在监视您的 CR 以查找事件,创建 CR 将触发您的 Ansible 角色运行。
考虑一个示例
因为未设置 |
创建您的 CR 实例,并将默认变量state
设置为present
$ oc apply -f config/samples/<gvk>.yaml
检查是否创建了example-config
配置映射
$ oc get configmaps
NAME STATUS AGE
example-config Active 3s
修改您的config/samples/<gvk>.yaml
文件以将state
字段设置为absent
。例如
apiVersion: cache.example.com/v1
kind: Memcached
metadata:
name: memcached-sample
spec:
state: absent
应用更改
$ oc apply -f config/samples/<gvk>.yaml
确认配置映射已删除
$ oc get configmap
在本地测试了 Operator 内部的自定义 Ansible 逻辑后,您可以测试 OpenShift Container Platform 集群上的 Pod 中的 Operator,这对于生产使用是首选。
您可以将您的 Operator 项目作为部署在您的集群上运行。
运行以下make
命令来构建和推送 Operator 镜像。修改以下步骤中的IMG
参数以引用您可以访问的存储库。您可以在 Quay.io 等存储库站点获得用于存储容器的帐户。
构建镜像
$ make docker-build IMG=<registry>/<user>/<image_name>:<tag>
Operator 的 SDK 生成的 Dockerfile 明确引用了 |
将镜像推送到存储库
$ make docker-push IMG=<registry>/<user>/<image_name>:<tag>
镜像的名称和标签,例如 |
运行以下命令来部署 Operator
$ make deploy IMG=<registry>/<user>/<image_name>:<tag>
默认情况下,此命令创建一个名称为 Operator 项目名称的命名空间,格式为<project_name>-system
,并用于部署。此命令还安装来自config/rbac
的 RBAC 清单。
运行以下命令以验证 Operator 是否正在运行
$ oc get deployment -n <project_name>-system
NAME READY UP-TO-DATE AVAILABLE AGE
<project_name>-controller-manager 1/1 1 1 8m
基于 Ansible 的 Operator 提供关于 Ansible 运行的日志,这对于调试 Ansible 任务很有用。日志还可以包含有关 Operator 的内部结构及其与 Kubernetes 交互的详细信息。
在集群上作为部署运行的基于 Ansible 的 Operator
要查看基于 Ansible 的 Operator 的日志,请运行以下命令
$ oc logs deployment/<project_name>-controller-manager \
-c manager \(1)
-n <namespace> (2)
1 | 查看manager 容器的日志。 |
2 | 如果您使用make deploy 命令将 Operator 作为部署运行,请使用<project_name>-system 命名空间。 |
{"level":"info","ts":1612732105.0579333,"logger":"cmd","msg":"Version","Go Version":"go1.15.5","GOOS":"linux","GOARCH":"amd64","ansible-operator":"v1.10.1","commit":"1abf57985b43bf6a59dcd18147b3c574fa57d3f6"}
{"level":"info","ts":1612732105.0587437,"logger":"cmd","msg":"WATCH_NAMESPACE environment variable not set. Watching all namespaces.","Namespace":""}
I0207 21:08:26.110949 7 request.go:645] Throttling request took 1.035521578s, request: GET:https://172.30.0.1:443/apis/flowcontrol.apiserver.k8s.io/v1alpha1?timeout=32s
{"level":"info","ts":1612732107.768025,"logger":"controller-runtime.metrics","msg":"metrics server is starting to listen","addr":"127.0.0.1:8080"}
{"level":"info","ts":1612732107.768796,"logger":"watches","msg":"Environment variable not set; using default value","envVar":"ANSIBLE_VERBOSITY_MEMCACHED_CACHE_EXAMPLE_COM","default":2}
{"level":"info","ts":1612732107.7688773,"logger":"cmd","msg":"Environment variable not set; using default value","Namespace":"","envVar":"ANSIBLE_DEBUG_LOGS","ANSIBLE_DEBUG_LOGS":false}
{"level":"info","ts":1612732107.7688901,"logger":"ansible-controller","msg":"Watching resource","Options.Group":"cache.example.com","Options.Version":"v1","Options.Kind":"Memcached"}
{"level":"info","ts":1612732107.770032,"logger":"proxy","msg":"Starting to serve","Address":"127.0.0.1:8888"}
I0207 21:08:27.770185 7 leaderelection.go:243] attempting to acquire leader lease memcached-operator-system/memcached-operator...
{"level":"info","ts":1612732107.770202,"logger":"controller-runtime.manager","msg":"starting metrics server","path":"/metrics"}
I0207 21:08:27.784854 7 leaderelection.go:253] successfully acquired lease memcached-operator-system/memcached-operator
{"level":"info","ts":1612732107.7850506,"logger":"controller-runtime.manager.controller.memcached-controller","msg":"Starting EventSource","source":"kind source: cache.example.com/v1, Kind=Memcached"}
{"level":"info","ts":1612732107.8853772,"logger":"controller-runtime.manager.controller.memcached-controller","msg":"Starting Controller"}
{"level":"info","ts":1612732107.8854098,"logger":"controller-runtime.manager.controller.memcached-controller","msg":"Starting workers","worker count":4}