Рубрики
Uncategorized

CI/CD для микросервисов на Digitalocean Kubernetes

Учебное пособие: Как настроить конвейер CI/CD для получения микросервиса с семафорным и цифровым Kubernetes. Помечено Kubernetes, Tuperial, DevOps, CICD.

Семфор Дает вам возможность легко создавать конвейеры CI/CD, которые строят, запускают и развертывают контейнеры Docker. Digitalocean недавно представлен Управляемая служба Kubernetes который упрощает запуск облачных приложений. Вместе они отлично подходят для разработки продуктивного программного обеспечения. В этой статье мы покажем вам, как соединить эти два услуги вместе в быстром конвейере по непрерывной доставке.

Что мы строим

Мы будем использовать микросервис Ruby Sinatra, которая обнажает несколько HTTP -конечных точек и включает в себя тестовый набор. Мы упаковываем его с Docker и развертываем в Digitalocean Kubernetes. Трубопровод CI/CD полностью автоматизирует следующие задачи:

  • Установить зависимости проекта, повторно используя их из кэша большую часть времени;
  • Запустить модульные тесты;
  • Создайте и пометите изображение Docker;
  • Нажмите изображение Docker в реестр контейнеров Docker Hub;
  • Предоставьте развертывание в одном клике для Digitalocean Kubernetes.

Мы пойдем шаг за шагом, но если вы хотите перейти прямо в окончательную версию исходного кода, ознакомьтесь с репозиторием Semaphore-Demo-Ruby-Kubernetes на GitHub:

Semaphoreci-Demos/Semaphore-Demo-Ruby-Kubernetes

Семфор демонстрационный трубопровод CI/CD для Kubernetes.

Это пример приложения и конвейер CI/CD, показывающий, как создавать, проверить и развернуть микросервис в Kubernetes с использованием Semaphore 2.0.

Ингредиенты:

  • Ruby Sinatra как веб -структура
  • Rspec для тестов
  • Упакован в контейнер Docker
  • Контейнер, выдвинутый в реестр Docker Hub
  • Развернуто в Kubernetes

CI/CD на семафоре

Если вы новичок в Semaphore, не стесняйтесь разворачивать этот репозиторий и использовать его в Создать проект Анкет

Трубопровод CI/CD определяется в .semaphore каталог и выглядит так:

Локальная настройка приложения

Чтобы запустить микросервис:

bundle install --path vendor/bundle
bundle exec rackup

Чтобы запустить тесты:

bundle exec rspec

Чтобы построить и запустить контейнер Docker:

docker build -t semaphore-demo-ruby-kubernetes .
docker run -p 80:4567 semaphore-demo-ruby-kubernetes
curl localhost
> hello world :))

Лицензия

Авторское право (C) 2019 г. рендерированный текст

Распределено по лицензии MIT. Смотрите лицензию на файл.

Давайте начнем!

Запустите кластер Kubernetes за 5 минут на Digitalocean

Запуск кластера Kubernetes на Digitalocean прост. На панели панели используйте кнопку «Создать» сверху, чтобы создать ее. Кластер станет доступным за 4-5 минут.

Страница кластера включает в себя ряд советов и ресурсов, которые вы можете использовать. Если вы еще этого не сделали, сейчас самое время установить kubectl , инструмент командной строки Kubernetes.

Подключитесь к своему кластеру Kubernetes

Прокрутите внизу страницы кластера, чтобы загрузить файл конфигурации, который вы будете использовать для аутентификации и подключения к кластеру.

На вашей локальной машине создайте каталог для содержания файла конфигурации Kubernetes:

$ mkdir ~/.kube

Переместите загруженный файл в ~/.Kube и инструктировать Kubectl использовать его. Вы можете запустить следующую команду в своем сеансе терминала или добавить ее в свой профиль оболочки, например .bashrc или .zshrc :

$ export KUBECONFIG=$HOME/.kube/dok8s.yaml

