kubectl создавать / применять синхронно, пока не создан каждый объект - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть следующий файл yaml, где я создаю CRD kubernetes и пользовательский ресурс в качестве экземпляра этого 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 для этого файла Иногда я получаю сообщение об ошибке 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 отлично работает с первой попытки.

Я знаю, что могу добиться этого с помощью сценария оболочки, например:

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

Но я не хочу делать это и хочу один файл yaml без сопровождающего скрипта. Это возможно?

1 Ответ

1 голос
/ 17 апреля 2020

kubectl apply -f - это просто вызов API для api-сервера k8s, который создает ресурс в хранилище k8s etcd. Это не гарантирует, что требуемый ресурс действительно создан, и не проверяет его статус. Ресурс может застрять в развертывании из-за отсутствия внешних зависимостей, получить в cra sh l oop et c.

Для того, чтобы последовательность работала синхронно, вам нужно ввести какой-то вид проверка работоспособности (например, запрос HTTP-конечной точки созданного ресурса). Другой подход заключается в том, чтобы просто отложить создание, включив sleep X секунд между вызовами, чтобы k8s завершил создание. Конечно, это не будет проверять, был ли ресурс действительно создан или вышел из строя.

...