Ответ
В моей практике развертывания Kubernetes-кластеров добавление worker-нод выполняется через kubeadm join. Вот пошаговый процесс, который я отработал на production-окружениях:
1. Подготовка worker-ноды (выполняется на новой машине):
# Установка зависимостей (на примере Ubuntu)
apt-get update
apt-get install -y docker.io kubelet kubeadm kubectl
apt-mark hold docker.io kubelet kubeadm kubectl # Фиксация версий
# Настройка docker (если не настроен)
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
}
}
EOF
systemctl restart docker
2. Получение команды присоединения с control-plane ноды:
# На master-ноде генерируем токен и команду
kubeadm token create --print-join-command
# Вывод: kubeadm join 10.0.0.100:6443 --token abcdef.1234567890 --discovery-token-ca-cert-hash sha256:...
# ИЛИ получаем всю информацию для присоединения
kubeadm token create
kubeadm init phase upload-certs --upload-certs
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex
3. Присоединение worker-ноды:
# Выполняем на worker-ноде полученную команду
kubeadm join 10.0.0.100:6443
--token abcdef.1234567890
--discovery-token-ca-cert-hash sha256:1234567890abcdef...
# Для production с высокими требованиями безопасности добавляю:
kubeadm join ...
--node-name "worker-01"
--cri-socket /var/run/dockershim.sock
4. Проверка и настройка:
# На control-plane ноде проверяем статус
kubectl get nodes
kubectl describe node worker-01
# Добавляем лейблы для планирования подов
kubectl label node worker-01 node-role.kubernetes.io/worker= worker-type=high-memory
# Проверяем, что нода Ready
kubectl get nodes -o wide
Автоматизация в инфраструктуре:
В реальных проектах я автоматизирую это через Terraform и cloud-init:
# В user-data для cloud-init
write_files:
- path: /etc/kubernetes/join-command
content: |
kubeadm join ...
permissions: '0644'
runcmd:
- bash /etc/kubernetes/join-command
Типичные проблемы и решения:
- Ошибка соединения: Проверяю firewall (порт 6443) и сетевую связность.
- Несовместимость версий: Слежу, чтобы версии kubelet на worker и control-plane совпадали.
- Ресурсы: Убеждаюсь, что на ноде достаточно CPU/RAM для планирования подов.