Kubernetes kubectl同步创建/应用,直到创建每个对象

Kubernetes kubectl同步创建/应用,直到创建每个对象,kubernetes,kubectl,Kubernetes,Kubectl,我有以下yaml文件,其中创建了一个kubernetes CRD和一个自定义资源,作为该CRD的实例 apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: mycrds.example.com spec: group: example.com version: v1 names: kind: MyCrd plural: mycrds s

我有以下yaml文件,其中创建了一个kubernetes CRD和一个自定义资源,作为该CRD的实例

apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: mycrds.example.com
spec:
  group: example.com
  version: v1
  names:
    kind: MyCrd
    plural: mycrds
    singular: mycrd
  scope: Namespaced
---
apiVersion: example.com/v1
kind: MyCrd
metadata:
  name: example-instance
  namespace: default
spec:
  selectors:
    cluster:
      matchName:
        - '*'
如果我对该文件执行
kubectl apply
kubectl create
,我有时会收到一个错误,即
版本“example.com/v1”
中的类型“MyCrd”不匹配,因为CRD注册尚未完成。这种情况并不总是发生

错误消息示例:

$ kubectl apply -f crd-and-instance.yaml
customresourcedefinition.apiextensions.k8s.io/mycrds.example.com created
error: unable to recognize "/home/psankar/Downloads/crd-and-instance.yaml": no matches for kind "MyCrd" in version "example.com/v1"

$ # Same command executed after 2-3 seconds

$ kubectl apply -f crd-and-instance.yaml
customresourcedefinition.apiextensions.k8s.io/mycrds.example.com unchanged
mycrd.example.com/example-instance created
这种情况并不总是发生。有时,CRD注册速度很快,而kubectl create/apply命令在第一次尝试时工作良好

我知道我可以通过shell脚本实现这一点,如:

kubectl create crd.yaml
kubectl wait until crd is published
kubectl create crdInstance.yaml

但是我不想这样做,我想要一个没有任何附带shell脚本的yaml文件。这可能吗?

kubectl apply-f
只是对k8s API服务器的API调用,它在k8s etcd存储中创建了一个资源。它既不保证实际创建了所需的资源,也不检查其状态。由于缺少外部依赖项、进入崩溃循环等原因,资源可能会卡在转出中

为了使序列同步工作,您需要注入某种健康检查(例如,查询所创建资源的HTTP端点)。另一种方法是延迟创建,在调用之间加入
sleep X
秒,让k8s完成创建。当然,这不会检查资源是否实际创建或失败