#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
команде — он должен быть атомарным.