【问题标题】:kubectl create / apply synchronously until each object is createdkubectl create / apply 同步直到创建每个对象
【发布时间】:2021-01-08 13:51:45
【问题描述】:

我有以下 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 applykubectl create,有时我会收到no matches for kind "MyCrd" in version "example.com/v1" 的错误,因为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 文件。这可能吗?

【问题讨论】:

    标签: kubernetes kubectl


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-05-02
      • 2019-03-01
      • 2019-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多