×

熟悉了在本地使用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。

  • 基于Ansible的Operator项目的基镜像

  • 基于Helm的Operator项目的基镜像

有关OpenShift Container Platform中已弃用或删除的主要功能的最新列表,请参阅OpenShift Container Platform发行说明中的“已弃用和删除的功能”部分。

有关不受支持的社区维护的Operator SDK版本的信息,请参阅Operator SDK (Operator Framework)

自定义资源文件

操作符使用Kubernetes扩展机制,自定义资源定义 (CRD),因此您的自定义资源 (CR) 的外观和行为就像内置的原生Kubernetes对象一样。

CR文件格式是一个Kubernetes资源文件。该对象具有必填字段和可选字段。

表1. 自定义资源字段
字段 描述

apiVersion

要创建的CR的版本。

kind

要创建的CR的种类。

metadata

要创建的Kubernetes特定元数据。

spec (可选)

传递给Ansible的变量的键值列表。此字段默认为空。

status

总结对象的当前状态。对于基于 Ansible 的 Operator,status 子资源 默认情况下已为 CRD 启用,并由operator_sdk.util.k8s_status Ansible 模块管理,该模块将condition信息添加到 CR 的status中。

注释

要添加到 CR 的 Kubernetes 特定注释。

以下 CR 注释列表修改了 Operator 的行为

表 2. 基于 Ansible 的 Operator 注释
注释 描述

ansible.operator-sdk/reconcile-period

指定 CR 的协调间隔。此值使用标准 Golang 包time进行解析。具体来说,使用ParseDuration,它应用默认后缀s,以秒为单位给出值。

基于 Ansible 的 Operator 注释示例
apiVersion: "test1.example.com/v1alpha1"
kind: "Test1"
metadata:
  name: "example"
annotations:
  ansible.operator-sdk/reconcile-period: "30s"

在本地测试基于 Ansible 的 Operator

您可以使用 Operator 项目顶层目录中的make run命令来测试在本地运行的基于 Ansible 的 Operator 内部的逻辑。make run Makefile 目标在本地运行ansible-operator二进制文件,该文件从watches.yaml文件读取,并使用您的~/.kube/config文件与 Kubernetes 集群通信,就像k8s模块一样。

您可以通过设置环境变量ANSIBLE_ROLES_PATH或使用ansible-roles-path标志来自定义角色路径。如果在ANSIBLE_ROLES_PATH值中找不到角色,则 Operator 会在{{当前目录}}/roles中查找它。

先决条件
步骤
  1. 安装自定义资源定义 (CRD) 和自定义资源 (CR) 的适当基于角色的访问控制 (RBAC) 定义

    $ make install
    示例输出
    /usr/bin/kustomize build config/crd | kubectl apply -f -
    customresourcedefinition.apiextensions.k8s.io/memcacheds.cache.example.com created
  2. 运行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 角色运行。

    考虑一个示例config/samples/<gvk>.yaml CR 清单

    apiVersion: <group>.example.com/v1alpha1
    kind: <kind>
    metadata:
      name: "<kind>-sample"

    因为未设置spec字段,所以 Ansible 在没有额外变量的情况下被调用。从 CR 向 Ansible 传递额外变量将在另一节中介绍。为 Operator 设置合理的默认值非常重要。

  3. 创建您的 CR 实例,并将默认变量state设置为present

    $ oc apply -f config/samples/<gvk>.yaml
  4. 检查是否创建了example-config配置映射

    $ oc get configmaps
    示例输出
    NAME                    STATUS    AGE
    example-config          Active    3s
  5. 修改您的config/samples/<gvk>.yaml文件以将state字段设置为absent。例如

    apiVersion: cache.example.com/v1
    kind: Memcached
    metadata:
      name: memcached-sample
    spec:
      state: absent
  6. 应用更改

    $ oc apply -f config/samples/<gvk>.yaml
  7. 确认配置映射已删除

    $ oc get configmap

在集群上测试基于 Ansible 的 Operator

在本地测试了 Operator 内部的自定义 Ansible 逻辑后,您可以测试 OpenShift Container Platform 集群上的 Pod 中的 Operator,这对于生产使用是首选。

您可以将您的 Operator 项目作为部署在您的集群上运行。

步骤
  1. 运行以下make命令来构建和推送 Operator 镜像。修改以下步骤中的IMG参数以引用您可以访问的存储库。您可以在 Quay.io 等存储库站点获得用于存储容器的帐户。

    1. 构建镜像

      $ make docker-build IMG=<registry>/<user>/<image_name>:<tag>

      Operator 的 SDK 生成的 Dockerfile 明确引用了GOARCH=amd64用于go build。这可以修改为GOARCH=$TARGETARCH以用于非 AMD64 架构。Docker 将自动将环境变量设置为–platform指定的值。对于 Buildah,需要使用–build-arg。更多信息,请参见多架构

    2. 将镜像推送到存储库

      $ make docker-push IMG=<registry>/<user>/<image_name>:<tag>

      镜像的名称和标签,例如IMG=<registry>/<user>/<image_name>:<tag>,可以在两个命令中也设置在您的 Makefile 中。修改IMG ?= controller:latest值以设置您的默认镜像名称。

  2. 运行以下命令来部署 Operator

    $ make deploy IMG=<registry>/<user>/<image_name>:<tag>

    默认情况下,此命令创建一个名称为 Operator 项目名称的命名空间,格式为<project_name>-system,并用于部署。此命令还安装来自config/rbac的 RBAC 清单。

  3. 运行以下命令以验证 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 日志

基于 Ansible 的 Operator 提供关于 Ansible 运行的日志,这对于调试 Ansible 任务很有用。日志还可以包含有关 Operator 的内部结构及其与 Kubernetes 交互的详细信息。

查看 Ansible 日志

先决条件
  • 在集群上作为部署运行的基于 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 结果

您可以将环境变量ANSIBLE_DEBUG_LOGS设置为True以启用检查日志中的完整 Ansible 结果,这在调试时可能很有帮助。

步骤
  • 编辑config/manager/manager.yamlconfig/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