【问题标题】:Ansible + Kubernetes: how to wait for a Job completionAnsible + Kubernetes:如何等待作业完成
【发布时间】:2019-08-09 16:23:50
【问题描述】:

提前感谢您花时间阅读本文。

我正在使用 Kubernetes 并使用 Ansible 与我的集群进行任何交互。拥有一些成功部署应用程序的剧本。

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

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

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

但是,不幸的是,默认情况下,相同的技巧不适用于 Kubernetes Jobs。模块简单地立即退出,在 ansible 模块中明确描述,这是真的:

对于没有实现的资源种类,wait 会立即返回,除非设置了 wait_condition。

为了涵盖这种情况,模块规范建议指定

wait_condition:
  reason: REASON
  type: TYPE
  status: STATUS

文档还说:

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

我检查了API规范,发现和in the following answer说的一样:

唯一的类型值是“完成”和“失败”,它们可能具有“真”或“假”状态

所以,我的QUESTION很简单:有没有人知道如何正确使用这个wait_condition?您是否已经尝试过(目前,它是相对较新的功能)?

任何想法在哪里看也很感激。

更新:

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

- 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

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

【问题讨论】:

    标签: kubernetes ansible


    【解决方案1】:

    (其他答案非常接近,我会编辑它们,但它说编辑队列已满。)Job Condition 中的状态是一个字符串。在 YAML 中,True 标签被解析为布尔类型,您需要引用它来获取字符串。就像在 Job 的 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。)

    【讨论】:

    • 非常感谢,马尔科!我会试一试,然后告诉你。
    • 终于,17 个月后,接受这篇文章作为答案。作品。非常感谢!太容易了……
    【解决方案2】:

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

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

    【讨论】:

    • 尝试了最新的 ansible 版本。结果是一样的,模块只是挂了。将在下一个版本后再次尝试,但现在由于某种原因它不能解决我的问题。不管怎样,谢谢你的回答。
    • 无法编辑,“建议编辑队列已满”,但我认为问题可能是状态不是布尔值,而是字符串。 wait_condition 应该是 status: "True",而不是 status: True。
    【解决方案3】:

    Kubernetes documentation 指定:

    当 pod 成功完成时,Job 会跟踪成功的 完成。当指定数量的成功完成是 到达,任务(即Job)完成。

    基于此和您已链接的 API specification - 我们可以假设当 Job 按照您的要求成功执行多次时,条件类型 Complete 将设置为 True

    因此:

    wait_condition:
      type: Complete
      status: True
    

    应该做“工作”。

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

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

    【讨论】:

    • 丹尼尔,非常感谢您抽出宝贵时间。也尝试过,但不幸的是,结果保持不变:没有错误消息,k8s 模块只是挂起。所以,它没有起到作用。
    【解决方案4】:

    我认为wait_condition 类型必须与您使用的资源类型相关,type: Complete 例如适用于部署,但当 serviceaccountstatefulset 在 yaml 中时会挂起。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-17
      • 2016-08-31
      • 2020-09-02
      • 1970-01-01
      • 2020-01-12
      • 1970-01-01
      • 1970-01-01
      • 2021-01-25
      相关资源
      最近更新 更多