Как правильно изменить конфигурацию kubelet и плоскости управления с помощью kubeadm?

Как правильно изменить конфигурацию kubelet и плоскости управления с помощью kubeadm?

Я установил кластер 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файлу.

Связанный контент