Обязательно измените dok8s.yaml Чтобы соответствовать имени вашего файла.

Убедитесь, что вы можете общаться со своим кластером Digitalocean Kubernetes, выполняя kubectl Получите узлы Анкет Когда команда успешна, она возвращает информацию, аналогичную следующему:

$ kubectl get nodes
NAME                        STATUS    ROLES     AGE       VERSION
nostalgic-heisenberg-8vi3   Ready         4d        v1.13.2
nostalgic-heisenberg-8vi8   Ready         4d        v1.13.2

Количество узлов будет соответствовать выбранному вами номеру во время процесса создания кластера. Обратите внимание, что если вы запускаете Получить узлы В то время как ваш кластер все еще предоставляется, количество узлов будет равным.

DigitaloCean еще не ответил на мой вопрос об их отношениях с Уолтером Уайтом.

Подключите Semaphore к вашему кластеру Kubernetes

На этом этапе у вас есть кластер Kubernetes, который вы можете управлять своей локальной машиной. Давайте настроим базовый проект CI/CD, в котором Semaphore также может успешно выполнить kubectl Получите узлы Анкет

Если вы новичок в Semaphore, начните с Создание бесплатной учетной записи Анкет Бесплатный счет предоставляет вам 20 долларов США каждый месяц, чего достаточно для 1300 минут обслуживания. Если вы подключите кредитную карту, вы получите дополнительные 200 долларов из бесплатного кредита.

Создать проект на Semaphore

После того, как вы находитесь в семафоре, перейдите по «проектам> новой» ссылке на боковой панели с левой стороны. Вы можете следовать инструкциям на экране, чтобы выбрать репозиторий и совершить файл YML по умолчанию. В этом уроке я покажу вам подход командной строки.

Сначала Установить SEM, инструмент командной строки семафора Анкет Вы найдете точные инструкции, открыв виджет CLI в верхнем правом углу любого семафорного экрана.

Первая команда загружает и устанавливает CLI:

$ curl https://storage.googleapis.com/sem-cli-releases/get.sh | bash

Вторая команда соединяет SEM с учетной записью вашей организации:

$ sem connect ORGANIZATION.semaphoreci.com ACCESS_TOKEN

Затем инициализируйте репозиторий GIT, который вы хотели бы подключиться к Semaphore. Вы также можете сделать это в пустом репозитории GIT:

$ sem init
Project is created. You can find it at https://ORGNAME.semaphoreci.com/projects/PROJECTNAME.

To run your first pipeline execute:

  git add .semaphore/semaphore.yml && git commit -m "First pipeline" && git push

Команда создает ключ развертывания и WebHook на GitHub, чтобы семафор мог получить доступ к вашему коду при его изменении, и создает файл определения конвейера .semaphore/semaphore.yml на твоем компьютере.

Аутентификация с Kubernetes с использованием секрета семафора

Давайте редактировать Semaphore.yml и инструктировать Semaphore, как поговорить с Kubernetes.

Семфор уже Предоставляет Kubectl Preinstalled Анкет Так что осталось, так это безопасная загрузка файла конфигурации Kubernetes в среде Semaphore. Мы обычно решаем это, создав Секрет Анкет Секрет может быть коллекцией переменной среды и файлов. После создания он доступен для всех проектов в организации.

В нашем случае нам нужен секрет, основанный на одном файле. Создайте его с помощью SEM:

$ sem create secret do-k8s --file ~/.kube/do-kubernetes.yaml:/home/semaphore/.kube/dok8s.yaml

Команда выше Создает секрет, основанный на локальном файле и инструктирует семафор, чтобы сделать его доступным в /HOME/Semaphore/.kube/dok8s.yaml . /home/semaphore/ это каталог по умолчанию, из которого работают все задания CI/CD.

Полная конфигурация семафора, которая объединяет этот секрет и делает ее доступной, задание CI/CD заключается в следующем:

