2.9.16.3.4.1 Установка kubernetes с использованием контейнерного движка containerd без доступа в Интернет
Входные данные
Установка Docker Registry
Настройка сети
Установка docker
Загрузка образов
Загрузка образов из сети Интернет
Загрузка образов из архива
Запуск локального registry
Настройка управляющего узла (control plane)
Настройка рабочих нод
Подключение рабочих нод к кластеру
Окружение
- Версия ОС: 7.3
- Конфигурация ОС: Сервер графический
- Редакция ОС: Стандартная
- Версия ПО: kubernetes-1.24.17-11, kubernetes-kubeadm-1.24.17-11, docker-ce-29.5.3-1
Входные данные
В рамках рассматриваемого далее примера развертывания программной платформы 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-адреса необходимо заменить на фактически используемые значения в сети.
Для дальнейшей настройки необходимо перейти в сеанс пользователя root:
su -
Далее команды будут выполняться с правами пользователя root, если не указано иное.
Установка 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
Загрузка образов
Для дальнейшей настройки локального хранилища необходимые образы должны быть предварительно загружены и доступны при вызове команды docker images.
Загрузка образов из сети Интернет
Для загрузки образов из официального хранилища компании РЕД СОФТ выполните:
docker pull registry.red-soft.ru/ubi7/registry:latest docker pull registry.red-soft.ru/ubi7/ubi:latest
Загруженным образам необходимо задать теги командой:
docker tag registry.red-soft.ru/ubi7/registry:latest 10.0.2.20:5000/registry:latest docker tag registry.red-soft.ru/ubi7/ubi:latest 10.0.2.20:5000/ubi:latest
Обратите внимание, что загрузить и задать теги следует для всех необходимых образов.
Загрузка образов из архива
В случае если настройка локального registry производится в полностью изолированном контуре, необходимо загрузить образы на машину с доступом к сети Интернет, аналогично п. «Загрузка образов из сети Интернет», и задать соответствующие теги.
Затем сохраните образы в архив:
docker save 10.0.2.20:5000/registry:latest > ~/registry.tar docker save 10.0.2.20:5000/ubi:latest > ~/ubi.tar
Обратите внимание, что загрузить, задать теги и сохранить следует все необходимые образы.
После этого перенесите сохраненные образы на изолированную машину с registry, например, с помощью утилиты scp. Синтаксис утилиты имеет вид:
scp ubi.tar registry.tar registry:~
После получения архивов на изолированной машине с registry распакуйте их:
docker load -i ~/registry.tar docker load -i ~/ubi.tar
Если передача образов была выполнена корректно, вывод команды docker images должен иметь следующий вид:
docker images IMAGE ID DISK USAGE CONTENT SIZE EXTRA 10.0.2.20:5000/registry:latest dbb07a023c82 135MB 0B U 10.0.2.20:5000/ubi:latest 47a98658cf67 216MB 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:08d9baa5b5505a119d74f1b6e307bb585a77eae476f1c012b52aafcf66b12131 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. Создайте файл для автозагрузки модулей ядра, необходимых для работы сервиса containerd:
cat < /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
Загрузите модули в ядро:
modprobe overlay modprobe br_netfilter
Проверьте, что данные модули работают:
lsmod | egrep "br_netfilter|overlay"
3. Создайте конфигурационный файл для работы сети внутри kubernetes:
cat < /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
4. Установите необходимые пакеты:
dnf install kubernetes kubernetes-kubeadm cri-tools iproute-tc ebtables socat conntrack git curl wget runc containerd
Если настраиваемая машина не имеет доступа в Интернет, потребуется предварительно настроить локальный репозиторий ОС, из которого будет производиться дальнейшая установка необходимых для работы пакетов. Подробную информацию о настройке локального репозитория см. в нашей статье «Создание локального репозитория».
5. Настройте проброс портов в iptables:
iptables -P FORWARD ACCEPT
6. Запустите службу containerd и добавьте ее в автозагрузку:
systemctl enable --now containerd
7. Установите настройки по умолчанию для конфигурации контейнера:
containerd config default | sudo tee /etc/containerd/config.toml
8. Внесите изменения в файл конфигурации /etc/containerd/config.toml:
nano /etc/containerd/config.toml
8.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
8.2 Настройте доступ к контейнеру pause. Обратите внимание, что текущая версия Kubernetes (1.24.17) совместима с контейнером pause только версии 3.7:
sed -i 's|sandbox_image = "registry\.k8s\.io/pause:[0-9.]*"|sandbox_image = "10.0.2.20:5000/pause:3.7"|g' /etc/containerd/config.toml
8.3 Настройте расположение сетевых плагинов:
sed -i 's|bin_dir = "/opt/cni/bin"|bin_dir = "/usr/libexec/cni"|g' /etc/containerd/config.toml
8.4 Настройте использование драйвера cgroup:
sed -i 's|SystemdCgroup = false|SystemdCgroup = true|g' /etc/containerd/config.toml
9. Перезагрузите конфигурации служб:
systemctl daemon-reload
10. Перезапустите службу containerd:
systemctl restart containerd
11. Добавьте службу kubelet в автозагрузку:
systemctl enable kubelet.service
12. Проверьте доступность локального хранилища:
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=0.248 ms
64 bytes from 10.0.2.20: icmp_seq=2 ttl=64 time=0.312 ms
64 bytes from 10.0.2.20: icmp_seq=3 ttl=64 time=0.391 ms
64 bytes from 10.0.2.20: icmp_seq=4 ttl=64 time=0.413 ms
--- 10.0.2.20 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3068ms
rtt min/avg/max/mdev = 0.248/0.341/0.413/0.065 ms
13. Для инициализации управляющего узла необходимо:
13.1 Вывести конфигурацию по умолчанию командой:
kubeadm config print init-defaults > kubeadm-config.yaml
13.2 Привести содержимое конфигурации к следующему виду:
apiVersion: kubeadm.k8s.io/v1beta3 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 name: control-plane # указать сетевое имя управляющего узла taints: null --- apiServer: timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta3 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controllerManager: {} dns: {} etcd: local: dataDir: /var/lib/etcd imageRepository: 10.0.2.20:5000 # указать IP-адрес локального registry imageTag: 3.5.15-0 # указать тег распакованного образа etcd imageRepository: 10.0.2.20:5000 # указать IP-адрес локального registry kind: ClusterConfiguration kubernetesVersion: 1.24.17 # указать версию Kubernetes networking: dnsDomain: cluster.local # доменное имя для внутреннего DNS в кластере serviceSubnet: 10.96.0.0/12 # диапазон IP-адресов для сервисов Kubernetes podSubnet: 10.244.0.0/16 # адрес внутренней подсети для кластера scheduler: {}
13.3 Сохранить внесенные в конфигурацию изменения.
13.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:fff28749381ebebba6754155104ac8ce0ad3b5a992f9cf73757ea2d352b7785a
14. Настройте параметры управления кластером. Настройку можно выполнить как для локального пользователя, так и для суперпользователя 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 и дальнейшие действия по настройке кластера выполняйте от имени локального пользователя.
15. Настройте внутреннюю конфигурацию сети в кластере (в примере используется flannel).
15.1 Импортируйте образы на хосте с настроенным локальным registry:
docker load -i ~/flannel-cni-plugin-flannel.tar.xz docker load -i ~/flannel-flanneld.tar.xz
15.2 Задайте новые имена для загруженных образов командой вида:
docker tag <имя_распакованного_образа>:<тег> <IP-адрес_registry>:<порт>/<имя_образа>:<тег>
где:
-
<IP-адрес_registry>— IP-адрес хоста с настроенным локальным registry; -
<порт>— порт для подключения к локальному registry (по умолчанию 5000); -
<имя_образа>— имя образа; -
<тег>— тег образа.
Например:
docker tag registry.red-soft.ru/k8s7c/flannel-cni-plugin-flannel:latest 10.0.2.20:5000/flannel-cni-plugin-flannel:latest docker tag registry.red-soft.ru/k8s7c/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— теги образов.
15.3 Загрузите распакованные образы в локальное хранилище:
docker push 10.0.2.20:5000/flannel-cni-plugin-flannel:latest docker push 10.0.2.20:5000/flannel-flanneld:latest
15.4 На управляющем узле (control-plane) создайте файл конфигурации kube-flannel.yaml со следующим содержимым:
apiVersion: v1
kind: Namespace
metadata:
labels:
k8s-app: flannel
pod-security.kubernetes.io/enforce: privileged
name: kube-flannel
---
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-app: flannel
name: flannel
namespace: kube-flannel
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
k8s-app: flannel
name: flannel
rules:
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- apiGroups:
- ""
resources:
- nodes
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- nodes/status
verbs:
- patch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
labels:
k8s-app: flannel
name: flannel
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: flannel
subjects:
- kind: ServiceAccount
name: flannel
namespace: kube-flannel
---
apiVersion: v1
kind: ConfigMap
metadata:
labels:
app: flannel
k8s-app: flannel
tier: node
name: kube-flannel-cfg
namespace: kube-flannel
data:
cni-conf.json: |
{
"name": "cbr0",
"cniVersion": "0.3.1",
"plugins": [
{
"type": "flannel",
"delegate": {
"hairpinMode": true,
"isDefaultGateway": true
}
},
{
"type": "portmap",
"capabilities": {
"portMappings": true
}
}
]
}
net-conf.json: |
{
"Network": "10.244.0.0/16",
"EnableNFTables": false,
"Backend": {
"Type": "vxlan"
}
}
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
app: flannel
k8s-app: flannel
tier: node
name: kube-flannel-ds
namespace: kube-flannel
spec:
selector:
matchLabels:
app: flannel
k8s-app: flannel
template:
metadata:
labels:
app: flannel
k8s-app: flannel
tier: node
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/os
operator: In
values:
- linux
containers:
- args:
- --ip-masq
- --kube-subnet-mgr
command:
- flanneld
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: EVENT_QUEUE_DEPTH
value: "5000"
image: 10.0.2.20:5000/flannel-flanneld:latest
name: kube-flannel
resources:
requests:
cpu: 100m
memory: 50Mi
securityContext:
capabilities:
add:
- NET_ADMIN
- NET_RAW
privileged: false
volumeMounts:
- mountPath: /run/flannel
name: run
- mountPath: /etc/kube-flannel/
name: flannel-cfg
- mountPath: /run/xtables.lock
name: xtables-lock
hostNetwork: true
initContainers:
- args:
- -f
- /flannel
- /usr/libexec/cni/flannel
command:
- cp
image: 10.0.2.20:5000/flannel-cni-plugin-flannel:latest
name: install-cni-plugin
volumeMounts:
- mountPath: /usr/libexec/cni
name: cni-plugin
- args:
- -f
- /etc/kube-flannel/cni-conf.json
- /etc/cni/net.d/10-flannel.conflist
command:
- cp
image: 10.0.2.20:5000/flannel-flanneld:latest
name: install-cni
volumeMounts:
- mountPath: /etc/cni/net.d
name: cni
- mountPath: /etc/kube-flannel/
name: flannel-cfg
priorityClassName: system-node-critical
serviceAccountName: flannel
tolerations:
- effect: NoSchedule
operator: Exists
volumes:
- hostPath:
path: /run/flannel
name: run
- hostPath:
path: /usr/libexec/cni
name: cni-plugin
- hostPath:
path: /etc/cni/net.d
name: cni
- configMap:
name: kube-flannel-cfg
name: flannel-cfg
- hostPath:
path: /run/xtables.lock
type: FileOrCreate
name: xtables-lock
Сохраните внесенные в конфигурацию изменения.
15.5 На управляющем узле (control-plane) примените внутреннюю конфигурацию сети в кластере:
kubectl apply -f kube-flannel.yaml
Потребуется некоторое время для настройки (от 2 до 5 минут).
16. После применения конфигурации проверьте список и статус системных компонентов Kubernetes, а также компонентов сетевого плагина flannel:
kubectl get all -n kube-system kubectl get all -n kube-flannel
17. Выполните дополнительную настройку сети:
sudo hostnamectl set-hostname control-plane
Проверьте изменения:
hostname && hostname -I control-plane 10.0.2.16
18. В файл /etc/hosts внесите данные о control-plane и work-node:
sudo nano /etc/hosts
10.0.2.16 control-plane 10.0.2.17 work-node
Для вывода команды присоединения work-node к кластеру выполните:
kubeadm token create --print-join-command
kubeadm join 10.0.2.16:6443 --token bh5nw3.uz8a96nhao7u0ue2 \
--discovery-token-ca-cert-hash sha256:e3623f73dadb313ea38e5f04736da6b662925aa78b07d00c50fca6aa0f30e391
Настройка рабочих нод
1. Для работы kubelet отключите swap:
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
2. Создайте файл для автозагрузки модулей ядра, необходимых для работы сервиса containerd:
cat < /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
Загрузите модули в ядро:
modprobe overlay modprobe br_netfilter
Проверьте, что данные модули работают:
lsmod | egrep "br_netfilter|overlay"
3. Создайте конфигурационный файл для работы сети внутри kubernetes:
cat < /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
4. Установите необходимые пакеты:
dnf install kubernetes kubernetes-kubeadm cri-tools iproute-tc ebtables socat conntrack git curl wget runc containerd
Если настраиваемая машина не имеет доступа в Интернет, потребуется предварительно настроить локальный репозиторий ОС, из которого будет производиться дальнейшая установка необходимых для работы пакетов. Подробную информацию о настройке локального репозитория см. в нашей статье «Создание локального репозитория».
5. Настройте проброс портов в iptables:
iptables -P FORWARD ACCEPT
6. Запустите службу containerd и добавьте ее в автозагрузку:
systemctl enable --now containerd
7. Установите настройки по умолчанию для конфигурации контейнера:
containerd config default | sudo tee /etc/containerd/config.toml
8. Внесите изменения в файл конфигурации /etc/containerd/config.toml.
8.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
8.2 Настройте доступ к контейнеру pause. Обратите внимание, что текущая версия Kubernetes (1.24.17) совместима с контейнером pause только версии 3.7:
sed -i 's|sandbox_image = "registry\.k8s\.io/pause:[0-9.]*"|sandbox_image = "10.0.2.20:5000/pause:3.7"|g' /etc/containerd/config.toml
8.3 Настройте расположение сетевых плагинов:
sed -i 's|bin_dir = "/opt/cni/bin"|bin_dir = "/usr/libexec/cni"|g' /etc/containerd/config.toml
8.4 Настройте использование драйвера cgroup:
sed -i 's|SystemdCgroup = false|SystemdCgroup = true|g' /etc/containerd/config.toml
9. Перезагрузите конфигурации служб:
systemctl daemon-reload
10. Перезапустите службу containerd:
systemctl restart containerd
11. Добавьте службу kubelet в автозагрузку:
systemctl enable kubelet.service
12. Выполните дополнительную настройку сети:
sudo hostnamectl set-hostname work-node
Проверьте изменения:
hostname && hostname -I work-node 10.0.2.17
13. В файл /etc/hosts внесите данные о control-plane и work-node:
sudo nano /etc/hosts
10.0.2.16 control-plane 10.0.2.17 work-node
После этого можно приступать к присоединению рабочей ноды к кластеру.
Подключение рабочих нод к кластеру
1. На управляющем узле (control-plane) получите команду присоединения рабочей ноды:
kubeadm token create --print-join-command
kubeadm join 10.0.2.16:6443 --token bh5nw3.uz8a96nhao7u0ue2 \
--discovery-token-ca-cert-hash sha256:e3623f73dadb313ea38e5f04736da6b662925aa78b07d00c50fca6aa0f30e391
2. На рабочем узле (work-node) выполните полученную команду:
kubeadm join 10.0.2.16:6443 --token bh5nw3.uz8a96nhao7u0ue2 --discovery-token-ca-cert-hash sha256:e3623f73dadb313ea38e5f04736da6b662925aa78b07d00c50fca6aa0f30e391
[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 51m v1.24.17 work-node Ready <none> 36m v1.24.17
Дата последнего изменения: 31.07.2026
Если вы нашли ошибку, пожалуйста, выделите текст и нажмите Ctrl+Enter.