Вступ
Сучасна розробка програмного забезпечення вимагає швидкості, масштабованості та надійності через швидко змінювану природу технологій та очікувань користувачів. Організації повинні постійно випускати нові функції та оновлення, одночасно забезпечуючи стабільність своїх застосунків та ефективну роботу. Ці вимоги призвели до впровадження конвеєрів CI/CD, які автоматизують та спрощують процеси розробки, тестування та деплою. Вирішуючи ці завдання, конвеєри CI/CD допомагають командам прискорити цикли постачання, зменшити кількість ручних помилок та покращити загальну якість програмного забезпечення. Безперервна інтеграція та безперервне постачання (CI/CD) є основою для досягнення цих цілей, особливо в хмарних середовищах, таких як Kubernetes.
У цьому посібнику ми розглянемо побудову масштабованого конвеєра CI/CD, використовуючи GitHub Actions для CI та ArgoCD для CD.
До кінця цього посібника ви створите повністю функціональний конвеєр, здатний автоматизувати процеси побудови, тестування та деплою для застосунку Kubernetes — Node.js REST API, що повертає поточний час.
Налаштування середовища
Перед тим, як зануритись у реалізацію, переконайтеся, що у вас є наступне:
- Kubernetes Cluster: Робочий кластер Kubernetes (наприклад, Minikube, AKS, EKS або GKE).
- GitHub Repository: Репозиторій, що містить вихідний код вашого застосунку.
- Container Registry: Доступ до реєстру контейнерів Docker (наприклад, Docker Hub або AWS ECR).
- CLI Tools: Встановлені інструменти командного рядка kubectl, Docker та ArgoCD CLI.
Для цього посібника ми використаємо наступний реальний приклад:
-
Застосунок: Node.js REST API, що повертає поточний час.
Цей застосунок був обраний за свою простоту та зрозумілість, що робить його ідеальним прикладом для демонстрації робочих процесів CI/CD. Його легка структура дозволяє зосередитись на автоматизації конвеєра без складнощів з управлінням великою кодовою базою, при цьому він добре відображає реальні сценарії розгортання. -
Репозиторій:
kubernetes-ci-cd-demo
. -
Реєстр контейнерів: Docker Hub (
/current-time-api
).
Щоб слідувати за інструкцією, почніть з форкування репозиторію та клонування його на ваш комп'ютер. Це дозволить вам вносити зміни до коду та пушити їх назад у ваш акаунт GitHub.
Реалізація CI з GitHub Actions
Крок 1: Файл робочого процесу GitHub
Робочий процес GitHub Actions визначається в директорії .github/workflows/
вашого репозиторію. Ця директорія містить конфігураційні файли для Continuous Integration (CI).
У цій директорії зазвичай створюється файл з ім'ям ci-pipeline.yml
, щоб визначити ваш CI конвеєр.
Коли зміни пушаться в репозиторій, запускається робочий процес GitHub Actions. Цей процес складається з завдання під назвою build-and-push
. Це завдання виконує наступні кроки:
- Checkout коду: Воно виводить останню версію коду з репозиторію.
- Налаштування середовища Node.js: Конфігурує середовище Node.js, яке необхідне для запуску проєкту.
- Встановлення залежностей: Встановлює всі необхідні залежності проєкту.
- Запуск тестів: Виконує тести для перевірки, що код працює коректно і без помилок.
- Логін в Docker Hub: Авторизується в Docker Hub для дозволу створення та пушу образів.
6.
Створення та пуш Docker образу: Створюється Docker образ для поточного додатка (в цьому випадку, API часу) та пушиться цей образ на Docker Hub.
Цей Docker образ пізніше буде розгорнутий у Kubernetes кластері, який управляється конвеєром безперервного розгортання ArgoCD.
Крок 2: Визначення CI конвеєра
Ось вміст робочого процесу:
name: CI Pipeline
on:
push:
branches:
- main
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- name: Checkout коду
uses: actions/checkout@v3
- name: Налаштування Node.js
uses: actions/setup-node@v3
with:
node-version: '16'
- name: Встановлення залежностей
run: npm install
- name: Запуск тестів
run: npm test
- name: Логін в Docker Hub
run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
- name: Створення та пуш Docker образу
run: |
docker build -t /current-time-api:${{ github.sha }} .
docker tag /current-time-api:${{ github.sha }} /current-time-api:latest
docker push /current-time-api:${{ github.sha }}
docker push /current-time-api:latest
Інтеграція ArgoCD для безперервного розгортання
Крок 1: Встановлення ArgoCD
- Встановіть ArgoCD у ваш Kubernetes кластер: ArgoCD — це декларативний інструмент для безперервного розгортання (continuous delivery) в Kubernetes, який використовує GitOps підхід. Він дозволяє автоматизувати розгортання та версійний контроль ваших Kubernetes маніфестів шляхом синхронізації їх з вашим Git репозиторієм. Встановлення ArgoCD надасть вам потужну платформу для управління та автоматизації розгортань додатків і їх життєвого циклу у вашому Kubernetes кластері.
Щоб почати, виконайте наступні команди:
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
Щоб перевірити, чи успішно було встановлено ArgoCD на вашому Kubernetes кластері, виконайте команду kubectl.
kubectl get all -n argocd
Команда виведе всі ресурси в просторі імен argocd
.
Ось приклад результатів.
NAME READY STATUS RESTARTS AGE
pod/argocd-application-controller-0 1/1 Running 0 155m
pod/argocd-applicationset-controller-764744455-7zpwz 1/1 Running 0 155m
pod/argocd-dex-server-78df54498c-fkzsg 1/1 Running 0 155m
pod/argocd-notifications-controller-577b87f4bd-5btn2 1/1 Running 0 155m
pod/argocd-redis-564c8b4dd7-8b8vk 1/1 Running 0 155m
pod/argocd-repo-server-6858df88f4-xtgs8 1/1 Running 0 155m
pod/argocd-server-74b5b78785-5twr4 1/1 Running 0 155m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/argocd-applicationset-controller ClusterIP 10.108.143.77 7000/TCP,8080/TCP 155m
service/argocd-dex-server ClusterIP 10.110.187.94 5556/TCP,5557/TCP,5558/TCP 155m
service/argocd-metrics ClusterIP 10.102.187.226 8082/TCP 155m
service/argocd-notifications-controller-metrics ClusterIP 10.103.165.1 9001/TCP 155m
service/argocd-redis ClusterIP 10.103.187.225 6379/TCP 155m
service/argocd-repo-server ClusterIP 10.98.60.104 8081/TCP,8084/TCP 155m
service/argocd-server ClusterIP 10.101.52.110 80/TCP,443/TCP 155m
service/argocd-server-metrics ClusterIP 10.110.0.116 8083/TCP 155m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/argocd-applicationset-controller 1/1 1 1 155m
deployment.apps/argocd-dex-server 1/1 1 1 155m
deployment.apps/argocd-notifications-controller 1/1 1 1 155m
deployment.apps/argocd-redis 1/1 1 1 155m
deployment.apps/argocd-repo-server 1/1 1 1 155m
deployment.apps/argocd-server 1/1 1 1 155m
NAME DESIRED CURRENT READY AGE
replicaset.apps/argocd-applicationset-controller-764744455 1 1 1 155m
replicaset.apps/argocd-dex-server-78df54498c 1 1 1 155m
replicaset.apps/argocd-notifications-controller-577b87f4bd 1 1 1 155m
replicaset.apps/argocd-redis-564c8b4dd7 1 1 1 155m
replicaset.apps/argocd-repo-server-6858df88f4 1 1 1 155m
replicaset.apps/argocd-server-74b5b78785 1 1 1 155m
NAME READY AGE
statefulset.apps/argocd-application-controller 1/1 155m
Доступ до ArgoCD UI:
Тепер, коли ArgoCD встановлено, потрібно відкрити інтерфейс ArgoCD для доступу через веб. Для цього виконайте наступну команду `kubectl`:
kubectl port-forward svc/argocd-server -n argocd 8080:443
```
У терміналі ви повинні побачити таке повідомлення. Цей термінал повинен залишатися запущеним, щоб сервер працював.
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080
Використовуючи URL https://127.0.0.1:8080
, як показано вище, ви повинні мати змогу отримати доступ до ArgoCD UI. Це буде перша сторінка, яку ви побачите при відкритті URL у браузері.
Примітка: Ваш URL для доступу може відрізнятися від наведеного вище, залежно від вашої конкретної конфігурації. Переконайтесь, що ви використовуєте правильний URL для вашого середовища.
Крок 2: Налаштування ArgoCD
1.
Увійти в ArgoCD:
Після запуску ArgoCD UI наступним кроком є перший вхід. За замовчуванням ім'я користувача в ArgoCD — admin
. Щоб отримати пароль для користувача admin, ви можете виконати наступну команду. Переконайтесь, що у вас встановлено ArgoCD CLI на вашому комп'ютері перед виконанням цієї команди.
Після того, як ви отримаєте пароль і ім'я користувача admin, ви зможете увійти в ArgoCD UI. Після входу рекомендується змінити пароль за замовчуванням на такий, який буде зручніше запам'ятати.
argocd admin initial-password -n argocd
- Додати ваш GitHub репозиторій до ArgoCD:
Наступним кроком є додавання вашого GitHub репозиторію до ArgoCD. Ви можете налаштувати це або через ArgoCD CLI, або безпосередньо через веб-інтерфейс. У цьому прикладі я проведу вас через процес використання веб-інтерфейсу.
- Перейдіть до розділу налаштувань в ArgoCD.
- Вкладка Repositories містить опції для додавання нового репозиторію.
3.
Тут ви можете налаштувати ваш GitHub репозиторій, надавши необхідні деталі.
Ось як виглядає розділ Repositories в ArgoCD UI.
Якщо налаштування пройшло успішно, ви побачите зелений знак галочки поруч з вашим GitHub репозиторієм, що вказує на успішне підключення. Якщо виникла проблема, ви побачите повідомлення про помилку з підключенням, що означає, що репозиторій GitHub не зміг підключитись.
Наступний, необов'язковий крок на цьому етапі — це налаштування кластеру. За замовчуванням, кластер, у якому встановлено ArgoCD, автоматично налаштовується під час інсталяції.
Будь-які додаткові Kubernetes кластери повинні бути додані через розділ Cluster Configuration.
Зверніть увагу, що більшість цих налаштувань можна також виконати за допомогою ArgoCD CLI, тому ви можете вибрати використання або CLI, або веб-інтерфейсу — обидва варіанти досягають тієї ж мети.
Крок 3: Створення застосунку в ArgoCD
Ознайомтесь із визначенням застосунку у YAML файлі: Це визначення застосунку є містком між вашим GitHub репозиторієм і вашим Kubernetes кластером в рамках ArgoCD процесу. Воно вказує ArgoCD, що потрібно розгорнути, де це зробити та які налаштування використовувати. YAML файл застосунку визначає URL репозиторію, гілку та шлях до Kubernetes маніфестів, а також кластер і простір імен для розгортання. Це забезпечує автоматизацію та повторюваність вашого процесу розгортання.
Ось визначення YAML:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: current-time-api
namespace: argocd
spec:
source:
repoURL: https:// #Використовуйте ваш форкнутй GitHub репозиторій цього проекту.
targetRevision: main
path: manifests
destination:
server: https:// #Використовуйте ваш власний сервер кластера
namespace: default
project: default
Щоб створити ваш перший застосунок на платформі ArgoCD, використовуйте наступну команду kubectl apply
. Перед виконанням команди переконайтеся, що ви оновили значення repoURL
та server
, щоб вони відповідали правильному URL вашого GitHub репозиторію та правильному URL вашого кластера.
Застосунок current-time-api.
Ця команда створить застосунок в ArgoCD.
Переконайтеся, що URL репозиторію вказує на ваш GitHub репозиторій, а URL сервера відповідає Kubernetes кластеру, в який ви хочете деплоїти застосунок.
kubectl apply -f app.yaml
Деплоймент Node.js REST API
- Запуште зразок Kubernetes маніфесту у ваш репозиторій:
Цей маніфест є YAML конфігураційним файлом, який визначає ресурси Kubernetes, необхідні для деплойменту вашого застосунку. Він визначає Deployment
та описує бажаний стан для ваших подів, такі як кількість реплік, образи контейнерів і конфігурації портів. Запушивши цей файл у ваш репозиторій, ви дозволяєте ArgoCD моніторити репозиторій на предмет змін і автоматично деплоїти або оновлювати ваш застосунок відповідно до останніх конфігурацій.
Ось приклад маніфесту:
apiVersion: apps/v1
kind: Deployment
metadata:
name: current-time-api
labels:
app: current-time-api
spec:
replicas: 2
selector:
matchLabels:
app: current-time-api
template:
metadata:
labels:
app: current-time-api
spec:
containers:
- name: current-time-api
image: < Ваш-докерхаб-логін >/current-time-api:latest
ports:
- containerPort: 3000
- ArgoCD автоматично виявить зміни і деплоїть застосунок. Ось як виглядає застосунок.
Синхронізовані зміни.
Кращі практики для CI/CD з Kubernetes
-
Управління секретами: Використовуйте інструменти, такі як HashiCorp Vault або Kubernetes Secrets, для безпечного управління конфіденційною інформацією. HashiCorp Vault надає надійні методи для захисту, зберігання та суворого контролю доступу до секретів, таких як API ключі, паролі та сертифікати.
Kubernetes Secrets, з іншого боку, дозволяють зберігати та керувати конфіденційною інформацією безпосередньо в екосистемі Kubernetes. Інтеграція цих інструментів у ваш CI/CD пайплайн забезпечує захист конфіденційних даних протягом усього життєвого циклу пайплайна. Наприклад, ви можете використовувати GitHub Actions для безпечного посилання на ці секрети без їх жорсткого кодування в вашому репозиторії. Такий підхід мінімізує ризики та покращує відповідність найкращим практикам безпеки. -
Моніторинг: Реалізуйте спостережуваність за допомогою інструментів, таких як Prometheus та Grafana, для моніторингу вашого пайплайна.
-
Тестування: Включіть юніт-тести та інтеграційні тести в ваш CI пайплайн.
-
Стратегії відкату: Використовуйте вбудовані функції відкату ArgoCD для обробки неуспішних деплойментів.
Висновок
Поєднуючи GitHub Actions для CI та ArgoCD для CD, ви створили масштабований та ефективний пайплайн для деплойментів в Kubernetes. Така конфігурація дозволяє швидко проводити ітерації, зберігаючи високу надійність.
Включений додаток Node.js REST API демонструє, як цей пайплайн може бути використаний у реальних сценаріях. Досліджуйте додаткові оптимізації, такі як blue-green деплойменти або canary релізи, щоб ще більше покращити ваш пайплайн.
Успіхів у програмуванні!
Перекладено з: Building a Scalable CI/CD Pipeline for Kubernetes Deployments with GitHub Actions and ArgoCD