Как всем известно, непрерывная интеграция и доставка играют огромную роль в развертывании приложений. Однако, будучи новичком, вы можете столкнуться с определенными трудностями в понимании этой концепции и ее самостоятельном применении. В этой статье мы посмотрим, как без лишних хлопот освоить CI/CD.

Прежде чем начать, вам могут понадобиться следующие инструменты:

· Код бэкенда или фронтенда, хранящийся в репозитории GitHub

  • GitHub Actions

  • MicroK8s

  • Kustomize

  • Kubernetes

  • Docker Hub

  • Argo CD

  • Любой облачный провайдер (AWS, GCP, Azure)

  • Домен (GoDaddy)

  • MySQL

Часть 1: Действия и рабочие процессы GitHub

Сна��ала разверните виртуальную машину с помощью любого доступного облачного провайдера (бесплатного уровня более чем достаточно). Я использовал GCP в качестве облачного провайдера, но вы можете использовать любого другого.

Не забудьте присвоить вашей виртуальной машине публичный IP‑адрес. В противном случае мы не сможем получить доступ к виртуальной машине извне. Кроме того, разрешите доступ по SSH через порт 22.

Для настройки конвейера CI/CD вам понадобится рабочий код. Это не обязательно должен быть сложный сервис, для этой цели вполне подойдет простой проект «Hello World».

Теперь перейдите в раздел «Settings» вашего репозитория и выполните следующие действия:

Разверните раздел «Actions» на левой панели и выберите «General». Включите параметр «Allow all actions and reusable workflows». Обязательно сохраните изменения.

Добавьте новый саморазмещаемый раннер: нажмите «Runners», а затем выберите кнопку «New self‑hosted runner». Выполните все команды, указанные в этом разделе, на вашей виртуальной машине. Это позволит вам добавить вашу облачную виртуальную машину (ВМ) в качестве раннера в GitHub.

Создание рабочего процесса

Теперь нам нужно собрать образ Docker, используя наш код. Для этого вам необходимо создать учетную запись Docker Hub, если у вас ее еще нет. После создания учетной записи создайте частный репозиторий в своей учетной записи Docker Hub. Мы будем использовать этот репозиторий в качестве реестра контейнеров для хранения образов Docker.

Давайте добавим ваши учетные данные Docker Hub в ваш репозиторий GitHub, чтобы ваши рабочие процессы GitHub могли использовать их для отправки образов Docker после их сборки.

Снова перейдите в раздел «Settings» вашего репозитория GitHub. Разверните «Secrets and variables» на левой панели и выберите «Actions». Добавьте ваши учетные данные Docker Hub в качестве секретов. 

Вам необходимо использовать эти секреты в предстоящем рабочем процессе GitHub. Создайте в своем репозитории каталог с именем «.github/workflows».

После этого, в данном каталоге создайте файл с именем «build_docker_image.yaml». Далее мы напишем рабочий процесс GitHub, который представляет собой часть конвейера, отвечающую за CI.

name: Build the docker image

# The workflow is activated when there is a push to the "demo_v1" branch.
on:
  push:
    branches:
      - demo_v1
      
# Working directory of the virtual machine     
env: 
  WORK_DIR: /home/demo

jobs:

 build:
   runs-on: demo-v1  #Runner Label

   # Environment varibales
   env:
     IMG_REG: emp-manage
     REPO: emp-manage-backend
     REPO_PATH: /home/demo/emp-manage-backend
   steps:
     # Checkout the code to the VM
     - name: check out the code
       uses: actions/checkout@v4
     - name: Get short SHA
       uses: benjlevesque/short-sha@v3.0
       id: short-shaa
       with:
          length: 5
     - run: echo $SHA
       env:
        SHA: ${{ env.SHA }} 
    # Use the SHA output to name the upcoming release
     - name: Set SHA Output to use in release
       run: |
        cd ${{ env.WORK_DIR }}
        touch env_file.txt
        chmod 766 env_file.txt
        echo "${{ env.SHA }}" > env_file.txt
    # Build the docker image
     - name: build docker image
       run: |
          cd ${{ env.REPO_PATH }}/${{ env.REPO }}
          docker build -t yashashp/${{ env.IMG_REG }}:${{ env.SHA }} .
     - name: Login to Docker Hub
       uses: docker/login-action@v3
       with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASS }}
     - name: Push Docker image
       run: |
          docker push yashashp/${{ env.IMG_REG }}:${{ env.SHA }}

# Create a release from the built image        
 release:
    runs-on: demo-v1
    needs: build
    steps:
      - name: Get env
        id: short-sha-value
        run: |  
         cd /home/demo
         sha=$(cat env_file.txt)
         echo "tag=$sha" >> $GITHUB_ENV
      - name: Create release
        id: create_release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.github_token }}
        with:
          tag_name: ${{ env.tag }}
          release_name: Release  ${{ env.tag }}
          body: New release for ${{ github.sha }}. Release notes can be found in the docs.
          draft: false
          prerelease: false

