我有这个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]
访问第一个项目可以处理列表中的一个对象,但我不知道如何将其扩展到多个项目。我试过[*]
,但没有用。
7条答案
按热度按时间sqserrrh1#
kubectl wait
命令Kubernetes在
v1.11
版本中引入了kubectl wait
:CHANGELOG-1.11:
kubectl wait
是一个新命令,允许等待一个或多个资源被删除或达到特定条件。它添加了一个kubectl wait --for=[delete|condition=condition-name]
resource/string命令。CHANGELOG-1.13:
kubectl wait
现在支持使用--for condition=available=false
检查除true以外的条件值CHANGELOG-1.14:
kubectl wait
以使用更多类型的选择器。kubectl wait
命令现在支持--all
标志来选择指定资源类型的命名空间中的所有资源。它不是要等待 * 阶段 *,而是等待 * 条件 *。我认为等待条件比等待阶段更有自信。参见以下 * 条件 *:
*PodScheduled:Pod已调度到节点;
*Ready:Pod能够服务请求,需要加入所有匹配的Service的负载均衡池;
*初始化:所有init容器已成功启动;
*ContainersReady:舱里的所有容器都准备好了
在Ansible中使用
kubectl wait
假设您正在使用
kubeadm
+ Ansible自动安装Kubernetes,并且需要等待安装完成:结果示例:
sr4lhrrt2#
我会尝试这样的方法(对我有效):
您基本上是获取所有pod的所有状态并将它们组合到一个唯一的列表中,然后直到该列表为
["Running"]
时才完成。例如,如果您的所有pod都没有运行,您将获得类似["Running", "Starting"]
的内容。v6ylcynt3#
Ansible的community.kubernetes.k8s插件有一个内置的等待功能!
然而,这样做的问题是,不同的资源具有不同的
wait_condition
类型。如果你使用的是deployment
,那么如下所示,只要你设置了正确的超时界限,type: Complete
就可以正常工作,但是如果你在yaml中有不同的资源类型,比如serviceaccounts
,它很可能会挂起。qojgxg4l4#
您可以从kubernetes.core collection使用
kubernetes.core.k8s_info
例如,等待cert-manager在cert-manager命名空间中启动:
neskvpey5#
Kubernetes版本v1.23.0(changelog)增加了kubectl wait在任意JSON路径上等待的功能。
因此,现在似乎也可以使用kubectl wait来等待状态阶段。
等待pod“busybox1”包含状态阶段为“Running”:
您可以在ansible playbook任务中使用此命令:
jchrr9hc6#
一行shell命令可以执行以下操作:
它将等待最多3分钟,以使所有pod都在命名空间中运行。字段选择器用于忽略Succeeded(大写“S”很重要)的已完成pod。
fivyi3re7#
最后,我选择了https://stackoverflow.com/users/2989261/rico的答案,因为它看起来是最可靠的(
kubectl wait --for=confition=ready
在我的kubectl版本1.23.5中不可靠),并为我的所有pod添加了一个选择器(这是一个过滤已完成作业的好方法),如下所示: