Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Zero-downtime-deployment DevOps: Деплой и эксплуатация

Видео может быть заблокировано из-за расширений браузера. В статье вы найдете решение этой проблемы.

Ниже приведён пример реализации zero-downtime deployment с помощью Kubernetes по стратегии Rolling Update

Пример файла ansible/monitoring.yml

---
- name: Setting up monitoring server
  hosts: monitoring # Хосты для которых выполняется ansible
  remote_user: root
  vars:
    # Тут мы используем значение зашифрованной с помощью vault переменной
    datadog_api_key: !vault |
      $ANSIBLE_VAULT;1.1;AES256
      35613834616138663862363936636531633138363139656164316130346237303331353633396237
      6433336231663931653738623830386630326132343935370a326237393064633433643333643531
      33663630323036666536613936343431343637353436326463643531653163336333333366303261
      6265383336343637611a616166373733336135613632613136633064623562653166353862383330
      64636236613539666666383964633264393633653532346362393039313439636564376338353838
      3166313532303561663164646363373439643138373864616362
    datadog_site: "datadoghq.eu"
    datadog_checks:
      # Добавляем хелфчек, который запрашивает внешний адрес приложения,
      # которое находится в кластере Kubernetes
      http_check:
        init_config:
        instances:
          - name: K8S app status
            url: http://k8s.devops.club
            timeout: 5
            method: GET
            http_response_status_code: 200
  roles:
    - datadog.datadog

Пример файла ansible/requirements.yml

roles:
  - name: datadog.datadog

Пример файла ansible/monitoring.ini

; определяем один хост с именем monitoring
[monitoring]
64.225.78.51

Пример файла k8s/app-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    kompose.cmd: kompose convert
    kompose.version: 1.21.0 (992df58d8)
  creationTimestamp: null
  labels:
    io.kompose.service: app
  name: app
spec:
  # Устанавливаем количество реплик
  replicas: 5
  selector:
    matchLabels:
      io.kompose.service: app
  strategy: {}
  template:
    metadata:
      annotations:
        kompose.cmd: kompose convert
        kompose.version: 1.21.0 (992df58d8)
      creationTimestamp: null
      labels:
        io.kompose.service: app
    spec:
      containers:
      - env:
        - name: ROLLBAR_TOKEN
          valueFrom:
            # Указываем, что данную переменную нужно брать из секретов
            secretKeyRef:
              key: ROLLBAR_TOKEN
              name: app-secret
        - name: SERVER_MESSAGE
          valueFrom:
            configMapKeyRef:
              key: SERVER_MESSAGE
              name: env
        image: hexlet/hexlet-app
        imagePullPolicy: ""
        name: hexlet-app
        ports:
        - containerPort: 3000
        resources: {}
      restartPolicy: Always
      serviceAccountName: ""
      volumes: null
status: {}

Пример файла k8s/app-service.yaml

apiVersion: v1
kind: Service
metadata:
  annotations:
    kompose.cmd: kompose convert
    kompose.version: 1.21.0 (992df58d8)
  creationTimestamp: null
  labels:
    io.kompose.service: app
  name: app
spec:
  # Указываем тип балансера
  type: LoadBalancer
  ports:
  - name: "80"
    port: 80
    targetPort: 5000
  selector:
    io.kompose.service: app
status:
  loadBalancer: {}

Пример файла k8s/env-configmap.yaml

apiVersion: v1
data:
  SERVER_MESSAGE: Hello from Kubernetes
kind: ConfigMap
metadata:
  creationTimestamp: null
  labels:
    io.kompose.service: app-env
  name: env

Примеры команд

# Перезапуск подов приложения
kubectl -n service rollout restart deployment app

# Таким образом можно вывести все поды кластера
kubectl --kubeconfig ~/hexlet-k8s-homework-kubeconfig.yaml get pods

# Применяем изменения к кластеру передавая kubectl файлы конфигурации
kubectl --kubeconfig ~/hexlet-k8s-homework-kubeconfig.yaml apply -f k8s/app-deployment.yaml,k8s/app-service.yaml,k8s/env-configmap.yaml,secret.yml

# Вывести все поды кластера с подробностями
kubectl get pods -o wide

# Вывести все сервисы кластера
kubectl --kubeconfig ~/hexlet-k8s-homework-kubeconfig.yaml get services

# Таким образом можно зашифровать значение hexlet в переменную the_secret
# с помощью пароля в файле vault-password
ansible-vault encrypt_string --vault-password-file vault-password 'hexlet' --name 'the_secret'

# Чтобы расшифровать зашифрованные с помощью Ansible Vault переменные
# если пароль хранится в файле, используется флаг --vault-password-file
ansible-playbook -v --vault-password-file vault-password ansible/monitoring.yml

# Устанавливаем коллекции определённые в файле requirements.yml
ansible-galaxy collection install -r ansible/requirements.yml

# Деплоим приложение
ansible-playbook -v ansible/monitoring.yml

# Подключаемся по ssh к хосту с IP 192.168.0.2
ssh username@192.168.0.2

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»