
Я установил кластер kubernetes (v1.20.0) с 3 мастерами и 3 узлами, используя kubeadm init
и kubeadm join
, все на Ubuntu 20.04. Теперь мне нужно обновить конфигурацию и
- Добавьте
--cloud-provider=external
флаг запуска kubelet на все узлы, которые я собираюсь использоватьvsphere-csi-драйвер - Изменить
--service-cidr
из-за сетевых требований
Однако я не совсем уверен, как правильно вносить эти изменения.
Кубелет
Глядя на /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
ссылку, можно увидеть /etc/default/kubelet
, но это считается крайней мерой и .NodeRegistration.KubeletExtraArgs
вместо этого рекомендуется обновить:
...
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/default/kubelet
...
Где это .NodeRegistration.KubeletExtraArgs
и как это изменить для всех узлов в кластере?
контрольная плоскость
Насколько я понимаю, apiserver и controller-manager запускаются как статические поды на каждом главном сервере и считывают их конфигурацию из /etc/kubernetes/manifests/kube-<type>.yaml
. Первой моей мыслью было внести необходимые изменения в эти файлы, однако, согласно документации Kubernetes наобновление кластера kubeadm, kubeadm будет:
* Fetches the kubeadm ClusterConfiguration from the cluster.
* Optionally backups the kube-apiserver certificate.
* Upgrades the static Pod manifests for the control plane components.
Поскольку я вручную изменил манифесты, они не обновляются в ClusterConfiguration ( kubectl -n kube-system get cm kubeadm-config -o yaml
), сохранятся ли мои изменения при обновлении таким образом? Я полагаю, что я мог бы также вручную редактировать ClusterConfiguration, kubeadm edit cm ...
но это, похоже, подвержено ошибкам, и легко забыть изменить его каждый раз.
Согласно документам, есть способнастроить конфигурацию плоскости управленияно это, кажется, только при первой установке кластера. Например, kubeadm config print init-defaults
как следует из названия, дайте мне только значения по умолчанию, а не то, что в данный момент запущено в кластере. Попытка извлечь ClusterConfiguration kubectl -n kube-system get cm kubeadm-config -o yaml
и запустить его kubeadm init --config <config>
терпит неудачу во всех отношениях, потому что кластер уже инициализирован.
Kubeadm может работатьфаза инициализации плоскости управлениякоторый обновляет статические манифесты модуля, но оставляет ClusterConfiguration нетронутым, поэтому мне нужно будет upload-config
также запустить эту фазу.
Исходя из вышеизложенного, рабочий процесс выглядит следующим образом:
- Извлеките ClusterConfiguration из
kubeadm -n kube-system get cm kubeadm-config
файла yaml и сохраните его в нем. - Измените файл yaml, внеся необходимые изменения.
- Применить изменения с помощью
kubeadm init phase control-plane all --config <yaml>
- Загрузить измененную конфигурацию
kubeadm init phase upload-config all --config <yaml>
- Распространите измененный файл yaml на все главные серверы.
- Для каждого мастера подайте заявку с
kubeadm init phase control-plane all --config <yaml>
Меня беспокоит здесь очевидная нестыковка между статическими манифестами pod и ClusterConfiguration. Изменения вносятся нечасто, поэтому легко забыть, что изменение в одном месте также требует изменений в другом — вручную.
Нет ли способа обновить настройки kubelet и control-plane, которые обеспечивают согласованность между компонентами kubernetes и kubeadm? Я все еще новичок в Kubernetes, и естьмногодокументации по этому поводу, поэтому извините, если я упустил что-то очевидное.
решение1
Я постараюсь ответить на оба ваших вопроса.
1. Добавьте флаг запуска kubelet --cloud-provider=external на все узлы.
Где находится этот .NodeRegistration.KubeletExtraArgs и как его изменить для всех узлов в кластере?
KubeletExtraArgs
любые аргументы и параметры, поддерживаемые kubelet. Они документированыздесь. Вам нужно использовать kubelet
команду с правильными флагами, чтобы изменить ее. Также обратите внимание, что флаг, который вы собираетесь использовать, будет удален в k8s v1.23:
--cloud-provider string
Поставщик облачных сервисов. Установите пустую строку для работы без облачного провайдера. Если установлено, облачный провайдер определяет имя узла (см. документацию облачного провайдера, чтобы определить, используется ли имя хоста и как). (УСТАРЕЛО: будет удалено в 1.23 в пользу удаления кода облачного провайдера из Kubelet.)
РЕДАКТИРОВАТЬ:
Для лучшего ответа на ваш вопрос относительно:.NodeRegistration.KubeletExtraArgs
Это также элементыфайл конфигурации инициализации kubeadm:
Можно настроить
kubeadm init
с помощью файла конфигурации вместо флагов командной строки, а некоторые более продвинутые функции могут быть доступны только как параметры файла конфигурации. Этот файл передается с помощью флага--config
и должен содержатьClusterConfiguration
структуру и, возможно, больше структур, разделенных флагами---\n
Смешивание--config
с другими может быть недопустимо в некоторых случаях.
Вы также можете найти более подробную информацию оNodeRegistrationOptionsа также более подробную информацию о полях и использовании конфигурации.
Также обратите внимание, что:
KubeletExtraArgs
передает дополнительные аргументы в kubelet. Аргументы здесь передаются в командную строку kubelet через файл окруженияkubeadm записывает во время выполнения для kubelet в источник. Это переопределяет общую конфигурацию базового уровня в kubelet-config-1.X
ConfigMap
Флаги имеют более высокий приоритет при разборе. Эти значения являются локальными и специфичными для узла, на котором выполняется kubeadm.
ПРАВКА2:
kubeadm init
предполагается использовать только один раз при создании кластера, когда вы используете его с флагами или файлом конфигурации. Вы не можете изменить конфигурации, выполнив его снова с другими значениями.Здесьвы найдете информацию о kubeadm и его использовании. После настройки кластера kubeadm следует удалить, а изменения следует вносить непосредственно в статические манифесты пода.
2. Измените --service-cidr в соответствии с требованиями сети.
Это сложнее. Вы можете попробовать сделать это аналогичноздесьилиздесьОднако такой подход чреват ошибками и не рекомендуется к использованию.
Более осуществимым и безопасным способом было бы просто пересоздать кластер с помощью kubeadm reset
и kubeadm init --service-cidr
. Возможность автоматического изменения CIDR даже не ожидалась с точки зрения Kubernetes. Короче говоря,сброс kubeadmэто путь сюда.
решение2
В отношении
Я понимаю, что KubletExtraArgs относится к аргументам командной строки kubelet, но я не понимаю, где находится этот атрибут и как его изменить.
несколько источников, таких какВот этотуказать на добавление к
/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
такие строки как например
Environment="KUBELET_EXTRA_ARGS=--pod-manifest-path=/etc/kubelet.d/"
чтобы задать среду для пользовательского каталога для статических модулей здесь, например, вместо использования cli с
kubelet --pod-manifest-path=/etc/kubelet.d
как указано в документах.
Если вы поищете в Google, то $KUBELET_EXTRA_ARGS
найдете множество примеров по вышеупомянутому 10-kubeadm.conf
файлу.