Этап 8: Обновление кластера Kubernetes¶
Важно
Этот раздел описывает процесс обновления уже работающего кластера на новую версию Kubernetes.
8.1. Общие правила обновления¶
Ограничения версий:
- Можно обновляться только на следующую MINOR версию (1.35 → 1.36)
- Нельзя пропускать MINOR версии (1.35 → 1.37 ❌)
- Можно обновляться между PATCH версиями (1.35.1 → 1.35.5 ✅)
Последовательность обновления:
- Первая control plane нода (k8scontrolplane01)
- Дополнительные control plane ноды (k8scontrolplane02, k8scontrolplane03)
- 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):
Вернуться на 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>