【问题标题】:Need to a have a post deployment task on the pod of same deployment需要在同一部署的 pod 上进行部署后任务
【发布时间】:2021-01-29 17:33:41
【问题描述】:

我正在编写使用 Kubernetes 部署服务的 ansible 脚本,但我遇到了一个用于部署后流程的步骤:

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

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

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

有没有办法做到这一点?

【问题讨论】:

    标签: kubernetes ansible kubernetes-pod


    【解决方案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
    

    【讨论】:

      【解决方案2】:

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


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

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

      ---
      - 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 }}"
      

      【讨论】:

      • @matt_i,感谢您的解决方案,因为这正是我所需要的。
      • @Anuj Kishor 很高兴听到这个消息。考虑接受答案,因为它解决了您的问题。这样一来,对于社区的其他人来说,它会更加清晰可见。
      • @matt_i 确实解决方案很好,只是pod下的运行命令抛出错误,我相信是我的环境问题,你知道错误的原因:failed: [localhost] (item=afroaves-app-5dcf4bbfd9-jwdjg) => {"ansible_loop_var": "item", "changed": false, "item": "afroaves-app-5dcf4bbfd9-jwdjg", "msg": "Failed to execute on pod afroaves-app-5dcf4bbfd9-jwdjg due to : (0)\nReason: failed CONNECT via proxy status: 403\n"}我能通过 kubectl 命令运行它
      • @Anuj Kishor 您的错误可能是由您连接到集群的方式引起的。您可以使用command 模块代替k8s_exec 模块(command 模块不应导致此类错误)。我更新了我的答案,使其更笼统。
      猜你喜欢
      • 2021-03-25
      • 2023-04-03
      • 2013-04-16
      • 1970-01-01
      • 2018-07-22
      • 1970-01-01
      • 1970-01-01
      • 2017-01-27
      • 1970-01-01
      相关资源
      最近更新 更多