# .semaphore/semaphore.yml
version: v1.0
name: Hello Kubernetes
agent:
  machine:
    type: e1-standard-2
    os_image: ubuntu1804
blocks:
  - name: Talk to K8s
    task:
      secrets:
        - name: do-k8s
      env_vars:
        - name: KUBECONFIG
          value: /home/semaphore/.kube/dok8s.yaml
      jobs:
      - name: Get nodes
        commands:
          - checkout
          - kubectl get nodes

Если это первый раз, когда вы видите файл конфигурации семафора, Быстрый тур по концепциям поможет вам понять это. Вот суть того, как они применяют в этом примере:

  • В агент В разделе мы указываем среду, которая будет запускать наш код и команды. Мы объединяем один из доступных Типы машин и Изображения операционной системы Анкет
  • В Секреты Раздел мы установим секрет, который мы только что создали, и используем файл, который он предоставляет для определения KubeConfig переменная среды в env_vars раздел.
  • Наш трубопровод имеет один блок и одно задание, в котором мы загружаем наш код из GitHub и запускаем kubectl Получите узлы Анкет

Запустить git push И вы должны увидеть базовый трубопровод, работающий на семафоре:

Нажмите «Получить узлы», чтобы просмотреть журнал заданий:

Хорошо, мы в бизнесе! Давайте продолжим, настроив фактический проект.

Установите непрерывную интеграцию для микросервиса Sinatra

Наше приложение Sinatra — это микросервис с минимальной конфигурацией и набором тестов RSPEC:

.
├── Gemfile
├── Gemfile.lock
├── README.md
├── app.rb
├── config.ru
└── spec
    ├── app_spec.rb
    └── spec_helper.rb

Давайте очистим наш предыдущий Semaphore.yml и введите следующую конфигурацию для запуска CI:

# .semaphore/semaphore.yml
version: v1.0
name: CI
agent:
  machine:
    type: e1-standard-2
    os_image: ubuntu1804

blocks:
  - name: Install dependencies
    task:
      jobs:
        - name: bundle install
          commands:
            - checkout
            - cache restore gems-$SEMAPHORE_GIT_BRANCH-$(checksum Gemfile.lock),gems-$SEMAPHORE_GIT_BRANCH,gems-master
            - bundle install --deployment --path .bundle
            - cache store gems-$SEMAPHORE_GIT_BRANCH-$(checksum Gemfile.lock) .bundle

  - name: Tests
    task:
      jobs:
        - name: rspec
          commands:
            - checkout
            - cache restore gems-$SEMAPHORE_GIT_BRANCH-$(checksum Gemfile.lock),gems-$SEMAPHORE_GIT_BRANCH,gems-master
            - bundle install --deployment --path .bundle
            - bundle exec rspec

Мы храним наши драгоценные камни В кеш -семафоре Чтобы избежать бега Установка пакета С нуля на каждом коммите.

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

Необходимо запустить Установка пакета Во втором блоке, хотя Кэш восстановление В этот момент всегда восстанавливает пакет драгоценных камней. Это ограничение на стороне Бундлера, но хорошая часть в том, что команда выходит очень быстро.

Когда вы толкаете новый Semaphore.yml Для GitHub вы увидите настоящий CI -конвейер, формирующийся на Semaphore:

Нажмите на изображение Docker в реестр контейнерных контейнеров Docker Hub

Развертывание в Kubernetes требует, чтобы мы протолкнули изображение Docker в реестр контейнеров. В этом примере мы будем использовать Docker Hub. Процедура очень похожа для других поставщиков реестра.

Эти инструкции будут работать с любым изображением Docker. Для получения советов для Синатры, проверьте мой предыдущий пост:

Застать на микросервисе Sinatra

Марко Анастасов ・ 18 февраля ’19 ・ 2 мин прочитал

