apiVersion: "test1.example.com/v1alpha1"
kind: "Test1"
metadata:
name: "example"
annotations:
ansible.operator-sdk/reconcile-period: "30s"
熟悉了在本地使用 Kubernetes Collection for Ansible之后,您可以在自定义资源 (CR) 更改时在 Operator 内触发相同的 Ansible 逻辑。此示例将 Ansible 角色映射到 Operator 监视的特定 Kubernetes 资源。此映射在watches.yaml
文件中完成。
Red Hat 支持的 Operator SDK CLI 工具版本(包括与 Operator 项目相关的脚手架和测试工具)已弃用,并计划在未来版本的 Red Hat OpenShift Service on AWS 中删除。Red Hat 将在当前版本生命周期内为此功能提供错误修复和支持,但此功能将不再接收增强功能,并将从未来的 Red Hat OpenShift Service on AWS 版本中删除。 不建议使用 Red Hat 支持的 Operator SDK 版本创建新的 Operator 项目。拥有现有 Operator 项目的 Operator 作者可以使用 Red Hat OpenShift Service on AWS 发布的 Operator SDK CLI 工具版本来维护其项目并创建针对较新版本的 Red Hat OpenShift Service on AWS 的 Operator 版本。 以下与 Operator 项目相关的基础镜像未被弃用。这些基础镜像的运行时功能和配置 API 仍然支持错误修复和解决 CVE。
有关不受支持的社区维护的 Operator SDK 版本的信息,请参阅Operator SDK (Operator Framework)。 |
Operator 使用 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
在本地测试了您自定义的 Ansible 逻辑后,您可以在 AWS 集群上的 Red Hat OpenShift Service 上的 pod 内测试 Operator,这对于生产使用是推荐的。
您可以将您的 Operator 项目作为部署运行在您的集群上。
运行以下make
命令来构建和推送 Operator 镜像。修改以下步骤中的IMG
参数以引用您有访问权限的仓库。您可以在 Quay.io 等仓库站点获取用于存储容器的帐户。
构建镜像
$ make docker-build IMG=<registry>/<user>/<image_name>:<tag>
SDK 为 Operator 生成的 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}
您可以将环境变量ANSIBLE_DEBUG_LOGS
设置为True
以启用检查日志中的完整 Ansible 结果,这在调试时可能会有所帮助。
编辑config/manager/manager.yaml
和config/default/manager_auth_proxy_patch.yaml
文件以包含以下配置
containers:
- name: manager
env:
- name: ANSIBLE_DEBUG_LOGS
value: "True"
在开发基于 Ansible 的 Operator 时,启用日志中的额外调试信息可能会有所帮助。
将ansible.sdk.operatorframework.io/verbosity
注解添加到您的自定义资源以启用所需的详细级别。例如:
apiVersion: "cache.example.com/v1alpha1"
kind: "Memcached"
metadata:
name: "example-memcached"
annotations:
"ansible.sdk.operatorframework.io/verbosity": "4"
spec:
size: 4