Перейти к содержанию

Этап 8: Обновление кластера Kubernetes

Важно

Этот раздел описывает процесс обновления уже работающего кластера на новую версию Kubernetes.

8.1. Общие правила обновления

Ограничения версий:

  • Можно обновляться только на следующую MINOR версию (1.35 → 1.36)
  • Нельзя пропускать MINOR версии (1.35 → 1.37 ❌)
  • Можно обновляться между PATCH версиями (1.35.1 → 1.35.5 ✅)

Последовательность обновления:

  1. Первая control plane нода (k8scontrolplane01)
  2. Дополнительные control plane ноды (k8scontrolplane02, k8scontrolplane03)
  3. Worker ноды (k8sworker01, k8sworker02) - по одной или несколько одновременно

Что происходит с компонентами при drain:

  • ✅ Static pods (etcd, kube-apiserver, kube-scheduler, kube-controller-manager) - НЕ evict'ятся, продолжают работать
  • ✅ kube-vip static pod - НЕ evict'ится, VIP остается активным
  • ✅ DaemonSet pods (cilium) - НЕ evict'ятся (при использовании --ignore-daemonsets)
  • ❌ Workload pods (deployments, statefulsets) - evict'ятся на другие ноды

Перед обновлением:

  • Сделать backup etcd
  • Убедиться что есть достаточно ресурсов на других нодах для evicted pods
  • Проверить release notes новой версии

8.2. Обновление первой control plane ноды (k8scontrolplane01)

На k8scontrolplane01:

# 1. Добавить новый репозиторий для целевой версии (например 1.36)
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.36/deb/Release.key | \
  sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-1-36-apt-keyring.gpg

echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-1-36-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.36/deb/ /' | \
  sudo tee /etc/apt/sources.list.d/kubernetes-1-36.list

# 2. Обновить kubeadm
sudo apt-mark unhold kubeadm
sudo apt-get update
sudo apt-get install -y kubeadm=1.36.x-*  # Замените x на конкретный patch
sudo apt-mark hold kubeadm

# 3. Проверить версию kubeadm
kubeadm version

# 4. Проверить план обновления
sudo kubeadm upgrade plan

# 5. Применить обновление control plane
sudo kubeadm upgrade apply v1.36.x  # Замените x на конкретный patch

# 6. Drain нода (evict workload pods, static pods остаются)
kubectl drain k8scontrolplane01 --ignore-daemonsets

# 7. Обновить kubelet и kubectl
sudo apt-mark unhold kubelet kubectl
sudo apt-get update
sudo apt-get install -y kubelet=1.36.x-* kubectl=1.36.x-*
sudo apt-mark hold kubelet kubectl

# 8. Перезапустить kubelet
sudo systemctl daemon-reload
sudo systemctl restart kubelet

# 9. Вернуть ноду в работу
kubectl uncordon k8scontrolplane01

# 10. Проверить статус
kubectl get nodes

Проверка:

# Нода должна показать новую версию
kubectl get nodes

# Control plane компоненты должны быть обновлены
kubectl get pods -n kube-system -o wide

8.3. Обновление дополнительных control plane нод

На k8scontrolplane02 и k8scontrolplane03 (по очереди):

# 1. Добавить репозиторий для новой версии
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.36/deb/Release.key | \
  sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-1-36-apt-keyring.gpg

echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-1-36-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.36/deb/ /' | \
  sudo tee /etc/apt/sources.list.d/kubernetes-1-36.list

# 2. Обновить kubeadm
sudo apt-mark unhold kubeadm
sudo apt-get update
sudo apt-get install -y kubeadm=1.36.x-*
sudo apt-mark hold kubeadm

# 3. Применить обновление ноды (вместо upgrade apply используем node)
sudo kubeadm upgrade node

# 4. Drain нода (выполнить с ДРУГОЙ control plane ноды где есть kubectl)
kubectl drain k8scontrolplane02 --ignore-daemonsets

# 5. Обновить kubelet и kubectl
sudo apt-mark unhold kubelet kubectl
sudo apt-get update
sudo apt-get install -y kubelet=1.36.x-* kubectl=1.36.x-*
sudo apt-mark hold kubelet kubectl

# 6. Перезапустить kubelet
sudo systemctl daemon-reload
sudo systemctl restart kubelet

# 7. Uncordon (выполнить с другой ноды)
kubectl uncordon k8scontrolplane02

# 8. Проверить
kubectl get nodes

Повторить для k8scontrolplane03.

8.4. Обновление worker нод

На каждой worker ноде (по одной):

# На worker ноде:

# 1. Добавить репозиторий
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.36/deb/Release.key | \
  sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-1-36-apt-keyring.gpg

echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-1-36-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.36/deb/ /' | \
  sudo tee /etc/apt/sources.list.d/kubernetes-1-36.list

# 2. Обновить kubeadm
sudo apt-mark unhold kubeadm
sudo apt-get update
sudo apt-get install -y kubeadm=1.36.x-*
sudo apt-mark hold kubeadm

# 3. Обновить kubelet конфигурацию
sudo kubeadm upgrade node

С control plane ноды (где есть kubectl):

# 4. Drain worker нода
kubectl drain k8sworker01 --ignore-daemonsets --delete-emptydir-data

Вернуться на worker ноду:

# 5. Обновить kubelet и kubectl
sudo apt-mark unhold kubelet kubectl
sudo apt-get update
sudo apt-get install -y kubelet=1.36.x-* kubectl=1.36.x-*
sudo apt-mark hold kubelet kubectl

# 6. Перезапустить kubelet
sudo systemctl daemon-reload
sudo systemctl restart kubelet

С control plane ноды:

# 7. Uncordon
kubectl uncordon k8sworker01

# 8. Проверить
kubectl get nodes
kubectl get pods -A -o wide

Повторить для k8sworker02.

8.5. Проверка после обновления

# Все ноды должны показать новую версию
kubectl get nodes

# Проверить статус всех pod'ов
kubectl get pods -A

# Проверить control plane компоненты
kubectl get pods -n kube-system -o wide

# Проверить версию компонентов
kubectl version

# Проверить etcd
kubectl get pods -n kube-system -l component=etcd

# Проверить что приложения работают
kubectl get deployments -A

8.6. Backup etcd перед обновлением (рекомендуется)

# На control plane ноде создать snapshot
sudo ETCDCTL_API=3 etcdctl snapshot save /tmp/etcd-backup.db \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key

# Проверить snapshot
sudo ETCDCTL_API=3 etcdctl snapshot status /tmp/etcd-backup.db --write-out=table

# Скопировать в безопасное место
sudo cp /tmp/etcd-backup.db ~/etcd-backup-$(date +%Y%m%d-%H%M%S).db

8.7. Rollback (если что-то пошло не так)

Если обновление первой control plane ноды не удалось:

# kubeadm upgrade apply откатится автоматически при ошибке
# Если нужен полный rollback:

# 1. Восстановить предыдущую версию kubeadm
sudo apt-mark unhold kubeadm
sudo apt-get install -y kubeadm=1.35.x-*
sudo apt-mark hold kubeadm

# 2. Восстановить etcd из backup (если необходимо)
# См. официальную документацию Kubernetes по восстановлению etcd

8.8. Частые проблемы при обновлении

Проблема: Pod'ы остаются в Pending после uncordon Решение: Проверить ресурсы: kubectl describe node <node-name>

Проблема: Drain не завершается из-за PodDisruptionBudget Решение:

# Проверить PDB
kubectl get pdb -A

# При необходимости использовать --disable-eviction (осторожно!)
kubectl drain node --disable-eviction --ignore-daemonsets

Проблема: Ошибка при kubeadm upgrade apply Решение: Проверить логи: journalctl -u kubelet -f

Проблема: etcd не запускается после обновления Решение: Проверить логи etcd pod: kubectl logs -n kube-system etcd-<node-name>