# Clean the environment in the VM
 clean:
  runs-on: demo-v1
  needs: release
  env:
    REPO: emp-manage-backend
  steps:
    - name: clean working directory
      run: |
        cd ${{ env.WORK_DIR }}
        rm env_file.txt
        rm -rf ${{ env.REPO }} 
        rm -rf _PipelineMapping _temp _tool

Я использовал несколько общедоступных повторяющихся действий GitHub, доступных онлайн. Вы также можете использовать их при запуске этого рабочего процесса.

Теперь нам просто нужно запустить этот рабочий процесс. Как упоминалось в моем примере, мне нужно отправить изменения в ветку «demo_v1», чтобы запустить рабочий процесс. Поэтому я отредактирую свой файл README в репозитории и отправлю изменения.

Это запустит наш рабочий процесс и создаст образ Docker, используя наш код. Вы можете проверить это, перейдя на вкладку «Actions» в репозитории.

После завершения этого процесса образ Docker будет загружен в наш репозиторий Docker Hub.

Теперь, вы сможете найти этот образ в своем репозитории Docker. Войдите в свою учетную запись Docker и проверьте, доступен ли образ.

Часть 2: Microk8s и Argo CD

Если вы следовали инструкциям, представленным выше, у вас, возможно, уже настроена виртуальная машина в качестве исполнителя GitHub. В этом примере я буду использовать ту же виртуальную машину для развертывания Microk8s и Argo CD.

Я уже установил MySQL на этой виртуальной машине, поскольку приложению, которое необходимо развернуть в Microk8s, требуется доступ к базе данных.

Однако, вы можете сделать то же самое на отдельной виртуальной машине. Войдите в свою виртуалку, используя ее публичный IP‑адрес. Выполните следующие команды для установки Microk8s:

sudo snap install microk8s --classic

microk8s enable dns

microk8s enable storage

Теперь убедитесь, что Microk8s запущен на вашей виртуальной машине.

После выполнения следующей команды вы увидите узлы Microk8s.

root@demo-vm:~# microk8s kubectl get nodes

NAME STATUS ROLES AGE VERSION

demo-vm Ready <none> 23d v1.31.5

Это означает, что Microk8s успешно запущен.

Поскольку постоянно вводить «microk8s kubectl» в консоли несколько неудобно, мы создадим псевдоним для этой команды. Добавьте alias k=’microk8s kubectl’ в конец файла «.bashrc» и запустите «source ~/.bashrc», чтобы немедленно применить изменения без перезапуска терминала.

Установка Argo CD

В первой части этой статьи мы завершили раздел CI конвейера. Следующий шаг — настройка части CD. Для этого нам нужно установить Argo CD на узел MicroC8s.

k create namespace argocd

k apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

Давайте убедимся, что Argo CD успешно запущен.

root@demo-vm:~# k get po -n argocd
NAME READY STATUS RESTARTS AGE
argocd-application-controller-0 1/1 Running 8 (3h55m ago) 23d
argocd-applicationset-controller-64f6bd6456-twvhp 1/1 Running 8 (3h55m ago) 23d
argocd-dex-server-5fdcd9df8b-xpcb2 1/1 Running 8 (3h55m ago) 23d
argocd-notifications-controller-778495d96f-tf5fq 1/1 Running 8 (3h55m ago) 23d
argocd-redis-69fd8bd669-jjtgw 1/1 Running 8 (3h55m ago) 23d
argocd-repo-server-75567c944-p8ztv 1/1 Running 8 (3h55m ago) 23d
argocd-server-5c768cdd96-77kpr 1/1 Running 11 (3h55m ago) 23d

Теперь нам нужно изменить некоторые настройки в Argo CD, чтобы обеспечить доступ к серверу Argo CD извне сети виртуальной машины.

root@demo-vm:~# k get svc -n argocd
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
argocd-applicationset-controller ClusterIP 10.152.183.231 7000/TCP,8080/TCP 23d
argocd-dex-server ClusterIP 10.152.183.112 5556/TCP,5557/TCP,5558/TCP 23d
argocd-metrics ClusterIP 10.152.183.227 8082/TCP 23d
argocd-notifications-controller-metrics ClusterIP 10.152.183.232 9001/TCP 23d
argocd-redis ClusterIP 10.152.183.252 6379/TCP 23d
argocd-repo-server ClusterIP 10.152.183.106 8081/TCP,8084/TCP 23d
argocd-server NodePort 10.152.183.96 80:30000/TCP,443:30001/TCP 23d
argocd-server-metrics ClusterIP 10.152.183.180 8083/TCP 23d

Измените тип службы «argocd‑server» на NodePort. По умолчанию тип службы для «argocd‑server» — ClusterIP. Для этого выполните следующую команду:

