需要在同一部署的 pod 上有一个部署后任务

时间:2021-01-28 08:59:38

标签: kubernetes ansible kubernetes-pod

我正在编写使用 Kubernetes 部署服务的 ansible 脚本,但我坚持执行部署后流程的步骤:

我已经部署了一个具有“副本:3”的服务,现在所有副本都已启动并正在运行,我的问题是我必须进行迁移,为此我必须进入容器并运行已经存在的脚本。

我可以通过单独进入容器然后运行脚本来手动完成,但这将再次需要手动干预。

我想要实现的是,一旦部署完成并且所有副本都已启动并正在运行,我想通过进入容器来运行脚本,所有这些步骤都应由 ansible 脚本执行,无需手动操作。< /p>

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

看看 k8s_exec 模块。

- name: Check RC status of command executed
  community.kubernetes.k8s_exec:
    namespace: myproject
    pod: busybox-test
    command: cmd_with_non_zero_exit_code
  register: command_status
  ignore_errors: True

- name: Check last command status
  debug:
    msg: "cmd failed"
  when: command_status.return_code != 0

答案 1 :(得分:0)

@Vasili Angapov 是对的 - k8s_exec 模块可能是这种情况下的最佳解决方案,但我想添加一些有用的注释。


要使用 k8s_exec,我们需要知道确切的 Pod 名称(我们需要在 ansible 任务中将其作为 pod 参数传递)。正如您所写,我假设您的 PodsDeployment 管理,因此每个 Pod 的名称中都有由 ReplicaSet 添加的随机字符串。因此,您必须以某种方式找到 Pods 的全名。

我创建了一个简单的剧本来说明我们如何为所有带有标签的 Pod 找到 Pods 名称:app=web,然后在这些 touch file123456789 上运行示例 Pods 命令.

---
- hosts: localhost
  collections:
    - community.kubernetes

  tasks:     
    - name: "Search for all Pods labelled app=web"
      k8s_info:
        kind: Pod
        label_selectors:
          - app = web
      register: pod_names

    - name: "Get Pod names"
      set_fact:
        pod_names: "{{ pod_names | json_query('resources[*].metadata.name') }}"

    - name: "Run command on every Pod labelled app=web"
      k8s_exec:
        namespace: default
        pod: "{{ item }}"
        command: touch file123456789
      with_items: "{{ pod_names }}"

注意:您也可以使用 k8s_exec 模块代替 command 模块。 在我们的示例中,我们可以有:

而不是 k8s_exec 任务
- name: "Run command on every Pod labelled app=web"
  command: >
    kubectl exec "{{ item }}" -n default -- touch file123456789
  with_items: "{{ pod_names }}"