CI/CD позволяет автоматизировать процесс разработки, тестирования и развертывания приложений, что приводит к повышению производительности, сокращению ошибок и уменьшению времени рынка. Организации, которые используют CI/CD, могут сократить time to market на 50% и увеличить производительность на 30%.
Микросервисная архитектура подразумевает разделение приложения на множество независимых сервисов, каждый из которых может быть развернут и обновлен отдельно. Контейнеризация позволяет упаковать каждый сервис в отдельный контейнер, что обеспечивает изоляцию и переносимость.
В нашем примере мы имеем три среды: тестовая, предпромышленная и промышленная. Каждая среда имеет свою собственную версию приложения и сервисов.
GitLab предлагает полную платформу для CI/CD, включая автоматическую сборку, тестирование и развертывание приложений. Чтобы настроить CI/CD в GitLab для Kubernetes, нам необходимо выполнить следующие шаги:
- Создайте новый проект в GitLab и добавьте репозиторий с кодом приложения.
- Запустите базу данных PostgreSQL в кластере Kubernetes с созданием persistent volume для данных.
- Запустите очередь сообщений RabbitMQ
- В файле .gitlab-ci.yml настройте автоматическую сборку и тестирование приложения.
- Добавьте кластер Kubernetes в GitLab как источник для развертывания приложения.
- Настройте Helm для управления пакетами и развертыванием приложения в Kubernetes.
Далее рассмотрим выполнение этих шагов более подробно.
Шаг 1. Создание нового проекта в GitLab и добавление репозитория с кодом приложения
1.1. Зарегистрируйтесь на сайте GitLab и создайте новый проект.
1.2. Создайте репозиторий с кодом приложения и добавьте его в проект GitLab.
Шаг 2. Запуск базы данных PostgreSQL в кластере Kubernetes с созданием persistent volume для данных
2.1. Создайте файл postgres-deployment.yaml с конфигурацией деплоя PostgreSQL.
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres
spec:
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:13
ports:
- containerPort: 5432
volumeMounts:
- name: data
mountPath: /var/lib/postgresql/data
volumes:
- name: data
persistentVolumeClaim:
claimName: postgres-pvc
2.2. Создайте файл postgres-pvc.yaml с конфигурацией persistent volume claim.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
2.3. Примените конфигурацию деплоя и PVC в кластер Kubernetes.
kubectl apply -f postgres-deployment.yaml
kubectl apply -f postgres-pvc.yaml
Шаг 3. Запуск очереди сообщений RabbitMQ
3.1. Создайте файл rabbitmq-deployment.yaml с конфигурацией деплоя RabbitMQ.
apiVersion: apps/v1
kind: Deployment
metadata:
name: rabbitmq
spec:
replicas: 1
selector:
matchLabels:
app: rabbitmq
template:
metadata:
labels:
app: rabbitmq
spec:
containers:
- name: rabbitmq
image: rabbitmq:3-management
ports:
- containerPort: 5672
- containerPort: 15672
3.2. Примените конфигурацию деплоя в кластер Kubernetes.
kubectl apply -f rabbitmq-deployment.yaml
Шаг 4. Настройка автоматической сборки и тестирования приложения в файле .gitlab-ci.yml
4.1. Создайте файл .gitlab-ci.yml в репозитории с кодом приложения.
image: docker:latest
stages:
- build
- test
- deploy
build:
stage: build
script:
- docker build -t my-app .
artifacts:
paths:
- my-app.tar
test:
stage: test
script:
- docker run -it my-app /bin/bash -c "make test"
dependencies:
- build
deploy:
stage: deploy
script:
- kubectl apply -f deployment.yaml
dependencies:
- test
4.2. Добавьте команды сборки и тестирования в файл .gitlab-ci.yml.
Шаг 5. Добавление кластера Kubernetes в GitLab как источник для развертывания приложения
5.1. Войдите в панель управления GitLab и перейдите в раздел CI/CD → «Кластеры».
5.2. Нажмите на кнопку «Добавить кластер» и выберите тип кластера Kubernetes.
5.3. Введите адрес API кластера Kubernetes и другие параметры.
Шаг 6. Настройка Helm для управления пакетами и развертыванием приложения в Kubernetes
6.1. Установите Helm на кластер Kubernetes.
helm init
6.2. Создайте файл values.yaml с конфигурацией Helm.
replicaCount: 1
image:
repository: my-app
tag: latest
6.3. Создайте файл deployment.yaml с конфигурацией деплоя Helm.
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 1
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
6.4. Примените конфигурацию Helm.
helm install my-app .
Теперь при каждом пуше в репозиторий с кодом приложения GitLab автоматически соберет, протестирует и развернет приложение в кластер Kubernetes с помощью Helm.
Пример микросервисной архитектуры
Предположим, у нас есть три среды: тестовая, предпромышленная и промышленная. У каждой среды собственная версия приложения и сервисов.
Тестовая среда:
- Версия приложения: `v1`.
- Версия базы данных PostgreSQL: `v1`.
- Версия очереди сообщений RabbitMQ: `v1`.
Предпромышленная среда:
- Версия приложения: `v2`.
- Версия базы данных PostgreSQL: `v2`.
- Версия очереди сообщений RabbitMQ: `v2`.
Промышленная среда:
- Версия приложения: `v3`.
- Версия базы данных PostgreSQL: `v3`.
- Версия очереди сообщений RabbitMQ: `v3`.
В .gitlab-ci.yml можно настроить развертывание приложения в каждую среду отдельно.
stages:
- deploy-test
- deploy-preprod
- deploy-prod
deploy-test:
stage: deploy-test
script:
- helm install my-app-test .
environment:
name: test
url: https://test.example.com
deploy-preprod:
stage: deploy-preprod
script:
- helm install my-app-preprod .
environment:
name: preprod
url: https://preprod.example.com
deploy-prod:
stage: deploy-prod
script:
- helm install my-app-prod .
environment:
name: prod
url: https://prod.example.com
В этом примере GitLab автоматически развернет приложение в каждую среду отдельно, используя Helm и конфигурацию values.yaml для каждой среды.
Надеюсь, это поможет настроить CI/CD в GitLab для Kubernetes!