Продвигаясь в реестр контейнеров, государственный или частный, требует аутентификации. Например, когда вы используете Docker Desktop на Mac, вы автоматически аутентифицируют, и просто работает связь с Docker Hub. В среде CI/CD мы должны сделать учетные данные доступными и аутентифицировать, прежде чем делать Docker push Анкет

Следуя Docker Hub , нам нужно создать секрет.

Откройте новый файл secret.yml :

# secret.yml
apiVersion: v1alpha
kind: Secret
metadata:
  name: my-dockerhub
data:
  env_vars:
    - name: DOCKER_USERNAME
      value: "YOUR USERNAME"
    - name: DOCKER_PASSWORD
      value: "YOUR PASSWORD"

Используйте SEM CLI, чтобы создать секрет, и удалите исходный файл после того, как вы закончите:

$ sem create -f secret.yml
$ rm secret.yml

Вы можете убедиться, что это сработало:

$ sem get secrets
NAME               AGE
my-dockerhub   11s

$ sem get secret markoa-dockerhub
apiVersion: v1beta
kind: Secret
metadata:
  name: my-dockerhub
  id: 89596f93-f2ca-4414-88be-e9602174034a
  create_time: "1550149760"
  update_time: "1550149760"
data:
  env_vars:
  - name: DOCKER_USERNAME
    value: xxx
  - name: DOCKER_PASSWORD
    value: xxx
  files: []

Теперь у нас есть все, что нужно, чтобы подтолкнуть к Docker Hub от семафора.

С помощью Docker Build and Push Operations мы вступаем в этап доставки нашего проекта. Мы расширим наш трубопровод CI с помощью продвижения и используйте его, чтобы вызвать следующий этап.

Внизу Semaphore.yml , Определите повышение:

# .semaphore/semaphore.yml
# ...
promotions:
  - name: Dockerize
    pipeline_file: docker-build.yml
    auto_promote_on:
      - result: passed

С AUTO_PROMOTE_ON Указанный выше, наш трубопровод Dockerize будет работать при каждом изменении в каждой ветви. Вы можете настроить это поведение с Дополнительные условия Анкет

Давайте определим трубопровод Dockerize:

# .semaphore/docker-build.yml
version: v1.0
name: Docker build
agent:
  machine:
    type: e1-standard-4
    os_image: ubuntu1804
blocks:
  - name: Build
    task:
      secrets:
        - name: my-dockerhub
      jobs:
      - name: Docker build
        commands:
          - echo "${DOCKER_PASSWORD}" | docker login -u "${DOCKER_USERNAME}" --password-stdin
          - checkout
          - docker pull semaphoredemos/semaphore-demo-ruby-kubernetes:latest || true
          - docker build --cache-from semaphoredemos/semaphore-demo-ruby-kubernetes:latest -t semaphoredemos/semaphore-demo-ruby-kubernetes:$SEMAPHORE_WORKFLOW_ID .
          - docker images
          - docker push semaphoredemos/semaphore-demo-ruby-kubernetes:$SEMAPHORE_WORKFLOW_ID

В первой команде мы аутентифицируем подлинность Docker Hub, используя переменные среды, определенные в My-Dockerhub секрет

Мы используем Docker Layer Caching Чтобы ускорить процесс сборки контейнера. Во -первых, мы пытаемся вытащить ранее построенное изображение из реестра. Если мы впервые выполняем эту операцию, этот шаг будет пропущен и не пройдет.

С помощью -Cache-From флаг с Docker Build Мы повторно используем слои из вытянутого изображения, чтобы быстрее построить новый.

В Docker push Команда мы используем Semaphore_workflow_id Переменная среда для создания уникального артефакта после каждой сборки. Это одна из переменных среды, доступной в каждой работе семафора; См. Документацию для полного списка Анкет

Обратите внимание, что мы не создаем новую версию последней тег. Мы собираемся сделать это только после успешного развертывания.