k edit svc argocd-server -o yaml -n argocd

Добавьте новые порты узла для протоколов HTTP и HTTPS, чтобы разрешить доступ извне. Это также можно сделать с помощью указанной выше команды. Я использовал порты 30 000 и 30001.

ports:
 - name: http
 nodePort: 30000
 port: 80
 protocol: TCP
 targetPort: 8080
 - name: https
 nodePort: 30001
 port: 443
 protocol: TCP
 targetPort: 8080

Убедитесь, что эти порты также разрешены в группах безопасности виртуальной машины. Теперь вы можете получить доступ к панели управления Argo CD, используя публичный IP‑адрес и порт виртуальной машины.

http://<VM-public-ip>:30000/

Часть 3: Создание манифестов Kustomize и настройка приложения в Argo CD.

На третьем этапе нам потребуется создать необходимые конфигурационные файлы Kustomize для развертывания приложения. Эти файлы должны храниться и поддерживаться в отдельном репозитории GitHub.

Сначала подготовьте репозиторий. Затем создайте три каталога внутри репозитория: apps, base и overlays/dev. Далее создайте файлы Kustomize, необходимые для развертывания вашего приложения на Microk8s. Ниже я привел манифесты Kustomize, относящиеся к моему примеру.

k8s‑kustomize/ │── apps/ │ └── kustomization.yaml │ ├── base/ │ ├── deployment.yaml │ ├── kustomization.yaml │ ├── service.yaml │ └── overlays/ └── dev/ ├── deployment‑patch.yaml └── kustomization.yaml

Репозиторий GitHub: https://github.com/yteep/k8s‑kustomize.git

Создание приложения в Argo CD

Давайте создадим новое приложение в Argo CD. Для этого войдите в Argo CD и выберите «Settings». Затем вы можете подключить свой репозиторий GitHub (тот, который используется для хранения манифестов Kustomize) к Argo CD.

Далее, укажите необходимые данные репозитория для подключения Argo CD к GitHub. Вам необходимо создать персональный токен доступа (PAT) в своей учетной записи GitHub, чтобы разрешить доступ к репозиторию «k8s‑kustomize». Используйте этот PAT в качестве пароля. В качестве имени пользователя вы можете использовать свое имя пользователя GitHub.

Выберите «Application» на левой панели, чтобы начать создание нового приложения. Далее добавьте новое имя приложения. Вы можете выбрать другие параметры в соответствии со своими предпочтениями. Я оставлю большинство из них по умолчанию.

В поле «Revision» выберите ветку, которую вы использовали для фиксации файлов Kustomize. Поле «Path» указывает Argo CD, где искать файлы Kustomize, необходимые для развертывания приложения. В моем примере я указываю каталог «apps» внутри репозитория.

В разделе «Назначение» выберите свой кластер и пространство имен. Argo CD постоянно проверяет соответствие желаемого состояния (источника) фактическому состоянию (назначение). Желаемое состояние: конфигурации, указанные вами в репозитории GitHub. Фактическое состояние: реальные конфигурации приложений, работающих в инфраструктуре Kubernetes.

Argo CD отвечает за поддержание этих состояний в равновесии. При возникновении расхождения состояний Argo CD немедленно принимает меры для устранения проблем OutOfSync и восстановления синхронизации состояний.

Теперь вы можете открыть это приложение, чтобы просмотреть ресурсы, развернутые в вашем кластере Microk8s.

Заключение

Это полное руководство по развертыванию простого конвейера CI/CD с использованием Argo CD и MicroK8s. Те, кто испытывает трудности с первым шагом в реализации конвейера CI/CD, могут использовать эту статью для того чтобы начать свой путь. Вы также можете улучшить эту предложенные настройки, используя дополнительные конфиг��рации. Это позволит вам расширить свои знания в области CI/CD.

Готовы к обучению на курсе «DevOps практики и инструменты»? Пройдите тест и узнаете
Готовы к обучению на курсе «DevOps практики и инструменты»? Пройдите тест и узнаете

Если хочется пойти дальше «одного пайплайна» и собрать цельную картину DevOps-практик, у OTUS есть курс «DevOps практики и инструменты». Он ведёт от карты практик к руками освоенным инструментам: IaC, CI/CD, конфиг-менеджмент, хранилища артефактов, работа с секретами и observability (метрики/логи/трейсы). Чтобы узнать больше о формате обучения и познакомиться с преподавателями, приходите на бесплатные демо-уроки:

  • 25 декабря. Фениксы и снежинки: как строить инфраструктуру, которая не ломается. Записаться

  • 14 января. IaC: Тестирование инфраструктуры — как внедрить инженерные практики и перестать бояться изменений. Записаться

  • 22 января. eBPF: рентгеновское зрение для production. Видим сеть, безопасность и узкие места на уровне ядра Linux. Записаться