Эта статья является репостом из моего блога. Найти оригинальный пост здесь Отказ
Непрерывная интеграция и доставка трудно. Это факт, что каждый может согласиться. Но теперь у нас есть все это замечательная технология, и проблемы в основном «как я подключаю это с этим?» или «Как я могу сделать эти две продукты работать вместе?»
Ну, есть Никогда простой и универсальный ответ на эти вопросы. В этой серии статьи мы постепенно построены полный конвейер для непрерывной интеграции и доставки, используя три популярных продукта, а именно Куберанес, руля и дрон.
Эта первая статья действует как введение в различные технологии, используемые по всей серии. Для начинающих предназначено для начинающих, которые имеют некоторые знания Docker, как работает контейнер, а основы Кубебени. Вы можете полностью пропустить его, если у вас есть запущенный кластер K8S и экземпляр бегущего дрона.
Шаги
- Создайте кластер Kubernetes с GKE
- Создайте учетную запись услуг для Ciller
- Инициализируйте руль
- Добавьте репо в руль
- Развернуть дрон на новом кластере K8S
- Включите HTTPS на нашем новом экземпляре дрона
Технология вовлечена
Дрон
Дрон Это постоянная платформа доставки, построенная на Docker и написана в Go. Drone использует простой файл конфигурации YAML, суперсетом Docker-Compose, чтобы определить и выполнять трубопроводы внутри контейнеров докеров.
Он имеет тот же подход, что и Трэвис Где вы определяете свой конвейер в качестве кода в вашем репозитории. Крутая функция заключается в том, что каждый шаг в вашем конвейере выполнен в контейнере докера. Сначала это может показаться контр-интуитивно понятным, но он позволяет отличному плагину: каждый плагин для дрония вы можете Использование — это документ докера, который дрон будет тянуть при необходимости. Вам нечего устанавливать непосредственно в Дроне, так как вы будете делать с Jenkins, например.
Еще одно преимущество бегущего внутри докера в том, что Процедура установки Для дрона действительно просто. Но мы не собираемся устанавливать Дрон на голый металлический сервер или внутри ВМ. Больше на этом позже в руководстве.
Кубернеты
Kubernetes (обычно стилизованные как K8S) — это система оркестографии контейнера с открытым исходным кодом для автоматизации развертывания, масштабирования и управления контейнерными приложениями, которые изначально были разработаны Google, а теперь поддерживаются Фондом нативных вычислений облака. Он направлен на создание «платформы для автоматизации развертывания, масштабирования и операций контейнеров приложений по кластерам хозяев». Работает с рядом контейнерных инструментов, в том числе докера. Википедия
Wikipedia суммирует K8s довольно хорошо. В основном K8S рефераты базовые машины, на которых он работает и предлагает платформу, где мы можем развернуть наши приложения. Он отвечает за распространение наших контейнеров правильно на разных узлах, поэтому, если один узел выключается или отключается от сети, приложение все еще доступно, а K8S работает для ремонта узла или положений нового для нас.
Я рекомендую хотя бы читать Kubernetes Основы Для этого учебника.
Шлем
Хелм это менеджер пакета для Куберанес. Это позволяет нам создавать, поддерживать и развертывать приложения в кластере Kubernetes.
В основном, если вы хотите что-то установить в кластере Kubernetes, вы можете проверить, есть ли для него диаграмма. Например, мы собираемся использовать диаграмму для Drone, чтобы развернуть его.
HELM позволяет развертывать ваше приложение к различным пространствам имен, изменить тег вашего изображения и в основном переопределить каждый параметр, который вы можете поместить в файлы развертывания Kubernetes при запуске его. Это означает, что вы можете использовать ту же диаграмму для развертывания вашего приложения в своей среде постановки и в производстве, просто переопределении некоторых значений в командной строке или в файле значений.
В этой статье мы увидим, как использовать предсекующую таблицу. В следующем мы увидим, как создать один с нуля.
Отказ от ответственности
В этом руководстве мы будем использовать Google Cloud Platform Поскольку он позволяет легко создавать кластеры Kubernetes и имеет личный реестр контейнера, который мы будем использовать позже.
Вы можете пропустить этот шаг, если у вас уже есть кластер K8S с версией kubernetes выше 1.8.
На этом шаге нам понадобится gcloud
и kubectl
CLI. Проверьте, как Установите Google Cloud SDK Для вашей операционной системы.
Как сказано ранее, этот учебник не о создании и поддержании кластера Kubernetes. Как таковые мы собираемся использовать Google Kubernetes Engine создать нашу игровую площадку кластера. Есть два варианта, чтобы создать его: либо в веб-интерфейсе, предлагаемом GCP или непосредственно с помощью gcloud
команда. На момент написания пишутся версия по умолчанию K8S, предлагаемых Google 1.8.8
, но до тех пор, пока вы выше 1.8
Вы можете выбрать какую версию, которую вы хотите. Хотя нет никаких причин, чтобы не выбрать самую высокую стабильную версию …
1.8
выбор, потому что в этой версии RBAC активируется по умолчанию и является системой аутентификации по умолчанию.
Чтобы уменьшить стоимость вашего кластера, вы можете изменить тип машины, но попытаться сохранить не менее 3 узлов; Это позволит миграции нулевого простоя на разные типы машин и обновить версию K8S, если вы когда-нибудь хотите сохранить этот кластер активным и запущенным.
Чтобы проверить, работает ли ваш кластер, вы можете проверить вывод следующей команды:
$ gcloud container clusters list NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS mycluster europe-west1-b 1.10.2-gke.1custom-1-2048 1.10.2-gke.1 3 RUNNING
Вы также должны получить Master_ip
, Проект
и Расположение
который я удалил с этого фрагмента. Отныне в кодовых фрагментах и примерах командной строки $ Расположение
будет ссылаться на местоположение вашего кластера, $ Имя
будет ссылаться на имя вашего кластера, а $ Project
будет ссылаться на ваш проект GCP.
После того, как ваш кластер работает, вы можете затем выдать следующую команду для получения учетных данных для подключения к вашему кластеру:
$ gcloud container clusters get-credentials $NAME --zone $LOCATION --project $PROJECT Fetching cluster endpoint and auth data. kubeconfig entry generated for mycluster. $ kubectl cluster-info Kubernetes master is running at https://GLBCDefaultBackend is running at https:// /api/v1/namespaces/kube-system/services/default-http-backend/proxy Heapster is running at https:// /api/v1/namespaces/kube-system/services/heapster/proxy KubeDNS is running at https:// /api/v1/namespaces/kube-system/services/kube-dns/proxy kubernetes-dashboard is running at https:// /api/v1/namespaces/kube-system/services/kubernetes-dashboard/proxy Metrics-server is running at https:// /api/v1/namespaces/kube-system/services/metrics-server/proxy
Сейчас kubectl
настроен для работы в вашем кластере. Последняя команда распечатает всю необходимую информацию о том, где находится ваш кластер.
Прежде всего, нам понадобится Хелм
команда. Смотрите эту страницу для инструкций по установке Отказ
Хелм на самом деле состоит из двух частей. Сам Helm — это клиент, а Thilder — это сервер. Thilder должен быть установлен в нашем кластере K8S, поэтому Helm может работать с ним, но сначала нам понадобиться Сервисная учетная запись для руля. Thilder должен быть в состоянии взаимодействовать с нашим кластером K8S, поэтому он должен быть в состоянии создавать развертывание, конфигурацию, секреты и так далее. Добро пожаловать в RBAC Отказ
Итак, давайте создадим файл с именем Tiller-RBAC-CONFIG.YAML
-------- apiVersion: v1 kind: ServiceAccount metadata: name: tiller namespace: kube-system -------- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: tiller roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: tiller namespace: kube-system
В этом файле YAML мы объявляем ServieSeacount названный Tiller, а затем мы объявляем КЛУСТЕРРОЛОБИНГИНГ которые связывают учетную запись службы румперов к авторизации кластера-администрации.
Теперь мы можем развернуть Thiller, используя учетную запись службы, которую мы только что создали, как это:
$ helm init --service-account tiller
Обратите внимание, что это не обязательно хорошая практика для развертывания Thilder таким образом. Использование RBAC, мы можем ограничить действий Ciller может выполнить в нашем кластере, а пространства имен могут действовать. Смотрите эту документацию Чтобы увидеть, как использовать RBAC, чтобы ограничить или изменить поведение Thilder в вашем кластере K8S.
Этот шаг действительно важен для следующих частей этой серии, поскольку позже будем использовать эту учетную запись службы для взаимодействия с K8S от Drone.
Статический IP
Если у вас есть доменное имя, и пожелайте связать поддомен к экземпляру вашего дрона, вам придется создать внешний IP-адрес в вашей облачной консоли Google. Дайте ему имя и помните это имя, мы будем использовать его сразу после того, как настроить диаграмму дронов.
Ассоциировать этот статический IP с вашим доменом (и помнить размножение DNS может занять некоторое время).
Ради этой статьи внешнее имя IP-адреса будет Drone-Kube
и домен будет Drone.myhost.io.
.
Интеграция
Сначала нам нужно настроить интеграцию GitHub для нашего экземпляра дронов. Посмотрите на Эта документация Или если вы используете другую систему управления версией, проверьте документацию Drone, как создать правильную интеграцию. В настоящее время дрон поддерживает следующие VCS:
Имейте в виду, что если вы не используете интеграцию GitHub, изменения в переменных среда в следующем разделе должны соответствовать.
Диаграмма и конфигурация
После быстрого поиска Google мы можем видеть, что есть Диаграмма для дрона Отказ И это в инкубатор
Из Helm Charts, поэтому сначала нам нужно добавить репо на руль.
$ helm repo add incubator https://kubernetes-charts-incubator.storage.googleapis.com/ $ helm repo update
Теперь, когда это сделано, мы можем взглянуть на Конфигурация Часть для этого графика. Мы создадим Значения.yaml
Файл, который будет содержать необходимую информацию для нашего экземпляра дрона, чтобы работать правильно.
service: httpPort: 80 nodePort: 32015 type: NodePort ingress: enabled: true annotations: kubernetes.io/ingress.class: "gce" kubernetes.io/ingress.global-static-ip-name: "drone-kube" kubernetes.io/ingress.allow-http: "true" hosts: - drone.myhost.io server: host: "http://drone.myhost.io" env: DRONE_PROVIDER: "github" DRONE_OPEN: "false" DRONE_GITHUB: "true" DRONE_ADMIN: "me" DRONE_GITHUB_CLIENT: "the github client secret you created earlier" DRONE_GITHUB_SECRET: "same thing with the secret"
Хорошо! У нас есть наш статический IP, связанный с нашим доменом. Мы должны поставить название этого зарезервированного IP в аннотациях входа, чтобы он знал, к которому IP он должен связывать. Мы собираемся использовать балансировщик нагрузки GCE, и, поскольку у нас нет сертификата TLS, мы собираемся сказать входу, что все в порядке, чтобы принять HTTP-соединения. (Пожалуйста, не ударийте меня, я обещаю, что посмотрим, как включить TLS позже.)
Мы также объявляем все переменные, используемые самим дроном, чтобы общаться с нашими VCS, в этом случае Github.
Вот и все. Мы готовы. Давайте выстрелить шлем!
$ helm install --name mydrone -f values.yaml incubator/drone
Учитывая, что ваша запись DNS теперь распространяется, вы должны иметь возможность получить доступ к экземпляру Дрона с помощью Drone.myhost.io
Урл!
Развертывание CERT-Manager
В прошлом у нас было Kube-Lego который сейчас устарел в пользу Cert-Manager Отказ
Документация Государства, которые устанавливают Cert-Manager так же просто, как запуск этой команды:
$ helm install --name cert-manager --namespace kube-system stable/cert-manager
Создание эмитента ACME
CERT-Manager состоит из нескольких компонентов. Он использует то, что называется Пользовательские определения ресурсов и позволяет использовать kubectl
контролировать сертификаты, эмитенты и так далее.
Эмитент или Clusterissuer Представляет собой администратор сертификата, из которого можно получить сертификаты X509.
Разница между эмитентом и Clusterissuer заключается в том, что эмитент может управлять сертификатами только в своем собственном пространстве имен и быть вызванным из этого пространства имен. Clusterissuer не зависит от конкретного пространства имен.
Мы собираемся создать кластериссера «Лэйтер», чтобы мы могли выдать сертификат для нашего экземпляра дронов и для наших будущих развертываний. Давайте создадим файл с именем ACME-ESSUER.YAML
:
apiVersion: certmanager.k8s.io/v1alpha1 kind: ClusterIssuer metadata: name: letsencrypt spec: acme: server: https://acme-v01.api.letsencrypt.org/directory email: your.email.address@gmail.com privateKeySecretRef: name: letsencrypt-production http01: {}
Здесь мы создаем Clusterissuer с включенной задачей HTTP. Мы только увидим эту проблему в этой статье, обратитесь к Документация Для получения дополнительной информации о проблемах. Не забудьте изменить связанный адрес электронной почты в своем эмитенте!
$ kubectl apply -f acme-issuer.yaml
Мы также можем создать Clusterissuer, используя среду, которая более допустима с ошибками по запросам. Если вы хотите проверить без выдачи правдивых сертификатов, вместо этого используйте это. Создайте новый файл Acme-Stage-Escuer.yaml
:
apiVersion: certmanager.k8s.io/v1alpha1 kind: ClusterIssuer metadata: name: letsencrypt-staging spec: acme: server: https://acme-staging.api.letsencrypt.org/directory email: your.email.address@gmail.com privateKeySecretRef: name: letsencrypt-staging http01: {}
$ kubectl apply -f acme-staging-issuer.yaml
Сертификат
Теперь, когда у нас есть наш Clusterissuer, который использует производство LetWSSrypt, мы можем создать манифест, который решит для нас вызов ACME. Сначала нам нужно понадобиться название входа, создаваемого дипломной диплом:
$ kubectl get ingress NAME HOSTS ADDRESS PORTS AGE mydrone-drone drone.myhost.io xx.xx.xx.xx 80 1h
Теперь, когда у нас есть эта информация, давайте создадим Drone-Cert.yaml
файл:
apiVersion: certmanager.k8s.io/v1alpha1 kind: Certificate metadata: name: mydrone-drone namespace: default spec: secretName: mydrone-drone-tls issuerRef: name: letsencrypt # This is where you put the name of your issuer kind: ClusterIssuer commonName: drone.myhost.io # Used for SAN dnsNames: - drone.myhost.io acme: config: - http01: ingress: mydrone-drone # The name of your ingress domains: - drone.myhost.io
Здесь много полей, чтобы объяснить здесь. Большинство из них довольно явные и могут быть найдены В документации о проверке HTTP.
Важные вещи здесь:
SPEC.SECRETNAME.
: Секрет, в котором будет храниться сертификат. Обычно это будет префиксировано с-Тлс
Так что это не смешивается с другими секретами.spec.issuerref.name
: Названные, которые мы определили ранее для нашего Clusterissuerspec.issuerref.hind
: Укажите, что эмитент является Clusterissuerspec.acme.config.http01.ingress.
: Название входа, развернутого с дроном
Теперь давайте применим это:
$ kubectl apply -f drone-cert.yaml $ kubectl get certificate NAME AGE mydrone-drone 7m $ kubectl describe certificate mydrone-drone ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning ErrorCheckCertificate 33s cert-manager-controller Error checking existing TLS certificate: secret "mydrone-drone-tls" not found Normal PrepareCertificate 33s cert-manager-controller Preparing certificate with issuer Normal PresentChallenge 33s cert-manager-controller Presenting http-01 challenge for domain drone.myhost.io Normal SelfCheck 32s cert-manager-controller Performing self-check for domain drone.myhost.io Normal ObtainAuthorization 6s cert-manager-controller Obtained authorization for domain drone.myhost.io Normal IssueCertificate 6s cert-manager-controller Issuing certificate... Normal CertificateIssued 5s cert-manager-controller Certificate issued successfully
Нам нужно подождать, пока эта последняя строка появится, Сертифицированный
Мероприятие, прежде чем мы сможем обновить значения наших попаданий. Это может занять некоторое время, быть терпеливым, когда балансиры Google Cloud Load могут занять несколько минут для обновления.
Обновлять ценности дронов
Теперь, когда у нас есть наш секрет, содержащий правильный сертификат TLS, мы можем вернуться к нашему Значения.yaml
Файл, который мы использовали ранее, чтобы развернуть Drone с его диаграммой и добавить секрет TLS в секции входа! Мы также собираемся отключить HTTP на нашем проникновении (будут поданы только HTTPS), и изменить наши Server.host
Значение, чтобы отразить это изменение HTTPS.
service: httpPort: 80 nodePort: 32015 type: NodePort ingress: enabled: true annotations: kubernetes.io/ingress.class: "gce" kubernetes.io/ingress.global-static-ip-name: "drone-kube" kubernetes.io/ingress.allow-http: "false" # ← Let's disable HTTP and allow only HTTPS hosts: - drone.myhost.io # Add this ↓ tls: - hosts: - drone.myhost.io secretName: mydrone-drone-tls # End server: host: "https://drone.myhost.io" # ← Modify this too env: DRONE_PROVIDER: "github" DRONE_OPEN: "false" DRONE_GITHUB: "true" DRONE_ADMIN: "me" DRONE_GITHUB_CLIENT: "the github client secret you created earlier" DRONE_GITHUB_SECRET: "same thing with the secret"
И нам просто нужно обновить наше развертывание:
$ helm upgrade mydrone -f values.yaml incubator/drone
Тебе тоже придется изменить приложение GitHub.
В этой статье мы увидели, как развернуть кластер Kubernetes на GKE, как создать учетную запись услуг с надлежащим привязкой роли кластера для развертывания Chiller, как использовать HELM и как развернуть диаграмму с примером Drone.
В следующей статье мы увидим, как написать качественный трубопровод для проекта GO, а также как нажать в Google Cloud Registry.
Благодаря @shirley_leu Для корректировки этой статьи и исправления моих английских ошибок!
Эта статья является репостом из моего блога. Найти оригинальный пост здесь Отказ
Оригинал: «https://dev.to/depado/cicd-with-drone-kubernetes-and-helm—part-1-4mdp»