Kubernetes: укажите контекст кластера в команде apply

#kubernetes #config

#kubernetes #конфигурация

Вопрос:

У меня несколько кластеров kubernetes, и я хочу убедиться, что при kubectl apply развертывании я ориентируюсь на правильный кластер.

У меня все мои кластеры настроены в контекстах в корневом /.kube/config файле, но я не хочу полагаться на переключение текущего контекста на правильный перед запуском каждой apply команды.

т. е. это неудовлетворительно

 kubectl config use-context cluster-1-context
kubectl apply ./deploy-to-cluster-1.yml

kubectl config use-context cluster-2-context
kubectl apply ./deploy-to-cluster-2.yml
  

Я прочитал документы по конфигурации для нескольких кластеров, и единственный способ, который я могу найти для этого, — скопировать / вставить конфигурацию для конкретного кластера в пользовательский конфигурационный файл и указать это с помощью --kubeconfig опции в apply команде.

 kubectl apply ./deploy-to-cluster-1.yml --kubeconfig ./config-cluster-1
kubectl apply ./deploy-to-cluster-2.yml --kubeconfig ./config-cluster-2
  

Это работает, но кажется действительно громоздким.

Для такого распространенного требования я бы ожидал, что в apply или, возможно, даже в поле deployment будет простая опция yml или, возможно, даже поле в deployment, которое позволяет указать (или ограничить) развертывание конкретным контекстом / именем кластера, но я прочитал много соответствующей документации и не могу найти ни одной такой опции.

Есть ли лучший способ сделать это?

Ответ №1:

Кажется, есть --context=... опция.

 kubectl options

The following options can be passed to any command:
...
      --context='': The name of the kubeconfig context to use
  

по крайней мере, в версии v1.18.6

Ответ №2:

kubectl принимает --context параметр:

 kubectl --context cluster-1-context apply -f ./deploy-to-cluster-1.yml
  

Нет способа указать или принудительно применить это в файлах ресурсов YAML; все еще возможны несчастные случаи.

Если у вас несколько .kube/config файлов, вы также можете установить $KUBECONFIG переменная окружения указывала на один из них. Это понимают стандартные пакеты SDK Kubernetes, поэтому почти все инструменты должны его поддерживать.

 export KUBECONFIG=./cluster-1-config.yml
kubectly apply -f ./deploy-to-cluster-1.yml
  

(Учитывая выбор, я бы предпочел этот подход, потому что переменные среды являются локальными для оболочки, но kubectl config current-context будут влиять на все мои открытые окна терминала. Однако стандартный инструментарий, который настраивает .kube/config файл, по умолчанию использует один общий глобальный файл, и разделить его может быть немного сложнее.)

Ответ №3:

Есть ли лучший способ сделать это?

Вы можете использовать инструмент kubectx для переключения между контекстами взад и вперед гораздо более простым способом, чем kubectl.

 USAGE:
  kubectx                   : list the contexts
  kubectx <NAME>            : switch to context <NAME>
  kubectx -                 : switch to the previous context
  kubectx -c, --current     : show the current context name
  kubectx <NEW_NAME>=<NAME> : rename context <NAME> to <NEW_NAME>
  kubectx <NEW_NAME>=.      : rename current-context to <NEW_NAME>
  kubectx -d <NAME>         : delete context <NAME> ('.' for current-context)
                              (this command won't delete the user/cluster entry
                              that is used by the context)
  kubectx -u, --unset       : unset the current context

$ kubectx minikube
Switched to context "minikube".

$ kubectx -
Switched to context "oregon".

$ kubectx -
Switched to context "minikube".

$ kubectx dublin=gke_ahmetb_europe-west1-b_dublin
Context "dublin" set.
Aliased "gke_ahmetb_europe-west1-b_dublin" as "dublin".
  

Как известно, на сегодняшний день нет способа указать контекст как часть развертывания yaml. Для этого вы можете отправить запрос функции в репозиторий kubernetes GitHub.

Комментарии:

1. Спасибо, полезно знать об этом kubectx , но проблема не в синтаксисе kubectl config use-context , а в его характере с сохранением состояния. Мне нужен контекст, определенный встроенным в apply команде — он должен быть атомарным.