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