Как добавить worker-ноду в кластер Kubernetes

«Как добавить worker-ноду в кластер Kubernetes» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В моей практике развертывания 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 для планирования подов.