Обновление и откат приложений

KubernetesKubernetesBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном занятии вы научитесь обновлять и откатывать приложения, развернутые в кластере Kubernetes. Вы начнете с настройки локального кластера Kubernetes с использованием Minikube, а затем развернете пример приложения NGINX. Затем вы обновите образ приложения и убедитесь, что обновление прошло успешно. Чтобы смоделировать сбои обновления, вы диагностируете проблемы и затем откатываетесь к стабильной версии. Наконец, вы измените стратегию последовательного обновления в файле YAML Deployment.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/BasicsGroup(["Basics"]) kubernetes(("Kubernetes")) -.-> kubernetes/BasicCommandsGroup(["Basic Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/AdvancedCommandsGroup(["Advanced Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/AdvancedDeploymentGroup(["Advanced Deployment"]) kubernetes(("Kubernetes")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["Troubleshooting and Debugging Commands"]) kubernetes/BasicsGroup -.-> kubernetes/initialization("Initialization") kubernetes/BasicCommandsGroup -.-> kubernetes/get("Get") kubernetes/BasicCommandsGroup -.-> kubernetes/create("Create") kubernetes/BasicCommandsGroup -.-> kubernetes/set("Set") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("Apply") kubernetes/AdvancedDeploymentGroup -.-> kubernetes/rollout("Rollout") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("Describe") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/logs("Logs") subgraph Lab Skills kubernetes/initialization -.-> lab-434649{{"Обновление и откат приложений"}} kubernetes/get -.-> lab-434649{{"Обновление и откат приложений"}} kubernetes/create -.-> lab-434649{{"Обновление и откат приложений"}} kubernetes/set -.-> lab-434649{{"Обновление и откат приложений"}} kubernetes/apply -.-> lab-434649{{"Обновление и откат приложений"}} kubernetes/rollout -.-> lab-434649{{"Обновление и откат приложений"}} kubernetes/describe -.-> lab-434649{{"Обновление и откат приложений"}} kubernetes/logs -.-> lab-434649{{"Обновление и откат приложений"}} end

Запуск кластера 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

Основные моменты этого шага:

  1. Команда minikube start создает локальный одноузловой кластер Kubernetes
  2. Кластер использует Docker в качестве драйвера по умолчанию
  3. Автоматически настраивается Kubernetes v1.26.1
  4. Команды 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

Основные моменты этого развертывания:

  1. Мы создали Deployment с 3 репликами веб-сервера NGINX
  2. Использовали определенную, стабильную версию NGINX (1.23.3-alpine)
  3. Открыли порт 80 контейнера
  4. Использовали метки (labels) для идентификации и управления подами (pods)

Обновление образа приложения в YAML-файле Deployment

На этом шаге вы узнаете, как обновить образ контейнера в 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

Основные моменты обновления образов:

  1. Используйте kubectl apply для обновления развертываний.
  2. По умолчанию Kubernetes выполняет последовательное обновление (rolling update).
  3. Поды (pods) постепенно заменяются, чтобы сохранить доступность приложения.
  4. Процесс обновления обеспечивает развертывание без простоя.

Проверка успешного обновления

На этом шаге вы узнаете, как проверить успешное обновление развертывания в 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>

Основные моменты проверки:

  1. Все поды работают с новой версией образа.
  2. В развертывании доступно 3 реплики.
  3. Стратегия развертывания обеспечивает обновления без простоя.
  4. Ревизия развертывания была увеличена.

Симуляция и диагностика сбоев обновления

На этом шаге вы узнаете, как диагностировать возможные сбои при обновлении развертывания, симулируя проблемное обновление образа и используя инструменты диагностики 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

Основные моменты диагностики сбоев:

  1. Используйте kubectl describe, чтобы просмотреть события развертывания и подов.
  2. Проверьте статус подов на наличие ImagePullBackOff или других состояний ошибки.
  3. Изучите логи подов для получения подробной информации об ошибке.
  4. Проверьте доступность образа и правильность тега.

Откат к стабильной версии

На этом шаге вы узнаете, как откатить развертывание в 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>

Основные моменты отката:

  1. Команда kubectl rollout undo возвращает развертывание к предыдущей ревизии.
  2. Kubernetes сохраняет историю изменений развертывания.
  3. Откат выполняется без простоя.
  4. Откат создает новую ревизию в истории.

Настройка стратегии последовательного обновления (rolling update) в 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

Основные моменты стратегии последовательного обновления:

  1. maxUnavailable: Максимальное количество подов, которые могут быть недоступными во время обновления.
  2. maxSurge: Максимальное количество подов, которые могут быть созданы сверх желаемого количества.
  3. Помогает контролировать скорость обновления и доступность приложения.
  4. Позволяет тонко настраивать поведение развертывания.

Резюме

В этом практическом занятии вы научились запускать и проверять локальный кластер Kubernetes с использованием Minikube, что является важным первым шагом при настройке среды разработки Kubernetes. Вы также узнали, как создать и развернуть простое веб-приложение с использованием Kubernetes Deployment, используя образ NGINX в качестве примерного приложения. Процесс развертывания включал создание файла манифеста развертывания и его применение к кластеру.

После развертывания начальной версии приложения вы научились обновлять образ приложения в YAML-файле развертывания, проверять успешность обновления, симулировать и диагностировать сбои обновления, откатывать до стабильной версии и настраивать стратегию последовательного обновления в YAML-файле развертывания.