11

kubectl在运行脚本之前,仅使用命令行检查自定义资源定义是否存在的最佳方法是什么?

我们有一个 yaml 文件,其中包含 NATS 集群ServiceAccountRole和. 中使用的图像创建,第二个脚本使用它来部署一组. 目前,我们的 CI 管道需要运行几次第二个脚本,只有在完全创建后才能成功完成。我尝试使用但无法弄清楚使用什么条件来完成 a 。ClusterRoleBindingDeploymentDeploymentcrdcrdpodscrdkubectl waitcrd

下面是我最近的尝试,尽管完全错误,但这说明了我们想要的一般顺序。

kubectl wait --for=condition=complete kubectl apply -f 1.nats-cluster-operator.yaml kubectl apply -f 2.nats-cluster.yaml

4

2 回答 2

14

CRD 的条件是established

kubectl -n <namespace-here> wait --for condition=established --timeout=60s crd/<crd-name-here>

您可能需要--timeout适当调整。

于 2019-07-20T16:15:30.473 回答
1

如果你想等待一个可能还不存在的资源,你可以尝试这样的事情:

{ grep -q -m 1 "crontabs.stable.example.com"; kill $!; } < <(kubectl get crd -w)

或者

{ sed -n /crontabs.stable.example.com/q; kill $!; } < <(kubectl get crd -w)

我理解这个问题更愿意只使用kubectl,但是这个答案对我来说有帮助。这种方法的缺点是必须以不同的方式设置超时,并且条件本身并没有被实际检查。

为了更彻底地检查情况,我做了以下工作:

#!/bin/bash

condition-established() {
    local name="crontabs.stable.example.com"
    local condition="Established"

    jq --arg NAME $name --arg CONDITION $condition -n \
        'first(inputs | if (.metadata.name==$NAME) and (.status.conditions[]?.type==$CONDITION) then
            null | halt_error else empty end)' 

    # This is similar to the first, but the full condition is sent to stdout
    #jq --arg NAME $name --arg CONDITION $condition -n \
    #    'first(inputs | if (.metadata.name==$NAME) and (.status.conditions[]?.type==$CONDITION) then
    #        .status.conditions[] | select(.type==$CONDITION) else empty end)' 
}

{ condition-established; kill $!; } < <(kubectl get crd -w -o json)

echo Complete

要解释发生了什么,$!指的是 bash 的进程替换运行的命令。我不确定这在其他 shell 中效果如何。

我使用kubernetes 官方文档中的CRD进行了测试。

于 2021-05-19T21:27:49.177 回答