Введение
В этом лабораторном занятии вы научитесь обновлять и откатывать приложения, развернутые в кластере Kubernetes. Вы начнете с настройки локального кластера Kubernetes с использованием Minikube, а затем развернете пример приложения NGINX. Затем вы обновите образ приложения и убедитесь, что обновление прошло успешно. Чтобы смоделировать сбои обновления, вы диагностируете проблемы и затем откатываетесь к стабильной версии. Наконец, вы измените стратегию последовательного обновления в файле YAML Deployment.
Запустить кластер Kubernetes
На этом шаге вы узнаете, как запустить и проверить локальный кластер Kubernetes с использованием Minikube. Это важный первый шаг при настройке среды разработки Kubernetes.
Сначала убедитесь, что вы находитесь в директории проекта:
cd ~/project
Запустите кластер Minikube:
minikube start
Пример вывода:
😄 minikube v1.29.0 on Ubuntu 22.04
✨ Automatically selected the docker driver
📌 Using Docker driver with root permissions
🔥 Creating kubernetes in kubernetes cluster
🔄 Restarting existing kubernetes cluster
🐳 Preparing Kubernetes v1.26.1 on Docker 20.10.23...
🚀 Launching Kubernetes...
🌟 Enabling addons: storage-provisioner, default-storageclass
🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace
Проверьте статус кластера:
minikube status
Пример вывода:
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
Проверьте узлы кластера:
kubectl get nodes
Пример вывода:
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 1m v1.26.1
Основные моменты этого шага:
- Команда
minikube startсоздает локальный одноузловой кластер Kubernetes - Кластер использует Docker в качестве драйвера по умолчанию
- Автоматически настраивается Kubernetes v1.26.1
- Команды
minikube statusиkubectl get nodesподтверждают готовность кластера
Развернуть примерное приложение
На этом шаге вы узнаете, как создать и развернуть простое веб-приложение с использованием Kubernetes Deployment. Мы будем использовать образ NGINX в качестве примерного приложения для демонстрации процесса развертывания.
Сначала перейдите в директорию проекта:
cd ~/project
mkdir -p k8s-manifests
cd k8s-manifests
Создайте новый манифест развертывания для веб-приложения:
nano nginx-deployment.yaml
Добавьте следующее содержимое в файл:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
labels:
app: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.23.3-alpine
ports:
- containerPort: 80
Сохраните файл и выйдите из редактора nano.
Разверните приложение с помощью kubectl:
kubectl apply -f nginx-deployment.yaml
Пример вывода:
deployment.apps/web-app created
Проверьте развертывание:
kubectl get deployments
Пример вывода:
NAME READY UP-TO-DATE AVAILABLE AGE
web-app 3/3 3 3 30s
Проверьте созданные поды (pods):
kubectl get pods -l app=web
Пример вывода:
NAME READY STATUS RESTARTS AGE
web-app-xxx-yyy 1/1 Running 0 45s
web-app-xxx-zzz 1/1 Running 0 45s
web-app-xxx-www 1/1 Running 0 45s
Основные моменты этого развертывания:
- Мы создали Deployment с 3 репликами веб-сервера NGINX
- Использовали определенную, стабильную версию NGINX (1.23.3-alpine)
- Открыли порт 80 контейнера
- Использовали метки (labels) для идентификации и управления подами (pods)
Обновить образ приложения в YAML-файле развертывания
На этом шаге вы узнаете, как обновить образ контейнера в Kubernetes Deployment, имитируя сценарий обновления реального приложения.
Сначала убедитесь, что вы находитесь в правильной директории:
cd ~/project/k8s-manifests
Откройте существующий манифест развертывания:
nano nginx-deployment.yaml
Обновите образ с nginx:1.23.3-alpine на более новую версию:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
labels:
app: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.24.0-alpine
ports:
- containerPort: 80
Примените обновленное развертывание:
kubectl apply -f nginx-deployment.yaml
Пример вывода:
deployment.apps/web-app configured
Следите за процессом обновления развертывания:
kubectl rollout status deployment web-app
Пример вывода:
Waiting for deployment "web-app" to roll out...
Waiting for deployment spec update to be applied...
Waiting for available replicas to reach desired number...
deployment "web-app" successfully rolled out
Проверьте новую версию образа:
kubectl get pods -l app=web -o jsonpath='{.items[*].spec.containers[0].image}'
Пример вывода:
nginx:1.24.0-alpine nginx:1.24.0-alpine nginx:1.24.0-alpine
Основные моменты обновления образов:
- Используйте
kubectl applyдля обновления развертываний. - По умолчанию Kubernetes выполняет последовательное обновление (rolling update).
- Поды (pods) постепенно заменяются, чтобы сохранить доступность приложения.
- Процесс обновления обеспечивает развертывание без простоя.
Проверить успешное обновление
На этом шаге вы узнаете, как проверить успешное обновление развертывания в Kubernetes, исследуя версии подов (pods), их статус и дополнительные детали развертывания.
Сначала выведите список подов с подробной информацией:
kubectl get pods -l app=web -o wide
Пример вывода:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-app-xxx-yyy 1/1 Running 0 3m 10.244.0.5 minikube <none> <none>
web-app-xxx-zzz 1/1 Running 0 3m 10.244.0.6 minikube <none> <none>
web-app-xxx-www 1/1 Running 0 3m 10.244.0.7 minikube <none> <none>
Проверьте конкретные версии образов подов:
kubectl get pods -l app=web -o jsonpath='{range.items[*]}{.metadata.name}{"\t"}{.spec.containers[0].image}{"\n"}{end}'
Пример вывода:
web-app-xxx-yyy nginx:1.24.0-alpine
web-app-xxx-zzz nginx:1.24.0-alpine
web-app-xxx-www nginx:1.24.0-alpine
Опишите развертывание, чтобы получить более подробную информацию:
kubectl describe deployment web-app
Пример вывода:
Name: web-app
Namespace: default
CreationTimestamp: [current timestamp]
Labels: app=web
Annotations: deployment.kubernetes.io/revision: 2
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=web
Containers:
nginx:
Image: nginx:1.24.0-alpine
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
Проверьте историю развертывания:
kubectl rollout history deployment web-app
Пример вывода:
REVISION CHANGE-CAUSE
1 <none>
2 <none>
Основные моменты проверки:
- Все поды работают с новой версией образа.
- В развертывании доступно 3 реплики.
- Стратегия развертывания обеспечивает обновления без простоя.
- Ревизия развертывания была увеличена.
Симулировать и диагностировать сбои обновления
На этом шаге вы узнаете, как диагностировать возможные сбои при обновлении развертывания, симулируя проблемное обновление образа и используя инструменты диагностики Kubernetes.
Сначала перейдите в директорию проекта:
cd ~/project/k8s-manifests
Создайте манифест развертывания с недействительным образом:
nano problematic-deployment.yaml
Добавьте следующее содержимое:
apiVersion: apps/v1
kind: Deployment
metadata:
name: troubleshoot-app
labels:
app: troubleshoot
spec:
replicas: 3
selector:
matchLabels:
app: troubleshoot
template:
metadata:
labels:
app: troubleshoot
spec:
containers:
- name: nginx
image: nginx:non-existent-tag
ports:
- containerPort: 80
Примените проблемное развертывание:
kubectl apply -f problematic-deployment.yaml
Пример вывода:
deployment.apps/troubleshoot-app created
Проверьте статус развертывания:
kubectl rollout status deployment troubleshoot-app
Пример вывода:
Waiting for deployment "troubleshoot-app" to roll out...
Нажмите Ctrl+C, чтобы выйти из отображения статуса развертывания.
Проверьте события и статус подов:
kubectl get pods -l app=troubleshoot
Пример вывода:
NAME READY STATUS RESTARTS AGE
troubleshoot-app-6b8986c555-gcjj9 0/1 ImagePullBackOff 0 2m56s
troubleshoot-app-6b8986c555-p29dp 0/1 ImagePullBackOff 0 2m56s
troubleshoot-app-6b8986c555-vpv5q 0/1 ImagePullBackOff 0 2m56s
Изучите детали и логи пода:
## Замените 'xxx-yyy' на фактическое имя пода
POD_NAME=$(kubectl get pods -l app=troubleshoot -o jsonpath='{.items[0].metadata.name}')
kubectl describe pod $POD_NAME
kubectl logs $POD_NAME
Вы увидите статус и логи пода, указывающие на сбой при загрузке образа.
Failed to pull image "nginx:non-existent-tag"
Решите проблему, исправив образ:
nano problematic-deployment.yaml
Обновите образ на действительный тег:
image: nginx:1.24.0-alpine
Примените исправленное развертывание снова:
kubectl apply -f problematic-deployment.yaml
Проверьте статус подов еще раз:
kubectl get pods -l app=troubleshoot
Пример вывода:
NAME READY STATUS RESTARTS AGE
troubleshoot-app-5dc9b58d57-bvqbr 1/1 Running 0 5s
troubleshoot-app-5dc9b58d57-tdksb 1/1 Running 0 8s
troubleshoot-app-5dc9b58d57-xdq5n 1/1 Running 0 6s
Основные моменты диагностики сбоев:
- Используйте
kubectl describe, чтобы просмотреть события развертывания и подов. - Проверьте статус подов на наличие
ImagePullBackOffили других состояний ошибки. - Изучите логи подов для получения подробной информации об ошибке.
- Проверьте доступность образа и правильность тега.
Откат к стабильной версии
На этом шаге вы узнаете, как откатить развертывание в Kubernetes до предыдущей стабильной версии с помощью команды kubectl rollout undo.
Сначала перейдите в директорию проекта:
cd ~/project/k8s-manifests
Проверьте историю развертывания веб-приложения:
kubectl rollout history deployment web-app
Пример вывода:
REVISION CHANGE-CAUSE
1 <none>
2 <none>
Проверьте текущие детали развертывания:
kubectl describe deployment web-app | grep Image
Пример вывода:
Image: nginx:1.24.0-alpine
Выполните откат к предыдущей ревизии:
kubectl rollout undo deployment web-app
Пример вывода:
deployment.apps/web-app rolled back
Проверьте откат:
kubectl rollout status deployment web-app
Пример вывода:
Waiting for deployment "web-app" to roll out...
deployment "web-app" successfully rolled out
Проверьте обновленную версию образа:
kubectl get pods -l app=web -o jsonpath='{range.items[*]}{.metadata.name}{"\t"}{.spec.containers[0].image}{"\n"}{end}'
Пример вывода:
web-app-xxx-yyy nginx:1.23.3-alpine
web-app-xxx-zzz nginx:1.23.3-alpine
web-app-xxx-www nginx:1.23.3-alpine
Подтвердите историю развертывания:
kubectl rollout history deployment web-app
Пример вывода:
REVISION CHANGE-CAUSE
2 <none>
3 <none>
Основные моменты отката:
- Команда
kubectl rollout undoвозвращает развертывание к предыдущей ревизии. - Kubernetes сохраняет историю изменений развертывания.
- Откат выполняется без простоя.
- Откат создает новую ревизию в истории.
Настроить стратегию последовательного обновления в YAML-файле развертывания
На этом шаге вы узнаете, как настроить стратегию последовательного обновления в развертывании Kubernetes, чтобы контролировать процесс обновления и масштабирования приложений.
Сначала перейдите в директорию проекта:
cd ~/project/k8s-manifests
Создайте новый манифест развертывания с настраиваемой стратегией последовательного обновления:
nano custom-rollout-deployment.yaml
Добавьте следующее содержимое:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app-custom-rollout
labels:
app: web
spec:
replicas: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 2
maxSurge: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.24.0-alpine
ports:
- containerPort: 80
Примените развертывание:
kubectl apply -f custom-rollout-deployment.yaml
Пример вывода:
deployment.apps/web-app-custom-rollout created
Проверьте статус развертывания:
kubectl rollout status deployment web-app-custom-rollout
Пример вывода:
Waiting for deployment "web-app-custom-rollout" to roll out...
deployment "web-app-custom-rollout" successfully rolled out
Опишите развертывание, чтобы подтвердить стратегию:
kubectl describe deployment web-app-custom-rollout
Пример вывода будет содержать:
StrategyType: RollingUpdate
RollingUpdateStrategy: 2 max unavailable, 3 max surge
Обновите образ, чтобы запустить последовательное обновление:
kubectl set image deployment/web-app-custom-rollout nginx=nginx:1.25.0-alpine
Следите за процессом обновления:
kubectl rollout status deployment web-app-custom-rollout
Основные моменты стратегии последовательного обновления:
maxUnavailable: Максимальное количество подов, которые могут быть недоступными во время обновления.maxSurge: Максимальное количество подов, которые могут быть созданы сверх желаемого количества.- Помогает контролировать скорость обновления и доступность приложения.
- Позволяет тонко настраивать поведение развертывания.
Резюме
В этом практическом занятии вы научились запускать и проверять локальный кластер Kubernetes с использованием Minikube, что является важным первым шагом при настройке среды разработки Kubernetes. Вы также узнали, как создать и развернуть простое веб-приложение с использованием Kubernetes Deployment, используя образ NGINX в качестве примерного приложения. Процесс развертывания включал создание файла манифеста развертывания и его применение к кластеру.
После развертывания начальной версии приложения вы научились обновлять образ приложения в YAML-файле развертывания, проверять успешность обновления, симулировать и диагностировать сбои обновления, откатывать до стабильной версии и настраивать стратегию последовательного обновления в YAML-файле развертывания.


