3.9.16.3.5.1 Установка kubernetes с использованием контейнерного движка containerd без доступа в Интернет
Предварительные условия
Требования к среде развертывания
Входные данные
Развертывание Docker Registry
Настройка сети
Установка docker
Список необходимых образов
Настройка и запуск локального registry
Загрузка образов из сети Интернет
Загрузка образов из архива
Запуск локального registry
Настройка управляющего узла (control plane)
Настройка рабочих нод
Подключение рабочих нод к кластеру
Окружение
- Версия ОС: 8
- Конфигурация ОС: Рабочая станция, Сервер графический, Сервер минимальный
- Редакция ОС: Все
- Архитектура: x86_64
- Версия ПО: kubernetes1.36-1.36.2-1, kubernetes1.36-kubeadm-1.36.2-1, docker-ce-29.5.3-1
Предварительные условия
Требования к среде развертывания
К узлам в среде развертывания kubernetes предъявляются следующие минимальные требования:
-
4 ГБ оперативной памяти;
-
2 процессорных ядра;
-
5 ГБ свободного дискового пространства;
-
сетевая связанность между узлами (управляющий узел должен иметь возможность соединения с рабочими узлами);
-
уникальное имя узла (hostname) и MAC-адрес для каждого узла;
-
открытые порты для планируемых к запуску сервисов, например:
-
порт 80 — для обработки HTTP-запросов;
-
порт 6443 — основной порт для взаимодействия с kube-apiserver;
-
порт 5000 — для обеспечения сетевого взаимодействия внутри кластера.
-
слой контейнеризации (docker).
Входные данные
В рамках рассматриваемого далее примера развертывания программной платформы kubernetes предполагается, что в работе используется три машины:
-
registry – для размещения локального хранилища образов с присвоенным статическим IP-адресом
10.0.2.20, -
control-plane – управляющий узел с присвоенным статическим IP-адресом
10.0.2.16, -
work-node – рабочая нода с присвоенным статическим IP-адресом
10.0.2.17,
которые располагаются в закрытой сети 10.0.2.0/24.
Указанные IP-адреса необходимо заменить на фактически используемые значения в сети.
Развертывание Docker Registry
Настройка сети
Измените имя хоста:
hostnamectl set-hostname registry
В файл /etc/hosts внесите данные о registry:
nano /etc/hosts
10.0.2.20 registry
Установка docker
Для установки docker выполните команду:
dnf install docker-ce
Запустите службу docker и добавьте ее в автозагрузку командой:
systemctl enable --now docker
В файле конфигурации демона docker необходимо указать, что с созданным хранилищем можно взаимодействовать:
nano /etc/docker/daemon.json
{
"insecure-registries": ["10.0.2.20:5000"],
"log-driver": "journald",
"live-restore": true,
"icc": false,
"disable-validation": true
}
где:
-
10.0.2.20– IP-адрес хоста с локальным regisrty (настраиваемый хост); -
5000– порт для подключения к локальному regisrty (по умолчанию).
Для сохранения настройки перезапустите службу docker:
systemctl daemon-reload systemctl restart docker
Список необходимых образов
Для развертывания кластера Kubernetes в закрытой сети (без доступа в Интернет) необходимо подготовить следующие образы:
-
registry.red-soft.ru/ubi8/registry:latest;
-
registry.red-soft.ru/k8s8/kube-apiserver:v1.36.2;
-
registry.red-soft.ru/k8s8/kube-controller-manager:v1.36.2;
-
registry.red-soft.ru/k8s8/kube-scheduler:v1.36.2;
-
registry.red-soft.ru/k8s8/kube-proxy:v1.36.2;
-
registry.red-soft.ru/k8s8/coredns:v1.14.2;
-
registry.red-soft.ru/k8s8/pause:3.10.2;
-
registry.red-soft.ru/k8s8/etcd:3.6.8-0;
-
registry.red-soft.ru/k8s8/flannel-cni-plugin-flannel:latest;
-
registry.red-soft.ru/k8s8/flannel-flanneld:latest.
В списке приведены образы, применимые к Kubernetes версии 1.36.2. Для проверки поддерживаемых образов для других версий Kubernetes ПЕРЕД загрузкой образов в локальный registry на master-ноде после выполнения шага 7 — «Установка необходимых пакетов» выполните команду:
kubeadm config images list --kubernetes-version=v1.36.2
где вместо v1.36.2 необходимо указать установленную (используемую) версию Kubernetes.
Настройка и запуск локального registry
Для дальнейшей настройки локального хранилища необходимые образы должны быть предварительно загружены и доступны при вызове команды docker images.
Загрузка образов из сети Интернет
Для загрузки образов из официального хранилища компании РЕД СОФТ выполните:
docker pull registry.red-soft.ru/ubi8/registry:latest docker pull registry.red-soft.ru/ubi8/ubi:latest
Загруженным образам необходимо задать теги командой:
docker tag registry.red-soft.ru/ubi8/registry:latest 10.0.2.20:5000/registry:latest docker tag registry.red-soft.ru/ubi8/ubi:latest 10.0.2.20:5000/ubi:latest
Обратите внимание, что загрузить и задать теги следует для всех необходимых образов.
Загрузка образов из архива
В случае если настройка локального registry производится в полностью изолированном контуре, необходимо загрузить образы на машину с доступом к сети Интернет, аналогично п. «Загрузка образов из сети Интернет», и задать соответствующие теги.
Затем сохраните образы в архив:
docker save 10.0.2.20:5000/registry:latest > ~/registry.tar.xz docker save 10.0.2.20:5000/ubi:latest > ~/ubi.tar.xz
Обратите внимание, что загрузить, задать теги и сохранить следует все необходимые образы.
После этого перенесите сохраненные образы на изолированную машину с registry, например, с помощью утилиты scp. Синтаксис утилиты имеет вид:
scp ubi.tar registry.tar registry:~
После получения архивов на изолированной машине с registry распакуйте их:
docker load -i ~/registry.tar.xz docker load -i ~/ubi.tar.xz
Если передача образов была выполнена корректно, вывод команды docker images должен иметь следующий вид:
docker images IMAGE ID DISK USAGE CONTENT SIZE EXTRA 10.0.2.20:5000/registry:latest 06066402618c 132MB 0B U 10.0.2.20:5000/ubi:latest 746d4a83942a 249MB 0B
Запуск локального registry
Создайте и запустите контейнер registry командой:
docker run -d -p 5000:5000 --restart=always --name registry 10.0.2.20:5000/registry:latest
В случае если образы необходимо хранить отдельно от контейнеров (не в каталоге по умолчанию – /var/lib/registry), создайте новый каталог и примонтируйте его при запуске registry, заменив каталог по умолчанию:
mkdir ~/registry docker run -d -p 5000:5000 --restart=always --name registry -v ~/registry:/var/lib/registry 10.0.2.20:5000/registry:latest
Поместите образы в настроенное локальное хранилище:
docker push 10.0.2.20:5000/registry:latest docker push 10.0.2.20:5000/ubi:latest
Для проверки работоспособности настроенного локального хранилища попробуйте извлечь из него какой-либо образ, например:
docker pull 10.0.2.20:5000/ubi:latest
Если все настроено верно, вывод команды будет иметь примерно следующий вид:
latest: Pulling from ubi Digest: sha256:726696094ab0e600f66bc154109592bbef373b7b963b2787bfa1b77838c3e783 Status: Image is up to date for 10.0.2.20:5000/ubi:latest 10.0.2.20:5000/ubi:latest
Настройка управляющего узла (control plane)
1. Для работы kubelet отключите swap:
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
2. Задайте хостовое имя для управляющего узла:
sudo hostnamectl set-hostname control-plane
Проверьте изменения:
hostname && hostname -I control-plane 10.0.2.16
3. В файл /etc/hosts внесите данные о control-plane и work-node:
sudo nano /etc/hosts
10.0.2.16 control-plane
10.0.2.17 work-node
4. Настройте DNS. В зависимости от предпочтений можно либо отключить использование stub-resolv в systemd-resolved, либо указать необходимые адреса DNS непосредственно в configmap.
4.1 Отключение stub-resolv в systemd-resolved
Для отключения stub-resolv в systemd-resolved необходимо выполнить команду:
sed -i 's|#DNSStubListener=yes|DNSStubListener=no|g' /etc/systemd/resolved.conf
После чего необходимо применить внесенные изменения:
systemctl daemon-reload systemctl restart systemd-resolved.service
4.2 Использование других адресов для службы DNS в кластере kubernetes
В случае необходимости использования других адресов DNS для кластера Kubernetes и/или работающих в нём контейнеров, выполните следующую команду в инициированном кластере kubernetes:
kubectl edit configmap coredns -n kube-system
Внесите изменения в следующие строки:
forward . /<путь_к_файлу>/<имя_файла> или <IP-адрес_DNS> {
max_concurrent 1000
}
где:
-
<путь_к_файлу>/<имя_файла>– указывается при использовании файла, подобного /etc/resolv.conf; -
<IP-адрес_DNS>– указывается при использовании одного или нескольких IP-адресов DNS.
Подробнее о настройке CoreDNS см. в официальной документации проекта.
При выполнении команды kubectl edit configmap coredns -n kube-system, файл конфигурации откроется редактором, определённым переменной $EDITOR.
5. Создайте файл для автозагрузки модулей ядра, необходимых для работы сервиса containerd:
cat <<EOF > /etc/modules-load.d/containerd.conf overlay br_netfilter EOF
Загрузите модули в ядро:
modprobe overlay && modprobe br_netfilter
Проверьте, что данные модули работают:
lsmod | egrep "br_netfilter|overlay"
6. Создайте конфигурационный файл для работы сети внутри kubernetes:
cat <<EOF > /etc/sysctl.d/99-kubernetes-cri.conf net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 EOF
Примените параметры командой:
sysctl --system
7. Установите необходимые пакеты:
dnf install kubernetes kubernetes-kubeadm cri-tools iproute-tc ebtables socat conntrack git curl wget runc containerd
Если настраиваемая машина не имеет доступа в Интернет, потребуется предварительно настроить локальный репозиторий ОС, из которого будет производиться дальнейшая установка необходимых для работы пакетов. Подробную информацию о настройке локального репозитория см. в нашей статье «Создание локального репозитория».
8. Настройте проброс портов в iptables:
iptables -P FORWARD ACCEPT
9. Запустите службу containerd и добавьте ее в автозагрузку:
systemctl enable --now containerd
10. Установите настройки по умолчанию для конфигурации контейнера:
containerd config default | sudo tee /etc/containerd/config.toml
11. Внесите изменения в файл конфигурации /etc/containerd/config.toml:
11.1 Настройте доступ к локальному registry:
sed -i '/\[plugins\."io\.containerd\.grpc\.v1\.cri"\.registry\.mirrors\]/,/^$/ {
/\[plugins\."io\.containerd\.grpc\.v1\.cri"\.registry\.mirrors\]/ a\
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."10.0.2.20:5000"]\
endpoint = ["http://10.0.2.20:5000"]\n
d
}' /etc/containerd/config.toml
11.2 Настройте доступ к контейнеру pause. Обратите внимание, что текущая версия Kubernetes (1.36.2) совместима с контейнером pause только версии 3.10:
sed -i 's|sandbox_image = "registry\.k8s\.io/pause:[0-9.]*"|sandbox_image = "10.0.2.20:5000/pause:3.10"|g' /etc/containerd/config.toml
11.3 Настройте расположение сетевых плагинов:
[[ "$(containerd --version)" =~ " 1." ]] && sed -i 's|bin_dir = "/opt/cni/bin"|bin_dir = "/usr/libexec/cni"|g' /etc/containerd/config.toml
11.4 Настройте использование драйвера cgroup:
sed -i 's|SystemdCgroup = false|SystemdCgroup = true|g' /etc/containerd/config.toml
Сохраните внесенные изменения.
12. Перезагрузите конфигурации служб:
systemctl daemon-reload
13. Перезапустите службу containerd:
systemctl restart containerd
14. Добавьте службу kubelet в автозагрузку:
systemctl enable kubelet.service
15. Проверьте доступность локального хранилища:
ping 10.0.2.20 PING 10.0.2.20 (10.0.2.20) 56(84) bytes of data.
64 bytes from 10.0.2.20: icmp_seq=1 ttl=64 time=2.19 ms
64 bytes from 10.0.2.20: icmp_seq=2 ttl=64 time=0.439 ms
64 bytes from 10.0.2.20: icmp_seq=3 ttl=64 time=1.37 ms
^C --- 10.0.2.20 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2062ms rtt min/avg/max/mdev = 0.439/1.331/2.188/0.714 ms
16. Для инициализации управляющего узла необходимо:
16.1 Вывести конфигурацию по умолчанию командой:
kubeadm config print init-defaults > kubeadm-config.yaml
16.2 Привести содержимое конфигурации к следующему виду:
apiVersion: kubeadm.k8s.io/v1beta4 bootstrapTokens: - groups: - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 24h0m0s usages: - signing - authentication kind: InitConfiguration localAPIEndpoint: advertiseAddress: 10.0.2.16 # указать IP-адрес настраиваемого управляющего узла bindPort: 6443 nodeRegistration: criSocket: unix:///var/run/containerd/containerd.sock imagePullPolicy: IfNotPresent imagePullSerial: true name: control-plane # указать хостовое имя управляющего узла taints: null timeouts: controlPlaneComponentHealthCheck: 4m0s discovery: 5m0s etcdAPICall: 2m0s kubeletHealthCheck: 4m0s kubernetesAPICall: 1m0s tlsBootstrap: 5m0s upgradeManifests: 5m0s --- apiServer: {} apiVersion: kubeadm.k8s.io/v1beta4 caCertificateValidityPeriod: 87600h0m0s certificateValidityPeriod: 8760h0m0s certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controllerManager: {} dns: {} encryptionAlgorithm: RSA-2048 etcd: local: dataDir: /var/lib/etcd imageRepository: 10.0.2.20:5000 # указать IP-адрес локального registry imageTag: 3.6.8-0 # указать тег распакованного образа etcd imageRepository: 10.0.2.20:5000 # указать IP-адрес локального registry kind: ClusterConfiguration kubernetesVersion: 1.36.2 # указать версию Kubernetes networking: dnsDomain: cluster.local # доменное имя для внутреннего DNS в кластере serviceSubnet: 10.96.0.0/12 # диапазон IP-адресов для сервисов Kubernetes podSubnet: 10.244.0.0/16 # адрес внутренней подсети для кластера proxy: {} scheduler: {}
16.3 Сохранить внесенные в конфигурацию изменения.
16.4 Запустить инициализацию управляющего узла в одноранговом кластере. Данная команда выполнит начальную настройку и подготовку основного узла кластера.
kubeadm init --config=kubeadm-config.yaml
В случае успешной инициализации в конце вывода команды будет отображаться примерно следующее:
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 10.0.2.16:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:9745328769c1c3992419453d339ff39e1a3d59814e8a3b4aa58688d8d5ff6db5
17. Настройте параметры управления кластером. Настройку можно выполнить как для непривилегированного пользователя, так и для суперпользователя root.
Для управления кластером от имени непривилегированного пользователя выполните команды:
mkdir /home/$USER/.kube cp -i /etc/kubernetes/admin.conf /home/$USER/.kube/config chown $USER. /home/$USER/.kube /home/$USER/.kube/config
Для управления кластером от имени суперпользователя root выполните команду:
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /root/.bashrc source /root/.bashrc export KUBECONFIG=/etc/kubernetes/admin.conf
Если в используемой системе файл, отвечающий за настройки разрешения доменных имен (/etc/resolv.conf), располагается по нестандартному пути или имеет нестандартное наименование, скорректируйте путь расположения файла в configmap. Для этого выполните команду:
kubectl edit configmap coredns -n kube-system
и внесите следующие изменения:
forward . /<путь_к_файлу>/<имя_файла> {
max_concurrent 1000
}
Если настройка производилась для непривилегированного пользователя, выйдите из сеанса пользователя root командой exit и дальнейшие действия по настройке кластера выполняйте от имени непривилегированного пользователя.
18. Настройте внутреннюю конфигурацию сети в кластере (в примере используется flannel).
18.1 Импортируйте образы на хосте с настроенным локальным registry:
docker load -i ~/flannel-cni-plugin-flannel.tar.xz docker load -i ~/flannel-flanneld.tar.xz
18.2 Задайте новые имена для загруженных образов командой вида:
docker tag <имя_распакованного_образа>:<тег> <IP-адрес_registry>:<порт>/<имя_образа>:<тег>
где:
-
<IP-адрес_registry>— IP-адрес хоста с настроенным локальным registry; -
<порт>— порт для подключения к локальному registry (по умолчанию 5000); -
<имя_образа>— имя образа; -
<тег>— тег образа.
Например:
docker tag registry.red-soft.ru/k8s8/flannel-cni-plugin-flannel:latest 10.0.2.20:5000/flannel-cni-plugin-flannel:latest docker tag registry.red-soft.ru/k8s8/flannel-flanneld:latest 10.0.2.20:5000/flannel-flanneld:latest
где:
-
10.0.2.20— IP-адрес хоста с настроенным локальным registry; -
5000— порт для подключения к локальному registry (по умолчанию 5000); -
flannel-cni-plugin-flannel,flannel-flanneld— имена образов; latest— теги образов.
18.3 Загрузите распакованные образы в локальное хранилище:
docker push 10.0.2.20:5000/flannel-cni-plugin-flannel:latest docker push 10.0.2.20:5000/flannel-flanneld:latest
18.4 На control-plane загрузите файл конфигурации kube-flannel.yaml и внесите в него следующие изменения:
sed -i 's|registry-devel.red-soft.ru/k8s8/flannel-flanneld:latest|10.0.2.20:5000/flannel-flanneld:latest|g' kube-flannel.yaml sed -i 's|registry-devel.red-soft.ru/k8s8/flannel-cni-plugin-flannel:latest|10.0.2.20:5000/flannel-cni-plugin-flannel:latest|g' kube-flannel.yaml
Сохраните внесенные в конфигурацию изменения.
18.5 На управляющем узле (control-plane) примените внутреннюю конфигурацию сети в кластере:
kubectl apply -f kube-flannel.yaml
Потребуется некоторое время для настройки (от 2 до 5 минут).
19. После применения конфигурации проверьте список и статус системных компонентов Kubernetes, а также компонентов сетевого плагина flannel:
kubectl get all -n kube-system kubectl get all -n kube-flannel
20. Для вывода команды присоединения рабочего узла (work-node) к кластеру выполните:
kubeadm token create --print-join-command
kubeadm join 10.0.2.16:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:9745328769c1c3992419453d339ff39e1a3d59814e8a3b4aa58688d8d5ff6db5
Настройка рабочих нод
1. Для работы kubelet отключите swap:
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
2. Задайте хостовое имя для рабочей ноды:
sudo hostnamectl set-hostname work-node
Проверьте изменения:
hostname && hostname -I
work-node
10.0.2.17
3. В файл /etc/hosts внесите данные о control-plane и work-node:
sudo nano /etc/hosts
10.0.2.16 control-plane
10.0.2.17 work-node
4. Настройте DNS. В зависимости от предпочтений можно либо отключить использование stub-resolv в systemd-resolved, либо указать необходимые адреса DNS непосредственно в configmap.
4.1 Отключение stub-resolv в systemd-resolved
Для отключения stub-resolv в systemd-resolved необходимо выполнить команду:
sed -i 's|#DNSStubListener=yes|DNSStubListener=no|g' /etc/systemd/resolved.conf
После чего необходимо применить внесенные изменения:
systemctl daemon-reload systemctl restart systemd-resolved.service
4.2 Использование других адресов для службы DNS в кластере kubernetes
В случае необходимости использования других адресов DNS для кластера Kubernetes и/или работающих в нём контейнеров, выполните следующую команду в инициированном кластере kubernetes:
kubectl edit configmap coredns -n kube-system
Внесите изменения в следующие строки:
forward . /<путь_к_файлу>/<имя_файла> или <IP-адрес_DNS> {
max_concurrent 1000
}
где:
-
<путь_к_файлу>/<имя_файла>– указывается при использовании файла, подобного /etc/resolv.conf; -
<IP-адрес_DNS>– указывается при использовании одного или нескольких IP-адресов DNS.
Подробнее о настройке CoreDNS см. в официальной документации проекта.
При выполнении команды kubectl edit configmap coredns -n kube-system, файл конфигурации откроется редактором, определённым переменной $EDITOR.
5. Создайте файл для автозагрузки модулей ядра, необходимых для работы сервиса containerd:
cat <<EOF > /etc/modules-load.d/containerd.conf overlay br_netfilter EOF
Загрузите модули в ядро:
modprobe overlay && modprobe br_netfilter
Проверьте, что данные модули работают:
lsmod | egrep "br_netfilter|overlay"
6. Создайте конфигурационный файл для работы сети внутри kubernetes:
cat <<EOF > /etc/sysctl.d/99-kubernetes-cri.conf net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 EOF
Примените параметры командой:
sysctl --system
7. Установите необходимые пакеты:
dnf install kubernetes kubernetes-kubeadm cri-tools iproute-tc ebtables socat conntrack git curl wget runc containerd
Если настраиваемая машина не имеет доступа в Интернет, потребуется предварительно настроить локальный репозиторий ОС, из которого будет производиться дальнейшая установка необходимых для работы пакетов. Подробную информацию о настройке локального репозитория см. в нашей статье «Создание локального репозитория».
8. Настройте проброс портов в iptables:
iptables -P FORWARD ACCEPT
9. Запустите службу containerd и добавьте ее в автозагрузку:
systemctl enable --now containerd
10. Установите настройки по умолчанию для конфигурации контейнера:
containerd config default | sudo tee /etc/containerd/config.toml
11. Внесите изменения в файл конфигурации /etc/containerd/config.toml:
11.1 Настройте доступ к локальному registry:
sed -i '/\[plugins\."io\.containerd\.grpc\.v1\.cri"\.registry\.mirrors\]/,/^$/ {
/\[plugins\."io\.containerd\.grpc\.v1\.cri"\.registry\.mirrors\]/ a\
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."10.0.2.20:5000"]\
endpoint = ["http://10.0.2.20:5000"]\n
d
}' /etc/containerd/config.toml
11.2 Настройте доступ к контейнеру pause. Обратите внимание, что текущая версия Kubernetes (1.36.2) совместима с контейнером pause только версии 3.10:
sed -i 's|sandbox_image = "registry\.k8s\.io/pause:[0-9.]*"|sandbox_image = "10.0.2.20:5000/pause:3.10"|g' /etc/containerd/config.toml
11.3 Настройте расположение сетевых плагинов:
[[ "$(containerd --version)" =~ " 1." ]] && sed -i 's|bin_dir = "/opt/cni/bin"|bin_dir = "/usr/libexec/cni"|g' /etc/containerd/config.toml
11.4 Настройте использование драйвера cgroup:
sed -i 's|SystemdCgroup = false|SystemdCgroup = true|g' /etc/containerd/config.toml
Сохраните внесенные изменения.
12. Перезагрузите конфигурации служб:
systemctl daemon-reload
13. Перезапустите службу containerd:
systemctl restart containerd
14. Добавьте службу kubelet в автозагрузку:
systemctl enable kubelet.service
После этого можно приступать к присоединению рабочей ноды к кластеру.
Подключение рабочих нод к кластеру
1. На управляющем узле (control-plane) получите команду присоединения рабочей ноды:
kubeadm token create --print-join-command
kubeadm join 10.0.2.16:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:9745328769c1c3992419453d339ff39e1a3d59814e8a3b4aa58688d8d5ff6db5
2. На рабочей ноде (work-node) выполните полученную команду:
kubeadm join 10.0.2.16:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:9745328769c1c3992419453d339ff39e1a3d59814e8a3b4aa58688d8d5ff6db5
[preflight] Running pre-flight checks
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
3. На управляющем узле (control-plane) выполните команду для вывода списка нод кластера и их статуса:
kubectl get nodes NAME STATUS ROLES AGE VERSION control-plane Ready control-plane 14m v1.36.2 work-node Ready <none> 6s v1.36.2
Дата последнего изменения: 12.08.2026
Если вы нашли ошибку, пожалуйста, выделите текст и нажмите Ctrl+Enter.