0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p><strong>Ниже приведён пример реализации zero-downtime deployment с помощью Kubernetes по стратегии<a>Rolling Update</a></strong></p>
1
<p><strong>Ниже приведён пример реализации zero-downtime deployment с помощью Kubernetes по стратегии<a>Rolling Update</a></strong></p>
2
<h2>Пример файла ansible/monitoring.yml</h2>
2
<h2>Пример файла ansible/monitoring.yml</h2>
3
--- - 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<h2>Пример файла ansible/requirements.yml</h2>
3
--- - 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<h2>Пример файла ansible/requirements.yml</h2>
4
roles: - name: datadog.datadog<h2>Пример файла ansible/monitoring.ini</h2>
4
roles: - name: datadog.datadog<h2>Пример файла ansible/monitoring.ini</h2>
5
; определяем один хост с именем monitoring [monitoring] 64.225.78.51<h2>Пример файла k8s/app-deployment.yaml</h2>
5
; определяем один хост с именем monitoring [monitoring] 64.225.78.51<h2>Пример файла k8s/app-deployment.yaml</h2>
6
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: {}<h2>Пример файла k8s/app-service.yaml</h2>
6
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: {}<h2>Пример файла k8s/app-service.yaml</h2>
7
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: {}<h2>Пример файла k8s/env-configmap.yaml</h2>
7
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: {}<h2>Пример файла k8s/env-configmap.yaml</h2>
8
apiVersion: v1 data: SERVER_MESSAGE: Hello from Kubernetes kind: ConfigMap metadata: creationTimestamp: null labels: io.kompose.service: app-env name: env<h2>Примеры команд</h2>
8
apiVersion: v1 data: SERVER_MESSAGE: Hello from Kubernetes kind: ConfigMap metadata: creationTimestamp: null labels: io.kompose.service: app-env name: env<h2>Примеры команд</h2>
9
# Перезапуск подов приложения 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
9
# Перезапуск подов приложения 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