Как только вы замените имя изображения своим собственным, у вас должен быть трубопровод в состоянии, аналогичном этому:

Журнал заданий показывает, что изображение контейнера было создано и натолкнуто:

И ваш реестр Docker содержит последние изображения:

Развернуть в Kubernetes

Вернувшись на страницу кластера Kubernetes в DigitaloCean, раздел «Начало работы» включает в себя примеры «Развертывание рабочей нагрузки». Мы можем использовать пример, приведенный для Nginx, и изменить его для нашего приложения.

В примере конфигурации вы заметите ссылку на изображение контейнера источника:

# ...
    spec:
      containers:
        - name: nginx
          image: library/nginx

Если ваше изображение Docker является частным, вам нужно будет включить кластер Kubernetes для аутентификации с реестрами Docker. Способ сделать это, еще раз, создав секрет, только на этот раз на конец кластера Kubernetes. Для демонстрационных целей я покажу вам, как это сделать, хотя изображение, которое мы используем в этом уроке, является публичным.

Запустите следующую команду на вашей локальной машине, чтобы создать Docker-Registry -type Секрет на вашем кластере Kubernetes:

$ kubectl create secret docker-registry dockerhub-user --docker-server=https://index.docker.io/v1/ --docker-username=YOUR_DOCKER_HUB_USERNAME --docker-password=YOUR_DOCKER_HUB_PASSWORD --docker-email=YOUR_EMAIL`

Вы можете проверить секрет, запустив:

$ kubectl get secret dockerhub-user --output=yaml

Как и в семафоре, секреты Kubernetes являются базовыми 64-кодирующими, и выход будет выглядеть аналогичным:

apiVersion: v1
data:
  .dockerconfigjson: eyJhdXRocyI6eyJodHR...
kind: Secret
metadata:
  creationTimestamp: 2019-02-08T10:18:52Z
  name: dockerhub-user
  namespace: default
  resourceVersion: "7431"
  selfLink: /api/v1/namespaces/default/secrets/dockerhub-user
  uid: eec7c39e-2b8a-11e9-a804-1a46bc991881
type: kubernetes.io/dockerconfigjson

Напишите манифест развертывания

Создайте новый файл в вашем репозитории, например, называется развертывание. Myml :

# deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: semaphore-demo-ruby-kubernetes
spec:
  replicas: 1
  selector:
    matchLabels:
      app: semaphore-demo-ruby-kubernetes
  template:
    metadata:
      labels:
        app: semaphore-demo-ruby-kubernetes
    spec:
      containers:
        - name: semaphore-demo-ruby-kubernetes
          image: semaphoredemos/semaphore-demo-ruby-kubernetes:$SEMAPHORE_WORKFLOW_ID
      imagePullSecrets: # if using a private image
        - name: dockerhub-user

По сравнению с примером NGINX, предоставленным DigitaloCean, мы в значительной степени заменили приложение и имя изображения. Поскольку семафор помечает изображения, используя Semaphore_workflow_id Переменная среда, мы также используем ее здесь.

Файл конфигурации развертывания, как он появляется сейчас, является не Действительный YML. План состоит в том, чтобы использовать утилиту Linux под названием envsubst (Также доступно на Mac через Homebrew), чтобы заменить $ Semaphore_workflow_id с его стоимостью в рамках работы с семафором CI/CD.

Наше проявление развертывания, однако, еще не полное без a Kubernetes Load Balancer который выявит развернутую услугу по публичному IP -адресу. Добавьте следующий контент в тот же файл:

# deployment.yml
# ...
--------

apiVersion: v1
kind: Service
metadata:
  name: semaphore-demo-lb
spec:
  selector:
    app: semaphore-demo-ruby-kubernetes
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 4567

Вы можете убедиться, что конфигурация Kubernetes работает, как предназначена от вашей локальной машины, заменив $ Semaphore_workflow_id с Последний и бег:

