Ansible + Kubernetes:如何等待作业完成

时间:2019-08-09 16:23:50

标签: kubernetes ansible

预先感谢您花费的时间阅读本文。

我正在玩Kubernetes,并使用Ansible与集群进行任何交互。有一些能成功部署应用程序的手册。

我用于部署的主要ansible组件是k8s,它允许我应用yaml配置。

我可以成功等待直到使用完成部署

k8s:
    state: present
    definition: config.yaml
    wait: yes
    wait_timeout: 10

但是,不幸的是,默认情况下,相同的技巧在Kubernetes Jobs中不起作用。该模块会立即退出,这在ansible模块中已明确说明,这是真的:

  

对于没有实现的资源类型,除非设置了wait_condition,否则wait将立即返回。

为解决这种情况,模块规范建议指定

wait_condition:
  reason: REASON
  type: TYPE
  status: STATUS

医生还说:

  

条件的可能类型特定于Kubernetes中的每种资源类型。请参阅给定资源的状态字段的API文档,以查看可能的选择。

我检查了API规范,发现与声明的in the following answer相同:

  

唯一的类型值是“ Complete”和“ Failed”,并且它们可能具有“ True”或“ False”状态

因此,我的问题很简单:是否有人知道如何正确使用此等待条件?您是否已经尝试过(到目前为止,它是一个相对较新的功能)?

任何在哪里看的想法都将受到赞赏。

更新:

这是我现在使用的一种解决方法:

- name: Run Job
  k8s:
   state: present
   definition: job_definition.yml

- name: Wait Until Job Is Done
  k8s_facts:
    name: job_name
    kind: Job
  register: job_status
  until: job_status.resources[0].status.active != 1
  retries: 10
  delay: 10
  ignore_errors: yes

- name: Get Final Job Status
  k8s_facts:
    name: job_name
    kind: Job
  register: job_status

- fail:
    msg: "Job Has Been Failed!"
  when: job_status.resources[0].status.failed == 1

但是直接使用适当的模块功能会更好。

4 个答案:

答案 0 :(得分:5)

(其他答案非常接近,我会编辑它们,但它说编辑队列已满。)Job Condition 中的状态是一个字符串。在 YAML 中,True 标记被解析为布尔类型,您需要引用它来获取字符串。就像在作业的 YAML 输出中一样:

$ kubectl -n demo get job jobname -o yaml
apiVersion: batch/v1
kind: Job
metadata: ...
spec: ...
status:
  completionTime: "2021-01-19T16:24:47Z"
  conditions:
  - lastProbeTime: "2021-01-19T16:24:47Z"
    lastTransitionTime: "2021-01-19T16:24:47Z"
    status: "True"
    type: Complete
  startTime: "2021-01-19T16:24:46Z"
  succeeded: 1

因此要完成,您需要引用 wait_condition 中的状态。

  k8s:
    wait: yes
    wait_condition:
      type: Complete
      status: "True"

wait 参数需要布尔值,在 YAML 中 yes 是一个字符串,但 Ansible 接受更多值到 boolean parameters。)

答案 1 :(得分:1)

wait_condition适用于我的工作,只要根据您的工作平均时间流程正确设置了超时/类型/状态:

        wait: yes
        wait_timeout: 300
        wait_condition:
          type: Complete
          status: True

答案 2 :(得分:0)

Kubernetes documentation指定:

  

成功完成广告连播后,工作将跟踪成功   完成。当指定的成功完成次数是   到达时,任务(即Job)就完成了。

基于此,以及您已经链接的API specification-我们可以假设Job成功执行了您要求的多次操作后,其条件类型Complete设置为True的情况。

因此:

wait_condition:
  type: Complete
  status: True

应该做“工作”。

k8s plugin code中所述,未指定原因时将忽略该原因。

我没有测试。仅基于代码和文档,因此,如果您可以确认它是否有效,那就太好了。

答案 3 :(得分:0)

我相信 wait_condition 类型必须与您使用的资源类型相关 type: Complete 例如适用于部署但在 serviceaccountstatefulset 处于yaml。