Семфор Дает вам возможность легко создавать конвейеры 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 Ready4d 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»