$ kubectl apply -f deployment.yml
$ kubectl get services
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)        AGE
semaphore-demo-ruby-kubernetes     LoadBalancer   10.245.117.152   68.183.249.106   80:30569/TCP   5d
...

Определите трубопровод развертывания семафора

Мы вступаем на последний этап конфигурации CI/CD. На этом этапе у нас есть конвейер CI, определенный в Semaphore.yml а также A Docker Build Конвейер определен в Docker-build.yml . Мы собираемся определить третий трубопровод, чтобы запустить вручную из Docker Build который будет развернуться в Kubernetes.

Начните с определения ручного продвижения:

# .semaphore/docker-build.yml
# ...
promotions:
  - name: Deploy to Kubernetes
    pipeline_file: deploy-k8s.yml

Наконец, давайте определим конвейер развертывания. Он имеет две задания: применить новую конфигурацию Kubernetes и создать новую версию нашей Последний Изображение контейнера, которое мы относимся как к главной ветви в GIT (ваша практика может варьироваться).

# .semaphore/deploy-k8s.yml
version: v1.0
name: Deploy to Kubernetes
agent:
  machine:
    type: e1-standard-2
    os_image: ubuntu1804
blocks:
  - name: Deploy to Kubernetes
    task:
      secrets:
        - name: do-k8s
      env_vars:
        - name: KUBECONFIG
          value: /home/semaphore/.kube/dok8s.yaml
      jobs:
      - name: Deploy
        commands:
          - checkout
          - kubectl get nodes
          - kubectl get pods
          - envsubst < deployment.yml | tee deployment.yml
          - kubectl apply -f deployment.yml

  - name: Tag latest release
    task:
      secrets:
        - name: dockerhub-users
      jobs:
      - name: docker tag latest
        commands:
          - echo "${DOCKER_PASSWORD}" | docker login -u "${DOCKER_USERNAME}" --password-stdin
          - docker pull semaphoreci-demos/semaphore-demo-ruby-kubernetes:$SEMAPHORE_WORKFLOW_ID
          - docker tag semaphoreci-demos/semaphore-demo-ruby-kubernetes:$SEMAPHORE_WORKFLOW_ID semaphoreci-demos/semaphore-demo-ruby-kubernetes:latest
          - docker push semaphoreci-demos/semaphore-demo-ruby-kubernetes:latest

Как только мы доставим новую версию конфигурации в GitHub, Semaphore запускает наш трубопровод. Как только трубопровод сборки Docker будет успешно завершен, нажмите кнопку «PROMOTE», чтобы запустить развертывание:

Теперь вы можете запустить Kubectl Get Services или откройте список балансировщиков нагрузки на DigitaloCean> Раздел вкладок сети, чтобы найти общедоступный IP -адрес вашего микросервиса:

И проверить это:

$ curl 68.183.251.210
hello world :))

Поздравляю! Теперь у вас есть полностью автоматизированный конвейер непрерывной доставки в Kubernetes.

Развернуть демонстрационное приложение для себя

Не стесняйтесь раскошелиться на Семфор-Демо-Рубий-Кубернет Репозиторий и создайте Semaphore Project, чтобы развернуть его в экземпляре Kubernetes.

Вот несколько идей для потенциальных изменений, которые вы можете внести:

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

Эта статья основана на эпизоде Semaphore Uncut, видео -серии YouTube на CI/CD:

Спасибо за чтение! 🙌 Пожалуйста, дайте мне отзыв, и я буду рад ответить на любые вопросы, которые у вас могут возникнуть в комментариях.

Для более подробного контента следуйте за мной здесь или Подпишитесь на бесплатную электронную книгу Semaphore на CI/CD с Kubernetes Анкет ❤

Первоначально опубликовано на Semaphore Blog Анкет

Оригинал: «https://dev.to/markoa/cicd-for-microservices-on-digitalocean-kubernetes-1dg1»