Репозиторий для работы над домашними заданиями в рамках курса "DevOps практики и инструменты"
- ДЗ № 12 - Docker контейнеры. Docker под капотом
- ДЗ № 13 - Docker образы. Микросервисы
- ДЗ № 14 - Сетевое взаимодействие Docker контейнеров. Docker Compose. Тестирование образов
- ДЗ № 15 - Устройство Gitlab CI. Построение процесса непрерывной интеграции
- ДЗ № 16 - Введение в мониторинг. Модели и принципы работы систем мониторинга
- ДЗ № 17 - Применение системы логирования в инфраструктуре на основе Docker
- ДЗ № 18 - Введение в Kubernetes #1
- ДЗ № 19 - Основные модели безопасности и контроллеры в Kubernetes
- ДЗ № 20 - Ingress-контроллеры и сервисы в Kubernetes
- ДЗ № 21 - Интеграция Kubernetes в GitlabCI
- Основное ДЗ
- Задание с ⭐ Развертывание Docker и деплой контейнера в Yandex Cloud
- Повторил известные мне команды Docker CLI
- Собрал образ для приложения Reddit-App (пока монолит)
- Ознакомился с депрекейтед уже docker-machine
- Задеплоил при помощи docker-machine контейнер в инстансе Yandex Cloud
- Подготовил с использованием Packer + Ansible provision образ в YC с установленным Docker.
- Развернул инстансы с помощью Terraform, количество задается переменной, используется образ, подготовленный в п. 1. Инстансы доступны через Network Load Balancer.
- Запустил контейнер на всех инстансах при помощи Ansible, хосты выбрал с использованием Dynamic Inventory.
Все конфигурационные файлы (Packer, Terraform и Ansible) см. dockermonolith/infra
Вывод Ansible:
$ ansible-playbook site.yml
PLAY [Install Docker] *******************************************************************************************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************************************************************************************
ok: [fhmate3ubd9j2adpicso.auto.internal]
ok: [fhm63ar6a27od5cu8cls.auto.internal]
TASK [Update and upgrade apt packages] **************************************************************************************************************************************************************************
ok: [fhmate3ubd9j2adpicso.auto.internal]
ok: [fhm63ar6a27od5cu8cls.auto.internal]
TASK [Install Docker dependencies] ******************************************************************************************************************************************************************************
ok: [fhmate3ubd9j2adpicso.auto.internal]
ok: [fhm63ar6a27od5cu8cls.auto.internal]
TASK [Add Docker repo key] **************************************************************************************************************************************************************************************
ok: [fhmate3ubd9j2adpicso.auto.internal]
ok: [fhm63ar6a27od5cu8cls.auto.internal]
TASK [Add Docker repository] ************************************************************************************************************************************************************************************
ok: [fhmate3ubd9j2adpicso.auto.internal]
ok: [fhm63ar6a27od5cu8cls.auto.internal]
TASK [Update and upgrade apt packages] **************************************************************************************************************************************************************************
ok: [fhmate3ubd9j2adpicso.auto.internal]
ok: [fhm63ar6a27od5cu8cls.auto.internal]
TASK [Docker install] *******************************************************************************************************************************************************************************************
ok: [fhmate3ubd9j2adpicso.auto.internal]
ok: [fhm63ar6a27od5cu8cls.auto.internal]
TASK [Add user to docker group] *********************************************************************************************************************************************************************************
ok: [fhmate3ubd9j2adpicso.auto.internal]
ok: [fhm63ar6a27od5cu8cls.auto.internal]
PLAY [Run Reddit-app container] *********************************************************************************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************************************************************************************
ok: [fhmate3ubd9j2adpicso.auto.internal]
ok: [fhm63ar6a27od5cu8cls.auto.internal]
TASK [Container run] ********************************************************************************************************************************************************************************************
--- before
+++ after
@@ -1,3 +1,3 @@
{
- "running": false
+ "running": true
}
changed: [fhmate3ubd9j2adpicso.auto.internal]
--- before
+++ after
@@ -1,3 +1,3 @@
{
- "running": false
+ "running": true
}
changed: [fhm63ar6a27od5cu8cls.auto.internal]
PLAY RECAP ******************************************************************************************************************************************************************************************************
fhm63ar6a27od5cu8cls.auto.internal : ok=10 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
fhmate3ubd9j2adpicso.auto.internal : ok=10 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- Основное ДЗ
- Задание с ⭐ запуск с другими сетевыми алиасами
- Задание с ⭐ оптимизация размера образа
- Переписал неоптимальные инструкции в предложенных Dockerfile.
- Собрал образы для каждого микросервиса.
- Запустил минкросервисы и убедился, что сайт работает корректно.
$ docker run -d --network=reddit -p 9292:9292 -e POST_SERVICE_HOST=post_app -e COMMENT_SERVICE_HOST=comment_app voitenkov/ui:2.0
$ docker run -d --network=reddit --network-alias=post_app -e POST_DATABASE_HOST=mongo_db voitenkov/post:1.0
$ docker run -d --network=reddit --network-alias=comment_app -e COMMENT_DATABASE_HOST=comment_db voitenkov/comment:1.0
$ docker run -d --network=reddit -p 9292:9292 -e POST_SERVICE_HOST=post_app -e COMMENT_SERVICE_HOST=comment_app voitenkov/ui:2.0
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c521a0143f69 voitenkov/ui:2.0 "puma" 45 seconds ago Up 44 seconds 0.0.0.0:9292->9292/tcp, :::9292->9292/tcp trusting_kalam
aae24353bbb6 voitenkov/comment:1.0 "puma" 2 minutes ago Up 2 minutes friendly_mcnulty
803861e5002b voitenkov/post:1.0 "python3 post_app.py" 3 minutes ago Up 3 minutes interesting_wilbur
e22fb1e18d15 mongo:3.2 "docker-entrypoint.s…" 6 minutes ago Up 6 minutes 27017/tcp amazing_jennings
$ curl localhost:9292
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='utf-8'>
<meta content='IE=Edge,chrome=1' http-equiv='X-UA-Compatible'>
<meta content='width=device-width, initial-scale=1.0' name='viewport'>
<title>Microservices Reddit :: All posts</title>
...
<a class='navbar-brand' href='/'>Microservices Reddit in c521a0143f69 container</a>
<div class='navbar-collapse collapse navbar-responsive-collapse'></div>
Заменил образы на Alpine, разница налицо. UI 3.0 - заменил образ Ubuntu на Alpine, по другим образам я изначально прописал Alpine образы:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
voitenkov/ui 3.0 abd2050e7ce0 7 seconds ago 297MB
voitenkov/ui 2.0 b0cd99a1268e 19 hours ago 487MB
voitenkov/post 1.0 69881f7281a9 19 hours ago 121MB
voitenkov/comment 1.0 edcb89e74894 20 hours ago 294MB
mongo 3.2 fb885d89ea5c 4 years ago 300MB
ruby 2.2 6c8e6f9667b2 5 years ago 715MB
ruby 2.2.10-alpine d212148e08f7 5 years ago 107MB
python 3.6.0-alpine cb178ebbf0f2 6 years ago 88.6MB
- Основное ДЗ
- Задание с ⭐ Создайте docker-compose.override.yml для reddit проекта
- Потренировался с настройкой сетевого взаимодействия контейнеров в Docker
- Вспомнил как работать с Docker Compose
docker run -ti --rm --network host joffotron/docker-net-tools -c ifconfig
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1194e2760984 nginx "/docker-entrypoint.…" About a minute ago Up About a minute interesting_snyder
$ docker run --network host -d nginx
1aad755a8132ac15343b82352dd5ea7caeb0dce6e033640583322a8f653ed898
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1aad755a8132 nginx "/docker-entrypoint.…" 2 seconds ago Up 2 seconds amazing_chebyshev
1194e2760984 nginx "/docker-entrypoint.…" 2 minutes ago Up 2 minutes interesting_snyder
$ docker run --network host -d nginx
6110444caf0b6a0ee7af345a5c69fefee4086ef16536bca67f1841709e57e85b
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6110444caf0b nginx "/docker-entrypoint.…" 2 seconds ago Up 1 second xenodochial_benz
1194e2760984 nginx "/docker-entrypoint.…" 2 minutes ago Up 2 minutes interesting_snyder
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1194e2760984 nginx "/docker-entrypoint.…" 2 minutes ago Up 2 minutes interesting_snyder
Видно, что следующие контейнеры не могут запуститься, так как пытаются "сесть" на один и тот же порт.
Задание: узнайте как образуется базовое имя проекта. Можно ли его задать? Если можно то как? Ответ: базовое имя проекта формируется из имени каталога, в котором размещен проект, можно задать переменной PROJECT_NAME, которую можно прописать в файле .env.
Окончательный вариант с docker-compose.override.yml:
$ docker compose up
[+] Running 6/6
✔ Network back_net Created 0.2s
✔ Network front_net Created 0.1s
✔ Container src-post_db-1 Created 0.0s
✔ Container src-post-1 Created 0.0s
✔ Container src-comment-1 Created 0.0s
✔ Container src-ui-1 Created 0.0s
Attaching to src-comment-1, src-post-1, src-post_db-1, src-ui-1
src-post_db-1 | 2023-11-04T12:46:00.329+0000 I CONTROL [initandlisten] MongoDB starting : pid=1 port=27017 dbpath=/data/db 64-bit host=f28f84709433
src-post_db-1 | 2023-11-04T12:46:00.329+0000 I CONTROL [initandlisten] db version v3.2.21
src-post_db-1 | 2023-11-04T12:46:00.329+0000 I CONTROL [initandlisten] git version: 1ab1010737145ba3761318508ff65ba74dfe8155
src-post_db-1 | 2023-11-04T12:46:00.329+0000 I CONTROL [initandlisten] OpenSSL version: OpenSSL 1.0.1t 3 May 2016
...
src-ui-1 | [1] - Worker 0 (pid: 8) booted, phase: 0
src-ui-1 | [1] - Worker 1 (pid: 12) booted, phase: 0
src-comment-1 | * Listening on tcp://0.0.0.0:9292
Видим, что запущено 2 воркера, override сработал
- Основное ДЗ
- Задание с ⭐ Автоматизация развёртывания GitLab (по желанию)
- Задание с ⭐ Запуск reddit в контейнере (по желанию)
- Задание с ⭐ Автоматизация развёртывания GitLab Runner (по желанию)
- Задание с ⭐ Настройка оповещений в Slack (по желанию)
- Подготовил инсталляцию Gitlab CI CE
- Подготовил репозиторий с кодом приложения
- Описал для приложения этапы пайплайна
- Определил окружения, включая динамические
Docker установил через userdata Cloud-init Terraform'ом. Gitlab запустил с использованием модуля Ansible docker_container, см: (gitlab-ci/infra/run_container.yml)[gitlab-ci/infra/run_container.yml].
Результат:
$ ansible-playbook run_container.yml
PLAY [Run Gitlab container] *************************************************************************************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************************************************************************************
ok: [gitlab.ru-central1.internal]
TASK [Container run] ********************************************************************************************************************************************************************************************
--- before
+++ after
@@ -1,4 +1,4 @@
{
- "exists": false,
- "running": false
+ "exists": true,
+ "running": true
}
changed: [gitlab.ru-central1.internal]
PLAY RECAP ******************************************************************************************************************************************************************************************************
gitlab.ru-central1.internal : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Доработал build_job:
build_job:
stage: build
image: docker:20.10.12-dind-rootless
before_script:
- until docker info; do sleep 1; done
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
script:
- cd reddit
- >
docker build
--tag $CI_REGISTRY_IMAGE/reddit-app:0.0.$CI_PIPELINE_IID
--tag $CI_REGISTRY_IMAGE/reddit-app:latest
.
- docker push $CI_REGISTRY_IMAGE/reddit-app:0.0.$CI_PIPELINE_IID
- docker push $CI_REGISTRY_IMAGE/reddit-app:latest
и branch_review задание:
branch_review:
stage: review
image: alpine:3.15.0
environment:
name: branch/$CI_COMMIT_REF_NAME
url: http://$CI_ENVIRONMENT_SLUG.example.com
only:
- branches
except:
- main
before_script:
- apk add openssh-client bash
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- echo "$SSH_KNOWN_HOSTS" >> ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
script:
- ssh ${DEV_USER}@${DEV_HOST}
"setsid /bin/bash -s " < ./reddit/deploy.sh
GitLab Runner уже установлен через userdata Cloud-init Terraform'ом.
Слака на курсе и в РФ нет, интегрироваться не с чем. Когда был доступен, дергал web-hook прямо из пайплайна.
- Основное ДЗ
- Задание с ⭐ Добавьте в Prometheus мониторинг MongoDB с использованием необходимого экспортера
- Задание с ⭐ Добавьте в Prometheus мониторинг сервисов comment, post, ui с помощью blackbox-exporter
- Задание с ⭐ Напишите Makefile , который в минимальном варианте умеет билдить и пушить Docker-образы
- Prometheus: запуск, конфигурация, знакомство с Web UI
- Мониторинг состояния микросервисов
- Сбор метрик хоста с использованием экспортера
Ссылка реджистри с собранными образами: https://hub.docker.com/u/voitenkov
Добавляем новый сервис:
mongodb-exporter:
container_name: mongodb-exporter
image: percona/mongodb_exporter:0.30.0
ports:
- '9216:9216'
command:
- '--mongodb.uri=mongodb://mongo_db:27017'
- '--compatible-mode'
- '--mongodb.direct-connect=true'
networks:
- front_net
- back_net
depends_on:
- mongo_db
Собираем образ с конфигом:
modules:
http_2xx:
prober: http
timeout: 5s
http:
valid_http_versions: ["HTTP/1.1", "HTTP/2.0"]
valid_status_codes: []
method: GET
follow_redirects: false
Добавляем новые таргеты в конфиг promethetus и его тоже пересобираем:
- job_name: 'blackbox'
metrics_path: /metrics
params:
module: [http_2xx]
static_configs:
- targets:
- http://ui:9292
- http://comment:9292
- http://post:9292
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: blackbox-exporter:9115
и добавляем новый сервис:
blackbox-exporter:
container_name: blackbox-exporter
image: ${USERNAME}/blackbox-exporter:latest
ports:
- '9115:9115/tcp'
networks:
- back_net
- front_net
В результате получаем:
$ docker compose up -d
[+] Running 10/10
✔ Network front_net Created 0.1s
✔ Network back_net Created 0.1s
✔ Container blackbox-exporter Started 1.9s
✔ Container mongodb Started 1.5s
✔ Container node-exporter Started 1.9s
✔ Container prometheus Started 2.1s
✔ Container comment Started 3.4s
✔ Container mongodb-exporter Started 3.3s
✔ Container post Started 3.3s
✔ Container ui Started 3.8s
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2ba9f1010c8b voitenkov/ui:latest "puma" 8 seconds ago Up 4 seconds 0.0.0.0:9292->9292/tcp, :::9292->9292/tcp ui
3bf89aec50d8 voitenkov/post:latest "python3 post_app.py" 8 seconds ago Up 5 seconds post
9a6c066785c6 voitenkov/comment:latest "puma" 8 seconds ago Up 5 seconds comment
b5ca54b1b09a percona/mongodb_exporter:0.30.0 "/mongodb_exporter -…" 8 seconds ago Up 5 seconds 0.0.0.0:9216->9216/tcp, :::9216->9216/tcp mongodb-exporter
a687a7fcdc55 voitenkov/blackbox-exporter:latest "/bin/blackbox_expor…" 8 seconds ago Up 6 seconds 0.0.0.0:9115->9115/tcp, :::9115->9115/tcp blackbox-exporter
5a5003218409 prom/node-exporter:v0.15.2 "/bin/node_exporter …" 8 seconds ago Up 6 seconds 9100/tcp node-exporter
c805ecfd14fb voitenkov/prometheus:latest "/bin/prometheus --c…" 8 seconds ago Up 6 seconds 0.0.0.0:9090->9090/tcp, :::9090->9090/tcp prometheus
4a9771672a61 mongo:3.2 "docker-entrypoint.s…" 8 seconds ago Up 7 seconds 27017/tcp mongodb
Prometheus в окончательном варианте:
Makefile см. в monitoring/Makefile
- Основное ДЗ
- Задание сo ⭐ Разбор ещё одного формата логов (по желанию)
- Задание сo ⭐ Траблшутинг UI-экспириенса (по желанию)
- Подготовка окружения
Так как Docker Machine deprecated, создал Терраформом инстанс в YC с установленным Docker, все стандартно как в предыдущих ДЗ.
- Логирование Docker-контейнеров
Поднял в Docker с использованием Docker compose следующие контейнеры:
- Elasticsearch
- Kibana
- Fluent-bit (сейчас актуален, так как он легче, чем Fluentd)
-
Сбор неструктурированных логов
-
Визуализация логов (Kibana)
-
Сбор структурированных логов
-
Распределенный трейсинг (Zipkin)
- Основное ДЗ
- Задание с ⭐ Опишите установку кластера k8s с помощью terraform и ansible
- Разобрал на практике все компоненты Kubernetes, развернуть их вручную используя kubeadm
- Ознакомился с описанием основных примитивов нашего приложения и его дальнейшим запуском в Kubernetes
Развернул кластер K8s с использованием kubeadm:
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --upload-certs --kubernetes-version=v1.28.0 --ignore-preflight-errors=Mem
sudo kubeadm join 192.168.10.8:6443 --token ij2uef.bi2rn2dyhilz401e --discovery-token-ca-cert-hash sha256:216c05cc3bdc07b39cc6fa245b1ec5388111046a2e70520202503b64e3b9edb3
Установил CALICO:
export CALICO_IPV4POOL_CIDR=10.244.0.0/16
wget https://projectcalico.docs.tigera.io/manifests/calico.yaml
sed -i -r -e 's/^([ ]+)# (- name: CALICO_IPV4POOL_CIDR)$\n/\1\2\n\1 value: "10.244.0.0\/16"/g' calico.yaml
kubectl apply -f calico.yaml
Кластер работоспособен:
NAME STATUS ROLES AGE VERSION
kuber1 Ready control-plane 18m v1.28.0
kuber2 Ready <none> 6m40s v1.28.0
Задеплоил поды:
$ kubectl apply -f reddit
Приложение устновлено:
$ kubectl get all -A
NAMESPACE NAME READY STATUS RESTARTS AGE
default pod/comment-7c97c4589f-wbgzt 1/1 Running 0 5m27s
default pod/mongo-58f4cf4c5f-r9hqz 0/1 Pending 0 5m27s
default pod/mongo-5f649fdb6d-thcrp 0/1 Pending 0 62s
default pod/post-76c769dbbd-g4b68 1/1 Running 0 5m27s
default pod/ui-6c584b986c-frlc5 1/1 Running 0 5m27s
kube-system pod/calico-kube-controllers-7ddc4f45bc-sw7d9 1/1 Running 0 11m
kube-system pod/calico-node-rb7q5 1/1 Running 0 11m
kube-system pod/calico-node-rck8k 1/1 Running 0 11m
kube-system pod/coredns-5dd5756b68-7xlfl 1/1 Running 0 28m
kube-system pod/coredns-5dd5756b68-hnnd9 1/1 Running 0 28m
kube-system pod/etcd-kuber1 1/1 Running 0 28m
kube-system pod/kube-apiserver-kuber1 1/1 Running 0 28m
kube-system pod/kube-controller-manager-kuber1 1/1 Running 0 28m
kube-system pod/kube-proxy-cnxwx 1/1 Running 0 28m
kube-system pod/kube-proxy-p8q45 1/1 Running 0 16m
kube-system pod/kube-scheduler-kuber1 1/1 Running 0 28m
Для установки и подготовки виртуалок к устновке Kubernetes использовал Terraform + Userdata файл CloudInit. Писать отдельную роль Ansible только для kubeadm init и join не стал. Для этого есть уже Kubespray.
- Основное ДЗ
- Задание с ⭐ Разверните Kubernetes-кластер в Yandex cloud с помощью Terraform
- Задание с ⭐ Создайте YAML-манифесты для описания созданных сущностей для включения dashboard
- Развернул локальное окружение для работы с Kubernetes (Minikube)
- Развернул Kubernetes в Yandex Cloud
- Запустил Reddit в Kubernetes
Приложение успешно запустилось в Yandex Cloud Managed Kubernetes:
$ k get all -n dev
NAME READY STATUS RESTARTS AGE
pod/comment-858c5c7d76-z82pt 1/1 Running 0 5m43s
pod/mongo-f474f9d56-mm4kg 1/1 Running 0 6m1s
pod/post-67856b8bd6-bw4rc 1/1 Running 0 6m
pod/ui-7d6fbbfc78-4rzcz 1/1 Running 0 5m59s
pod/ui-7d6fbbfc78-cbnv6 1/1 Running 0 5m59s
pod/ui-7d6fbbfc78-n4z6j 1/1 Running 0 5m59s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/comment ClusterIP 10.112.227.255 <none> 9292/TCP 5m43s
service/comment-db ClusterIP 10.112.136.108 <none> 27017/TCP 5m43s
service/mongodb ClusterIP 10.112.143.229 <none> 27017/TCP 6m
service/post ClusterIP 10.112.226.109 <none> 5000/TCP 6m
service/post-db ClusterIP 10.112.216.77 <none> 27017/TCP 6m
service/ui NodePort 10.112.168.1 <none> 80:32092/TCP 5m59s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/comment 1/1 1 1 5m43s
deployment.apps/mongo 1/1 1 1 6m1s
deployment.apps/post 1/1 1 1 6m
deployment.apps/ui 3/3 3 3 5m59s
NAME DESIRED CURRENT READY AGE
replicaset.apps/comment-858c5c7d76 1 1 1 5m43s
replicaset.apps/mongo-f474f9d56 1 1 1 6m1s
replicaset.apps/post-67856b8bd6 1 1 1 6m
replicaset.apps/ui-7d6fbbfc78 3 3 3 5m59s
Давно уже в YC все разворачиваю исключительно Терраформом. см. в kubernetes/infra
Манифесты для Dashbord см. kubernetes/dashboard
- Основное ДЗ
- Задание с ⭐ Опишите создаваемый объект Secret в виде Kubernetes-манифеста.
- Задеплоил сущности:
- Ingress Controller
- Ingress
- Secret
- TLS
- LoadBalancer Service
- Network Policies
- PersistentVolumes
- PersistentVolumeClaims
- Потренировался с сетевыми политиками CALICO
Запущенное через Ingress приложение:
---
apiVersion: v1
kind: Secret
metadata:
name: ui-ingress
data:
tls.crt: base64 encoded cert
tls.key: base64 encoded key
type: kubernetes.io/tls
- Основное ДЗ
- Задание с ⭐ Свяжите пайплайны сборки образов и пайплайн деплоя на staging и production так, чтобы после релиза образа из ветки мастер запускался деплой уже новой версии приложения на production
-
Подготовил и задеплоил Helm-чарты приложения
Helm-чарт задеплоен из пайплайна:
$ helm ls -A
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
gitlab default 1 2023-11-27 14:49:36.856534818 +0200 EET deployed gitlab-7.6.0 v16.6.0
review-voitenkov-k4huzk review 1 2023-11-28 22:41:07.468403722 +0000 UTC deployed reddit-0.1.0
yc-k8s gitlab-agent-yc-k8s 1 2023-11-28 00:42:39.056428334 +0200 EET deployed gitlab-agent-1.21.0 v16.6.0
Приложение работает:
$ k get all -n review
NAME READY STATUS RESTARTS AGE
pod/review-voitenkov-k4huzk-comment-6c59bb66cf-2d89s 1/1 Running 0 78s
pod/review-voitenkov-k4huzk-mongodb-8597c77cf5-hl96h 1/1 Running 0 78s
pod/review-voitenkov-k4huzk-post-84b7df8b67-zwq4j 1/1 Running 0 78s
pod/review-voitenkov-k4huzk-ui-77c68d7898-672ps 1/1 Running 0 78s
pod/review-voitenkov-k4huzk-ui-77c68d7898-w25lg 1/1 Running 0 78s
pod/review-voitenkov-k4huzk-ui-77c68d7898-xbj72 1/1 Running 0 78s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/mongodb ClusterIP 10.112.187.88 <none> 27017/TCP 79s
service/review-voitenkov-k4huzk-comment ClusterIP 10.112.132.27 <none> 9292/TCP 79s
service/review-voitenkov-k4huzk-post ClusterIP 10.112.170.77 <none> 5000/TCP 79s
service/ui NodePort 10.112.177.3 <none> 80:32092/TCP 79s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/review-voitenkov-k4huzk-comment 1/1 1 1 79s
deployment.apps/review-voitenkov-k4huzk-mongodb 1/1 1 1 79s
deployment.apps/review-voitenkov-k4huzk-post 1/1 1 1 79s
deployment.apps/review-voitenkov-k4huzk-ui 3/3 3 3 79s
NAME DESIRED CURRENT READY AGE
replicaset.apps/review-voitenkov-k4huzk-comment-6c59bb66cf 1 1 1 79s
replicaset.apps/review-voitenkov-k4huzk-mongodb-8597c77cf5 1 1 1 79s
replicaset.apps/review-voitenkov-k4huzk-post-84b7df8b67 1 1 1 79s
replicaset.apps/review-voitenkov-k4huzk-ui-77c68d7898 3 3 3 79s
Staging и Production приложения запущены:
$ helm ls -A
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
gitlab default 1 2023-11-27 14:49:36.856534818 +0200 EET deployed gitlab-7.6.0 v16.6.0
production production 1 2023-11-29 20:38:39.97173519 +0000 UTC deployed reddit-0.1.0
staging staging 2 2023-11-29 20:35:39.543122209 +0000 UTC deployed reddit-0.1.0
yc-k8s gitlab-agent-yc-k8s 1 2023-11-28 00:42:39.056428334 +0200 EET deployed gitlab-agent-1.21.0 v16.6.0
- Изучил auto-devops стиль пайплайнов, перевел их в "пайплайн здорового человека". Если скрипты огромные, то auto-devops будет лучше имхо.
Задание с ⭐ Свяжите пайплайны сборки образов и пайплайн деплоя на staging и production так, чтобы после релиза образа из ветки мастер запускался деплой уже новой версии приложения на production
см. kubernetes/Charts/gitlabci/.gitlab-ci-auto-deploy-to-prod.yml
- Выставлен label с темой домашнего задания