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

Я установил кластер kubernetes (v1.20.0) с 3 мастерами и 3 узлами, используя kubeadm init и kubeadm join , все на Ubuntu 20.04. Теперь мне нужно обновить конфигурацию и

  • Добавить - cloud-provider = external флаг запуска kubelet на всех узлах, поскольку я собираюсь использовать vsphere-csi-driver
  • Изменить - service-cidr из-за требований сети

Однако я не совсем уверен, как правильно вносить эти изменения.

Kubelet

При просмотре /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 и как изменить его для всех узлов в кластере?

control-plane

Насколько я понимаю, apiserver и controller-manager запускаются как статические модули на каждом мастере и считывают их конфигурацию из / etc / kubernetes / manifest / kube- .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 получить cm kubeadm-config -o yaml и запустить kubeadm init --config полностью завершилась неудачно вроде способов, потому что кластер уже инициализирован.

Kubeadm может запускать плоскость управления фазой инициализации , которая обновляет статические манифесты модулей, но оставляет нетронутой конфигурацию ClusterConfiguration, поэтому мне также потребуется выполнить фазу upload-config .

Исходя из вышеизложенного, рабочий процесс выглядит следующим образом:

  • Извлеките ClusterConfiguration из kubeadm -n kube-system, получите cm kubeadm-config и сохраните его в файл yaml
  • Измените yaml файл со всеми необходимыми изменениями
  • Применить изменения с помощью kubeadm init phase control-plane all --config
  • Загрузить измененный конфиг kubeadm init phase upload-config all --config
  • Разослать измененный файл yaml всем мастерам
  • Для каждого мастера применить с kubeadm init phase control-plane all --config

Меня беспокоит очевидное отключение между манифестами статических модулей и ClusterConfiguration. Изменения вносятся не так часто, поэтому довольно легко забыть, что изменение в одном месте также требует изменений в другом - вручную.

Нет ли способа обновить настройки kubelet и уровня управления, которые обеспечивали бы согласованность между компонентами kubernetes и kubeadm? Я все еще новичок в Kubernetes, и вокруг него много документации, так что извините, если я упустил что-то очевидное.

2
задан 12 January 2021 в 14:32
2 ответа

Я постараюсь ответить на оба ваших вопроса.


1. Добавьте --cloud-provider = external флаг запуска kubelet на всех узлах

Где находится этот .NodeRegistration.KubeletExtraArgs и как мне изменить его для всех узлов в кластере?

KubeletExtraArgs любые аргументы и параметры, поддерживаемые kubelet. Они задокументированы здесь . Вам нужно использовать команду kubelet с соответствующими флагами, чтобы изменить ее. Также обратите внимание, что флаг, который вы собираетесь использовать, будет удален в k8s v1.23:

- строка поставщика облачных услуг Поставщик облачных услуг. Установите в пустую строку для работы без облачного провайдера. Если установлено, поставщик облачных определяет имя узла (обратитесь к документации поставщика облачных услуг , чтобы определить, используется ли имя хоста и как). (УСТАРЕЛО: будет удалено в 1.23, в пользу удаления кода облачного провайдера из Kubelet.)

РЕДАКТИРОВАТЬ:

Чтобы лучше ответить на ваш вопрос относительно: .NodeRegistration.KubeletExtraArgs

Это также элементы файл конфигурации kubeadm init :

Можно настроить kubeadm init с помощью файла конфигурации вместо флагов командной строки, а некоторые дополнительные функции могут {{1} } доступны только как параметры файла конфигурации. Этот файл передается с использованием флага - 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 reset .

0
ответ дан 24 April 2021 в 00:23

Что касается

, я понимаю, что 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

, как это предлагается в документах.

Если вы погуглите $KUBELET_EXTRA_ARGS, вы найдете много примеров относительно вышеупомянутого файла 10-kubeadm.conf.

0
ответ дан 23 September 2021 в 17:03

Теги

Похожие вопросы