如何kubectl等待crd创建?

时间:2019-07-19 15:32:51

标签: kubernetes azure-devops wait kubectl kubernetes-custom-resources

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

我们有一个Yaml文件,其中包含NATS群集ServiceAccountRoleClusterRoleBindingDeployment的定义。 Deployment中使用的映像创建了crd,第二个脚本使用该crd来部署一组pods。目前,我们的CI管道需要运行第二个脚本几次,仅在完全创建crd后才能成功完成。我尝试使用kubectl wait,但无法弄清楚要使用什么条件才能完成crd

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

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

2 个答案:

答案 0 :(得分:0)

CRD的条件为established

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

您可能要适当调整--timeout

答案 1 :(得分:0)

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

{ 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 进行了测试。