Что ты устанавливаешь на Worker Node в Kubernetes?

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

Ответ

При настройке Worker Node я устанавливаю следующий минимальный набор компонентов, разделяя их на обязательные и опциональные:

Обязательные компоненты (требуются Kubernetes):

  1. Container Runtime:

    # Для containerd (текущий стандарт)
    apt-get install -y containerd.io
    containerd config default > /etc/containerd/config.toml
    systemctl enable --now containerd
  2. Kubelet (агент ноды):

    apt-get install -y kubelet=1.28.* kubeadm=1.28.* kubectl=1.28.*
    systemctl enable --now kubelet
  3. Kube-proxy (сетевой прокси):

    # Обычно устанавливается через kubeadm автоматически
    # Или в режиме DaemonSet

Сетевые плагины (CNI):

# Пример для Calico (устанавливается после инициализации кластера)
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

Опциональные, но рекомендуемые компоненты:

  1. Мониторинг и логирование:

    • Node Exporter для метрик хоста
    • Fluentd или Filebeat DaemonSet для сбора логов
    • cAdvisor (встроен в kubelet, но можно отдельно)
  2. Хранилище:

    # CSI драйверы в зависимости от провайдера
    # Например, для AWS EBS:
    kubectl apply -k "github.com/kubernetes-sigs/aws-ebs-csi-driver/deploy/kubernetes/overlays/stable/?ref=master"
  3. Безопасность:

    • AppArmor или SELinux профили
    • Pod Security Standards enforcement
    • falco для обнаружения аномалий

Процесс присоединения ноды:

# После настройки control plane получаю команду join
kubeadm join 10.0.0.100:6443 
  --token <token> 
  --discovery-token-ca-cert-hash sha256:<hash> 
  --node-name worker-01 
  --cri-socket unix:///run/containerd/containerd.sock

Проверка работоспособности:

# На control plane проверяю ноду
kubectl get nodes -o wide
kubectl describe node worker-01

# На самой worker node проверяю компоненты
systemctl status kubelet containerd
journalctl -u kubelet -f --since "5 minutes ago"