Kubernetes 遇见事件驱动的 Ansible
在当今快节奏的世界中,每一秒都至关重要,能够及时应对活动可以决定是否能够满足消费者的需求和服务水平协议。这两者都是 事件驱动的 Ansible 的目标,它旨在通过响应满足特定条件的事件来进一步扩展基于 Ansible 的自动化的覆盖范围。这些事件可能来自各种来源,例如 HTTP 端点、队列或主题上的消息或公共云资源。Kubernetes 已成为在云原生架构中管理基础设施和应用程序的代名词,许多组织都依赖这些系统来运行其业务关键型工作负载。自动化和 Kubernetes 齐头并进,Ansible 已经在该生态系统中发挥作用。现在可以使用一项利用事件驱动 Ansible 框架的新功能,它扩展了 Ansible 和 Kubernetes 之间的集成,以便可以根据 Kubernetes 集群中发生的事件和操作触发 Ansible 自动化活动。
事件驱动的 Ansible 使用称为规则手册的概念进行设计,规则手册包含三个主要组件
- 操作 - 触发资产的执行,包括 Ansible 剧本或模块
- 规则 - 确定接收到的事件是否与某些条件匹配
- 来源 - 来自外部实体的事件的来源,这些事件在 Ansible 事件框架中被使用和处理
有广泛的解决方案生态系统可用于从 Ansible 管理 Kubernetes,这主要通过 kubernetes.core 集合 提供。该集合包含从管理 Kubernetes 集群中资源的机制到对 Helm 包管理器支持以及利用 Kubernetes 集群作为清单源的所有内容。现在,通过 Kubernetes 和事件驱动 Ansible 框架的集成提供了可用功能。事件源允许使用源自 Kubernetes 集群的更改,这些更改可用于触发自动化以响应和根据接收到的内容和配置的规则采取行动。让我们探讨如何利用这种新创建的功能来进一步加强 Kubernetes 和 Ansible 之间的集成。
与事件驱动的 Ansible 和 Kubernetes 相关的资产位于 Ansible Galaxy 中的 sabre1041.eda 集合 中。确保将执行 Ansible 自动化的控制节点安装并配置了必要的工具。这包括 Ansible Core、与事件驱动的 Ansible 相关的工具以及包含事件驱动的 Ansible Kubernetes 集成的集合。请参阅 Ansible Core 和 事件驱动的 Ansible 的相关文档,了解目标操作系统和安装方法。
安装并配置 Ansible Core 和事件驱动的 Ansible 后,通过执行以下命令安装 sabre1041.eda 集合
ansible-galaxy collection install sabre1041.eda
此集合还要求安装 Python requests 包,这可以通过执行以下命令来实现
现在所有先决条件工具都已满足,可以将注意力转向如何配置规则手册以利用 Kubernetes 集成。事件驱动 Ansible 架构中的事件在规则手册的源部分中配置。可以在规则手册中指定一个或多个源,从而能够配置强大的条件和操作集。
下面显示了一个利用集合中 k8s 事件源插件的基本规则手册
- name: Listen for newly added ConfigMap resources
hosts: all
sources:
- sabre1041.eda.k8s:
api_version: v1
kind: ConfigMap
namespace: default
rules:
- name: Notify
condition: event.type == "ADDED"
action:
debug:
k8s 插件的建模方式类似于 kubernetes.core 集合中的 k8s 模块,因此任何熟悉此模块的人在使用此 k8s 源插件时都会感到宾至如归。
此规则手册的逻辑如下
- 连接到远程 Kubernetes 集群并使用默认命名空间中发生的 ConfigMap 资源的更改
- 每当 Kubernetes 集群中发生更改时,k8s 源插件都会将类型和内容包含到事件对象中
- 仅当事件的 type 属性等于 "ADDED"(每当将 ConfigMap 添加到集群时)时,执行调试操作,该操作将打印出事件和任何其他关联的变量。
虽然此规则手册监视特定命名空间中的更改,但可以通过省略源插件中命名空间参数的使用来支持监视整个 Kubernetes 集群中的更改。如果禁止访问默认命名空间,请随时选择另一个允许访问的命名空间。
为了演示此规则手册的使用,将前面提供的內容添加到一个名为 k8s-eda-demo.yaml 的新规则手册文件中。此外,请确保本地机器已通过身份验证到 Kubernetes 集群,或自定义插件参数以指定应使用的 Kubernetes 集群的位置。请参阅插件文档以了解可用选项。
在一个名为 inventory 的文件中创建一个简单的清单,内容如下所示
运行规则手册以开始使用以下命令使用事件
ansible-rulebook -i inventory --rulebook k8s-eda-demo.yaml --verbose
在规则手册监视默认命名空间中的 ConfigMap 更改时,在默认命名空间中创建一个新的 ConfigMap 以演示事件是否正在被正确捕获。可以通过使用 Kubernetes CLI (kubectl) 执行以下命令来完成此任务
kubectl create configmap -n default eda-example --from-literal=message="Kubernetes Meets Event-Driven Ansible"
观察以下内容已在执行 ansible-rulebook 命令的窗口中捕获并显示。
kwargs:
{'facts': {},
'hosts': ['all'],
'inventory': 'localhost',
'project_data_file': None,
'ruleset': 'Listen for newly added ConfigMap resources',
'source_rule_name': 'Notify',
'source_ruleset_name': 'Listen for newly added ConfigMap resources',
'variables': {'event': {'resource': {'apiVersion': 'v1',
'data': {'message': 'Kubernetes Meets '
'Event-Driven '
'Ansible'},
'kind': 'ConfigMap',
'metadata': {'creationTimestamp': '2022-12-25T17:40:43Z',
'managedFields': [{'apiVersion': 'v1',
'fieldsType': 'FieldsV1',
'fieldsV1': {'f:data': {'.': {},
'f:message': {}}},
'manager': 'kubectl-create',
'operation': 'Update',
'time': '2022-12-25T17:40:43Z'}],
'name': 'eda-example',
'namespace': 'default',
'resourceVersion': '119407',
'uid': '2862db59-8990-4a37-9433-50dcfbaa6d71'}},
'type': 'ADDED'},
'fact': {'resource': {'apiVersion': 'v1',
'data': {'message': 'Kubernetes Meets '
'Event-Driven '
'Ansible'},
'kind': 'ConfigMap',
'metadata': {'creationTimestamp': '2022-12-25T17:40:43Z',
'managedFields': [{'apiVersion': 'v1',
'fieldsType': 'FieldsV1',
'fieldsV1': {'f:data': {'.': {},
'f:message': {}}},
'manager': 'kubectl-create',
'operation': 'Update',
'time': '2022-12-25T17:40:43Z'}],
'name': 'eda-example',
'namespace': 'default',
'resourceVersion': '119407',
'uid': '2862db59-8990-4a37-9433-50dcfbaa6d71'}},
'type': 'ADDED'}}}
如上所示,与 Kubernetes 集群中新创建的 ConfigMap 和事件关联的详细信息已被捕获。
确认 Kubernetes 源插件已成功捕获事件后,让我们演示如何在一个 Ansible Playbook 中使用这些事件。创建一个名为 k8s-eda-demo-playbook.yaml 的新文件,内容如下。
- hosts: localhost
connection: local
tasks:
- ansible.builtin.debug:
msg: "ConfigMap in namespace '{{ event.resource.metadata.namespace }}' with name '{{ event.resource.metadata.name }} ‘{{ event.type | capitalize }}’ with the message ‘{{ event.resource.data.message}}'"
此 playbook 演示了如何获取捕获事件中包含的属性。type 属性将显示“Added”,因为 playbook 仅在创建 ConfigMap 时才会执行。可以通过引用事件上的 resource 属性来访问 ConfigMap 对象本身。然后可以遍历 ConfigMap 的标准 Kubernetes 清单,例如命名空间、名称以及特定的数据值。
更新 k8s-eda-demo.yaml 文件中规则手册的内容,以调用新创建的 playbook,而不是简单地打印出内容,方法是使用如下所示的 run_playbook 操作
- name: Listen for newly added ConfigMap resources
hosts: all
sources:
- sabre1041.eda.k8s:
api_version: v1
kind: ConfigMap
namespace: default
rules:
- name: Execute Playbook
condition: event.type == "ADDED"
action:
run_playbook:
name: k8s-eda-demo-playbook.yaml
再次执行 k8s-eda-demo-playbook.yaml 规则手册以开始列出添加到默认命名空间的 ConfigMap。
ansible-rulebook -i inventory --rulebook k8s-eda-demo.yaml --verbose
删除并重新创建 ConfigMap 以触发 playbook。
kubectl delete configmap -n default eda-example
kubectl create configmap -n default eda-example --from-literal=message="Kubernetes Meets Event-Driven Ansible"
观察 playbook 已被触发并产生类似于以下内容的输出
TASK [ansible.builtin.debug] ***************************************************
ok: [localhost] => {
"msg": "ConfigMap in namespace 'default' with name 'eda-example ‘Added’ with the message ‘Kubernetes Meets Event-Driven Ansible'"
}
虽然此示例仅打印出与接收到的事件内容相关的简单消息,但它演示了如何利用 Kubernetes 集成启用的功能。通过将 Kuberentes 作为事件源并集成到事件驱动的 Ansible 生态系统中,它成为一个重要的集成,有助于支持利用 Kubernetes 来维护其业务关键组件并根据需要触发自动化的组织。