我有这个ansible(工作)剧本,查看kubectl get pods -o json
的输出,直到pod处于Running
状态。现在我想将它扩展到多个pod。核心问题是kubectl查询的json结果是一个列表,我知道如何访问第一个项目,但不是所有项目...
- name: wait for pods to come up
shell: kubectl get pods -o json
register: kubectl_get_pods
until: kubectl_get_pods.stdout|from_json|json_query('items[0].status.phase') == "Running"
retries: 20
json对象看起来像,
[ { ... "status": { "phase": "Running" } },
{ ... "status": { "phase": "Running" } },
...
]
使用[0]
访问第一个用于处理列表中一个对象的项目,但我无法弄清楚如何将它扩展到多个项目。我试过[*]
哪个不起作用。
我会尝试这样的东西(适合我):
tasks:
- name: wait for pods to come up
shell: kubectl get pods -o json
register: kubectl_get_pods
until: kubectl_get_pods.stdout|from_json|json_query('items[*].status.phase')|unique == ["Running"]
您基本上获得了所有pod的所有状态,并将它们组合成一个唯一的列表,然后在该列表为["Running"]
之前不会完成。例如,如果你的所有pod都没有运行,你会得到类似["Running", "Starting"]
的东西。
kubectl wait
命令Kubernetes在kubectl wait
版本中介绍了v1.11
:
kubectl wait
是一个新命令,允许等待删除一个或多个资源或达到特定条件。它添加了一个kubectl wait --for=[delete|condition=condition-name]
资源/字符串命令。
kubectl wait
现在使用--for condition=available=false
支持除true之外的条件值检查
- 扩大
kubectl wait
以适应更多类型的选择器。kubectl wait
命令现在支持--all
标志,以选择指定资源类型的命名空间中的所有资源。
它不是要等待阶段,而是等待条件。我认为等待条件比等待阶段更有说服力。请参阅以下conditions:
- PodScheduled:Pod已被安排到一个节点;
- 就绪:Pod可以处理请求,应该添加到所有匹配服务的负载平衡池中;
- 已初始化:所有init容器已成功启动;
- ContainersReady:Pod中的所有容器都已准备就绪。
kubectl wait
和Ansible假设您使用kubeadm
+ Ansible自动执行Kubernetes安装,并需要等待安装完成:
- name: Wait for all control-plane pods become created
shell: "kubectl get po --namespace=kube-system --selector tier=control-plane --output=jsonpath='{.items[*].metadata.name}'"
register: control_plane_pods_created
until: item in control_plane_pods_created.stdout
retries: 10
delay: 30
with_items:
- etcd
- kube-apiserver
- kube-controller-manager
- kube-scheduler
- name: Wait for control-plane pods become ready
shell: "kubectl wait --namespace=kube-system --for=condition=Ready pods --selector tier=control-plane --timeout=600s"
register: control_plane_pods_ready
- debug: var=control_plane_pods_ready.stdout_lines
结果示例:
TASK [Wait for all control-plane pods become created] ******************************
FAILED - RETRYING: Wait all control-plane pods become created (10 retries left).
FAILED - RETRYING: Wait all control-plane pods become created (9 retries left).
FAILED - RETRYING: Wait all control-plane pods become created (8 retries left).
changed: [localhost -> localhost] => (item=etcd)
changed: [localhost -> localhost] => (item=kube-apiserver)
changed: [localhost -> localhost] => (item=kube-controller-manager)
changed: [localhost -> localhost] => (item=kube-scheduler)
TASK [Wait for control-plane pods become ready] ********************************
changed: [localhost -> localhost]
TASK [debug] *******************************************************************
ok: [localhost] => {
"control_plane_pods_ready.stdout_lines": [
"pod/etcd-localhost.localdomain condition met",
"pod/kube-apiserver-localhost.localdomain condition met",
"pod/kube-controller-manager-localhost.localdomain condition met",
"pod/kube-scheduler-localhost.localdomain condition met"
]
}