Рубрики
Uncategorized

CI / CD с Drone, Kubernetes и Хелм — часть 1

Создание вашего CI / CD-трубопровода с Дроном, Кубернетами и Хелм. RBAC включен. Теги с CICD, Drone, Helm, Kubernetes.

Эта статья является репостом из моего блога. Найти оригинальный пост здесь Отказ

Непрерывная интеграция и доставка трудно. Это факт, что каждый может согласиться. Но теперь у нас есть все это замечательная технология, и проблемы в основном «как я подключаю это с этим?» или «Как я могу сделать эти две продукты работать вместе?»

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

Эта первая статья действует как введение в различные технологии, используемые по всей серии. Для начинающих предназначено для начинающих, которые имеют некоторые знания 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.1      custom-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 : Названные, которые мы определили ранее для нашего Clusterissuer
  • spec.issuerref.hind : Укажите, что эмитент является Clusterissuer
  • spec.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»