Я установил кластер 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-
. Моя первая мысль заключалась в том, чтобы внести необходимые изменения в эти файлы, однако, согласно документации 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
.
Исходя из вышеизложенного, рабочий процесс выглядит следующим образом:
kubeadm -n kube-system, получите cm kubeadm-config
и сохраните его в файл yaml kubeadm init phase control-plane all --config
kubeadm init phase upload-config all --config
kubeadm init phase control-plane all --config
Меня беспокоит очевидное отключение между манифестами статических модулей и ClusterConfiguration. Изменения вносятся не так часто, поэтому довольно легко забыть, что изменение в одном месте также требует изменений в другом - вручную.
Нет ли способа обновить настройки kubelet и уровня управления, которые обеспечивали бы согласованность между компонентами kubernetes и kubeadm? Я все еще новичок в Kubernetes, и вокруг него много документации, так что извините, если я упустил что-то очевидное.
Я постараюсь ответить на оба ваших вопроса.
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 .
Что касается
, я понимаю, что 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
.