Серия вебинаров: Управление пакетами Kubernetes с помощью Helm и CI / CD с Jenkins X

Вступление

Чтобы уменьшить количество ошибок и упорядочить сложность при развертывании приложения, системы CI / CD должны включать надежные инструменты для управления / развертывания пакетов и конвейеры с автоматическим тестированием. Но в современных производственных средах повышенная сложность облачной инфраструктуры может создать проблемы для создания надежной среды CI / CD. Для решения этой проблемы были разработаны два специфичных для Kubernetes инструмента: менеджер пакетов Helm и инструмент автоматизации конвейера Jenkins X.

Helm - это менеджер пакетов, специально разработанный для Kubernetes, поддерживаемый Cloud Native Computing Foundation (CNCF) в сотрудничестве с Microsoft, Google, Bitnami и сообществом разработчиков Helm. На высоком уровне он выполняет те же цели, что и менеджеры системных пакетов Linux, такие как APT или YUM: управление установкой приложений и зависимостей за кулисами и скрытие сложности от пользователя. Но в Kubernetes необходимость такого управления еще более очевидна: для установки приложений требуется сложная и утомительная согласованность файлов YAML, а обновление или откат выпусков может быть где угодно, от трудного до невозможного. Чтобы решить эту проблему, Helm работает поверх Kubernetes и упаковывает приложения в предварительно сконфигурированные ресурсы, называемые charts, которыми пользователь может управлять с помощью простых команд, делая процесс совместного использования и управления приложениями более удобным для пользователя.

Jenkins X - это инструмент CI / CD, используемый для автоматизации производственных конвейеров и сред для Kubernetes. Используя изображения Docker, диаграммы Хелма и механизм конвейера Jenkins, Jenkins X может автоматически управлять выпусками и версиями и продвигать приложения между средами на GitHub.

Во второй статье *CI/CD with Kubernetes * series вы предварительно ознакомитесь с этими двумя инструментами:

  • Управление, создание и развертывание пакетов Kubernetes с помощью Helm.

  • Создание конвейера CI / CD с Jenkins X.

Хотя различные платформы Kubernetes могут использовать Helm и Jenkins X, в этом руководстве вы запустите симулированный кластер Kubernetes, настроенный в вашей локальной среде. Для этого вы будете использовать Minikube, программу, которая позволяет вам опробовать инструменты Kubernetes на своем компьютере без необходимости устанавливать настоящий кластер Kubernetes.

К концу этого учебного курса вы получите общее представление о том, как эти нативные инструменты Kubernetes могут помочь вам реализовать систему CI / CD для вашего облачного приложения.

Предпосылки

Чтобы следовать этому уроку, вам понадобится:

  • Сервер Ubuntu 16.04 с 16 ГБ ОЗУ или выше. Поскольку этот учебник предназначен только для демонстрационных целей, команды запускаются от имени учетной записи root. * Обратите внимание, что неограниченные привилегии этой учетной записи не соответствуют рекомендациям, готовым к работе, и могут повлиять на вашу систему. * По этой причине рекомендуется выполнять следующие действия в тестовой среде, такой как виртуальная машина или https: / /www.digitalocean.com/products/droplets/[DigitalOcean Droplet].

  • Https://github.com/[GitHub account] и https://github.com/settings/tokens/new?scopes=repo,read:user,read:org,user:email,write:repo_hook,delete_repo [ GitHub API-токен. Обязательно запишите этот токен API, чтобы его можно было ввести во время части Jenkins X этого руководства.

  • Знакомство с понятиями Kubernetes. Пожалуйста, обратитесь к статье An Введение в Kubernetes для более подробной информации.

Шаг 1 - Создание локального кластера Kubernetes с Minikube

Перед настройкой Minikube вам необходимо установить его зависимости, в том числе инструмент командной строки Kubernetes kubectl, двунаправленное реле передачи данных. socat и контейнерная программа Docker.

Во-первых, убедитесь, что менеджер пакетов вашей системы может обращаться к пакетам через HTTPS с помощью + apt-transport-https +:

apt-get update
apt-get install apt-transport-https

Затем, чтобы убедиться, что загрузка kubectl действительна, добавьте ключ GPG для официального репозитория Google в вашу систему:

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -

Как только вы добавили ключ GPG, создайте файл + / etc / apt / sources.list.d / kubernetes.list +, открыв его в текстовом редакторе:

nano /etc/apt/sources.list.d/kubernetes.list

После открытия этого файла добавьте следующую строку:

/etc/apt/sources.list.d/kubernetes.list

deb http://apt.kubernetes.io/ kubernetes-xenial main

Это покажет вашей системе источник для загрузки kubectl. После добавления строки сохраните и выйдите из файла. С помощью текстового редактора nano вы можете сделать это, нажав + CTRL + X +, набрав + y + и нажав + ENTER +.

Наконец, обновите список источников для APT и установите + kubectl +, + socat + и + docker.io +:

apt-get update
apt-get install -y kubectl socat docker.io

Теперь, когда вы установили kubectl, вы можете перейти к install Minikube. Сначала используйте + curl + для загрузки бинарного файла программы:

curl -Lo minikube https://storage.googleapis.com/minikube/releases//minikube-linux-amd64

Затем измените права доступа для файла, который вы только что загрузили, чтобы ваша система могла его выполнить:

chmod +x minikube

Наконец, скопируйте файл + minikube + в путь к исполняемому файлу + / usr / local / bin / + и удалите исходный файл из вашего домашнего каталога:

cp minikube /usr/local/bin/
rm minikube

С установленным на вашем компьютере Minikube вы можете запустить программу. Чтобы создать кластер Minikube Kubernetes, используйте следующую команду:

minikube start --vm-driver none

Флаг + - vm-driver none + указывает Minikube запускать Kubernetes на локальном хосте, используя контейнеры, а не виртуальную машину. Запуск Minikube таким способом означает, что вам не нужно загружать драйвер виртуальной машины, но также означает, что сервер Kubernetes API будет работать небезопасно как пользователь root.

Теперь, когда вы запустили Minikube, убедитесь, что ваш кластер работает, с помощью следующей команды:

minikube status

Вы получите следующий вывод с вашим IP-адресом вместо ++:

minikube: Running
cluster: Running
kubectl: Correctly Configured: pointing to minikube-vm at

Теперь, когда вы настроили имитируемый кластер Kubernetes с помощью Minikube, вы можете получить опыт управления пакетами Kubernetes, установив и настроив менеджер пакетов Helm в верхней части кластера.

Шаг 2 - Настройка диспетчера пакетов Helm в вашем кластере

Чтобы координировать установку приложений в вашем кластере Kubernetes, вы теперь установите менеджер пакетов Helm. Helm состоит из клиента + helm +, работающего вне кластера, и сервера + tiller +, который управляет выпуском приложений из кластера. Вам нужно будет установить и настроить оба, чтобы успешно запустить Helm в вашем кластере.

Чтобы install двоичные файлы Helm, сначала используйте + curl + для загрузки следующего https://raw.githubusercontent.com/helm / helm / master / scripts / получить [скрипт установки] из официального репозитория Helm GitHub в новый файл с именем + get_helm.sh +:

curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get > get_helm.sh

Поскольку для этого сценария требуется доступ с правами root, измените разрешение + get_helm.sh +, чтобы владелец файла (в данном случае root) мог прочитать, записать и выполнить его:

chmod 700 get_helm.sh

Теперь выполните скрипт:

./get_helm.sh

Когда скрипт завершится, у вас будет установлено + helm + для + / usr / local / bin / helm + и + tiller + для + / usr / local / bin / tiller +.

Хотя + tiller + теперь установлен, у него еще нет правильных ролей и разрешений для доступа к необходимым ресурсам в вашем кластере Kubernetes. Чтобы назначить эти роли и разрешения + tiller +, вам нужно будет создать service account с именем + tiller + `. В Kubernetes учетная запись службы представляет собой идентификатор для процессов, которые выполняются в модуле. После проверки подлинности процесса через учетную запись службы он может связаться с сервером API и получить доступ к ресурсам кластера. Если модулю не назначена определенная учетная запись службы, она получает учетную запись службы по умолчанию. Вам также нужно будет создать правило Role-Based access control (RBAC), которое авторизует учетную запись службы `+ tiller +.

В API RBAC Kubernetes role содержит правила, которые определяют набор разрешений. Роль может быть определена с областью действия + namespace + или + cluster + и может предоставлять доступ к ресурсам только в пределах одного пространства имен. + ClusterRole + может создавать одинаковые разрешения на уровне кластера, предоставляя доступ к ресурсам кластерной области, таким как узлы, и ресурсам с пространством имен, таким как pods. Чтобы назначить учетной записи службы + tiller + правильную роль, создайте файл YAML с именем + rbac_helm.yaml + и откройте его в текстовом редакторе:

nano rbac_helm.yaml

Добавьте следующие строки в файл для настройки учетной записи службы + tiller +:

rbac_helm.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

 - kind: User
   name: "admin"
   apiGroup: rbac.authorization.k8s.io

 - kind: User
   name: "kubelet"
   apiGroup: rbac.authorization.k8s.io

 - kind: Group
   name: system:serviceaccounts
   apiGroup: rbac.authorization.k8s.io

В предыдущем файле + ServiceAccount + позволяет процессам + tiller + получить доступ к серверу в качестве аутентифицированной учетной записи службы. + ClusterRole + предоставляет определенные разрешения для роли, а + ClusterRoleBinding + назначает эту роль списку + subject +, включая учетную запись службы + tiller +, пользователи + admin + и + kubelet +, и группа + system: serviceaccounts +.

Затем разверните конфигурацию в + rbac_helm.yaml + с помощью следующей команды:

kubectl apply -f rbac_helm.yaml

С развернутой конфигурацией + tiller + вы можете теперь инициализировать Helm с флагом + - service-acount +, чтобы использовать только что настроенную учетную запись службы:

helm init --service-account tiller

Вы получите следующий вывод, представляющий успешную инициализацию:

OutputCreating /root/.helm
Creating /root/.helm/repository
Creating /root/.helm/repository/cache
Creating /root/.helm/repository/local
Creating /root/.helm/plugins
Creating /root/.helm/starters
Creating /root/.helm/cache/archive
Creating /root/.helm/repository/repositories.yaml
Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com
Adding local repo with URL: http://127.0.0.1:8879/charts
$HELM_HOME has been configured at /root/.helm.

Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.

Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
To prevent this, run `helm init` with the --tiller-tls-verify flag.
For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation
Happy Helming!

Это создает модуль + tiller в пространстве имен` + kube-system`. Он также создает репозиторий по умолчанию + .helm + в вашем каталоге + $ HOME + и настраивает репозиторий стабильных диаграмм Helm по умолчанию по адресу + https: // kubernetes-charts.storage.googleapis.com + и локальный репозиторий Helm по адресу + HTTP: //127.0.0.1: 8879 / графики +.

Чтобы убедиться, что модуль + tiller работает в пространстве имен` + kube-system`, введите следующую команду:

kubectl --namespace kube-system get pods

В вашем списке модулей появится + tiller-deploy +, как показано в следующем выводе:

OutputNAME                                    READY   STATUS    RESTARTS   AGE
etcd-minikube                           1/1     Running   0          2h
kube-addon-manager-minikube             1/1     Running   0          2h
kube-apiserver-minikube                 1/1     Running   0          2h
kube-controller-manager-minikube        1/1     Running   0          2h
kube-dns-86f4d74b45-rjql8               3/3     Running   0          2h
kube-proxy-dv268                        1/1     Running   0          2h
kube-scheduler-minikube                 1/1     Running   0          2h
kubernetes-dashboard-5498ccf677-wktkl   1/1     Running   0          2h
storage-provisioner                     1/1     Running   0          2h

Если состояние модуля + tiller + равно + Running +, теперь он может управлять приложениями Kubernetes из вашего кластера от имени Helm.

Чтобы убедиться, что все приложение Helm работает, найдите в хранилище пакетов Helm такое приложение, как MongoDB:

helm search mongodb

В выводе вы увидите список возможных приложений, которые соответствуют вашему поисковому запросу:

OutputNAME                                    CHART VERSION   APP VERSION     DESCRIPTION
stable/mongodb                          5.4.0           4.0.6           NoSQL document-oriented database that stores JSON-like do...
stable/mongodb-replicaset               3.9.0           3.6             NoSQL document-oriented database that stores JSON-like do...
stable/prometheus-mongodb-exporter      1.0.0           v0.6.1          A Prometheus exporter for MongoDB metrics
stable/unifi                            0.3.1           5.9.29          Ubiquiti Network's Unifi Controller

Теперь, когда вы установили Helm в своем кластере Kubernetes, вы можете больше узнать о менеджере пакетов, создав образец диаграммы Helm и развернув из нее приложение.

Шаг 3 - Создание диаграммы и развертывание приложения с помощью Helm

В менеджере пакетов Helm отдельные пакеты называются charts. В диаграмме набор файлов определяет приложение, которое может варьироваться по сложности от модуля до структурированного приложения с полным стеком. Вы можете скачать графики из репозиториев Helm или использовать команду + helm create + для создания своих собственных.

Чтобы проверить возможности Helm, создайте новую диаграмму Helm с именем + demo + с помощью следующей команды:

helm create demo

В вашем домашнем каталоге вы найдете новый каталог с именем + demo +, в котором вы можете создавать и редактировать свои собственные шаблоны диаграмм.

Перейдите в каталог + demo + и используйте + ls + для просмотра его содержимого:

cd demo
ls

В + demo + вы найдете следующие файлы и каталоги:

demo

charts  Chart.yaml  templates  values.yaml

Используя ваш текстовый редактор, откройте файл + Chart.yaml +:

nano Chart.yaml

Внутри вы найдете следующее содержимое:

демо / Chart.yaml

apiVersion: v1
appVersion: "1.0"
description: A Helm chart for Kubernetes
name: demo
version: 0.1.0

В этом файле + Chart.yaml + вы найдете такие поля, как + apiVersion +, которые всегда должны быть + v1 +, + description +, которые дают дополнительную информацию о том, что такое + demo +, + name + `диаграммы и номер + version + `, который Хелм использует в качестве маркера выпуска. Когда вы закончите изучение файла, закройте текстовый редактор.

Затем откройте файл + values.yaml +:

nano values.yaml

В этом файле вы найдете следующее содержимое:

демо / values.yaml

# Default values for demo.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

replicaCount: 1

image:
 repository: nginx
 tag: stable
 pullPolicy: IfNotPresent

nameOverride: ""
fullnameOverride: ""

service:
 type: ClusterIP
 port: 80

ingress:
 enabled: false
 annotations: {}
   # kubernetes.io/ingress.class: nginx
   # kubernetes.io/tls-acme: "true"
 paths: []
 hosts:
   - chart-example.local
 tls: []
 #  - secretName: chart-example-tls
 #    hosts:
 #      - chart-example.local

resources: {}
 # We usually recommend not to specify default resources and to leave this as a conscious
 # choice for the user. This also increases chances charts run on environments with little
 # resources, such as Minikube. If you do want to specify resources, uncomment the following
 # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
 # limits:
 #  cpu: 100m
 #  memory: 128Mi
 # requests:
 #  cpu: 100m
 #  memory: 128Mi

nodeSelector: {}

tolerations: []

affinity: {}

Изменяя содержимое + values.yaml +, разработчики диаграмм могут предоставить значения по умолчанию для приложения, определенного в диаграмме, контролируя количество реплик, базу изображений, входной доступ, секретное управление и многое другое. Пользователи Chart могут предоставить свои собственные значения для этих параметров с помощью специального файла YAML, используя + helm install +. Когда пользователь предоставляет пользовательские значения, эти значения будут переопределять значения в файле диаграммы + «values.yaml +».

Закройте файл + values.yaml и перечислите содержимое каталога` + templates` с помощью следующей команды:

ls templates

Здесь вы найдете шаблоны для различных файлов, которые могут управлять различными аспектами вашей диаграммы:

шаблоны

deployment.yaml  _helpers.tpl  ingress.yaml  NOTES.txt  service.yaml  tests

Теперь, когда вы изучили диаграмму + demo +, вы можете поэкспериментировать с установкой диаграммы Helm, установив + demo +. Вернитесь в свой домашний каталог с помощью следующей команды:

cd

Установите таблицу + demo Helm под именем` + web` с помощью + helm install:

helm install --name  ./demo

Вы получите следующий вывод:

OutputNAME:   web
LAST DEPLOYED: Wed Feb 20 20:59:48 2019
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Service
NAME      TYPE       CLUSTER-IP     EXTERNAL-IP  PORT(S)  AGE
web-demo  ClusterIP  10.100.76.231  <none>       80/TCP   0s

==> v1/Deployment
NAME      DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
web-demo  1        0        0           0          0s

==> v1/Pod(related)
NAME                       READY  STATUS             RESTARTS  AGE
web-demo-5758d98fdd-x4mjs  0/1    ContainerCreating  0         0s


NOTES:
1. Get the application URL by running these commands:
 export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=demo,app.kubernetes.io/instance=web" -o jsonpath="{.items[0].metadata.name}")
 echo "Visit http://127.0.0.1:8080 to use your application"
 kubectl port-forward $POD_NAME 8080:80

В этом выводе вы найдете + STATUS вашего приложения, а также список соответствующих ресурсов в вашем кластере.

Далее перечислите развертывания, созданные диаграммой Helm + demo +, с помощью следующей команды:

kubectl get deploy

Это приведет к выводу, в котором будут перечислены ваши активные развертывания:

OutputNAME       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
web-demo   1         1         1            1           4m

Список ваших модулей с командой + kubectl get pods + будет показывать модули, на которых запущено ваше приложение + web +, что будет выглядеть следующим образом:

OutputNAME                        READY   STATUS    RESTARTS   AGE
web-demo-5758d98fdd-nbkqd   1/1     Running   0          4m
Чтобы продемонстрировать, как изменения в диаграмме Хелма могут выпустить разные версии вашего приложения, откройте + demo / values.yaml + в текстовом редакторе и измените + replicaCount: + на + 3 + и тег +

: + от + stable + до + latest + `. В следующем блоке кода вы найдете, как должен выглядеть YAML-файл после того, как вы закончили его изменение с выделенными изменениями:

демо / values.yaml

# Default values for demo.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

replicaCount:

image:
 repository: nginx
 tag:
 pullPolicy: IfNotPresent

nameOverride: ""
fullnameOverride: ""

service:
 type: ClusterIP
 port: 80
. . .

Сохраните и выйдите из файла.

Перед развертыванием этой новой версии приложения + web + перечислите выпуски Helm, как они есть, с помощью следующей команды:

helm list

Вы получите следующий вывод с одним созданным ранее развертыванием:

OutputNAME    REVISION        UPDATED                         STATUS          CHART           APP VERSION     NAMESPACE

Обратите внимание, что + REVISION + указан как + 1 +, указывая на то, что это первая версия приложения + web +.

Чтобы развернуть приложение + web + с последними изменениями, внесенными в + demo / values.yaml +, обновите приложение с помощью следующей команды:

helm upgrade web ./demo

Теперь, перечислите выпуски Хелма снова:

helm list

Вы получите следующий вывод:

OutputNAME    REVISION        UPDATED                         STATUS          CHART           APP VERSION     NAMESPACE
web                    Wed Feb 20 21:18:12 2019        DEPLOYED        demo-0.1.0      1.0             default

Обратите внимание, что + REVISION + изменился на + 2 +, указывая, что это вторая ревизия.

Чтобы найти историю выпусков Helm для + web +, используйте следующее:

helm history web

Это покажет обе версии приложения + web +:

Выход

REVISION        UPDATED                         STATUS          CHART           DESCRIPTION
1               Wed Feb 20 20:59:48 2019        SUPERSEDED      demo-0.1.0      Install complete
2               Wed Feb 20 21:18:12 2019        DEPLOYED        demo-0.1.0      Upgrade complete

Чтобы откатить ваше приложение до ревизии + 1 +, введите следующую команду:

helm rollback web 1

Это даст следующий результат:

OutputRollback was a success! Happy Helming!

Теперь, поднимите историю выпуска Хелма:

helm history web

Вы получите следующий список:

OutputREVISION        UPDATED                         STATUS          CHART           DESCRIPTION
1               Wed Feb 20 20:59:48 2019        SUPERSEDED      demo-0.1.0      Install complete
2               Wed Feb 20 21:18:12 2019        SUPERSEDED      demo-0.1.0      Upgrade complete
3               Wed Feb 20 21:28:48 2019                demo-0.1.0      Rollback to 1

Откатив приложение + web +, вы создали третью ревизию, которая имеет те же настройки, что и ревизия + 1 +. Помните, что вы всегда можете узнать, какая ревизия активна, найдя пункт + DEPLOYED + в + STATUS +.

Чтобы подготовиться к следующему разделу, очистите область тестирования, удалив релиз + web командой` + helm delete`:

helm delete web

Изучите историю выпуска Хелма снова:

helm history web

Вы получите следующий вывод:

OutputREVISION        UPDATED                         STATUS          CHART           DESCRIPTION
1               Wed Feb 20 20:59:48 2019        SUPERSEDED      demo-0.1.0      Install complete
2               Wed Feb 20 21:18:12 2019        SUPERSEDED      demo-0.1.0      Upgrade complete
3               Wed Feb 20 21:28:48 2019                 demo-0.1.0      Deletion complete

+ STATUS + для + REVISION 3 + изменился на + DELETED +, указывая, что ваш развернутый экземпляр + web + был удален. Однако, хотя это удаляет релиз, он не удаляет его из хранилища. Чтобы полностью удалить релиз, выполните команду + helm delete с флагом` + - purge`.

helm delete web --purge

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

Затем вы настроите и протестируете инструмент автоматизации конвейера Jenkins X с помощью CLI + jx + для создания кластера Kubernetes, готового для CI / CD.

Шаг 4 - Настройка среды Jenkins X

С Jenkins X вы можете создать свой кластер Kubernetes с нуля с помощью встроенных решений автоматизации конвейера и CI / CD. Установив CLI-инструмент + jx +, вы сможете эффективно управлять выпусками приложений, образами Docker и диаграммами Helm, а также автоматически продвигать свои приложения в средах GitHub.

Поскольку вы будете использовать + jx + для создания кластера, вы должны сначала удалить кластер Minikube, который у вас уже есть. Для этого используйте следующую команду:

minikube delete

Это удалит локальный имитированный кластер Kubernete, но не удалит каталоги по умолчанию, созданные при первой установке Minikube. Чтобы очистить их от вашей машины, используйте следующие команды:

rm -rf ~/.kube
rm -rf ~/.minikube
rm -rf /etc/kubernetes/*
rm -rf /var/lib/minikube/*

После того, как вы полностью очистили Minikube от своего компьютера, вы можете перейти к установке бинарного файла Jenkins X.

Сначала загрузите сжатый файл + jx + из официального Jenkins X GitHub репозитория с помощью команды + curl + и распакуйте его с помощью команды + tar +:

curl -L https://github.com/jenkins-x/jx/releases/download/v1.3.781/jx-linux-amd64.tar.gz | tar xzv

Затем переместите загруженный файл + js в путь к исполняемому файлу в` + / usr / local / bin`:

mv jx /usr/local/bin

Jenkins X поставляется с Docker Registry, который работает внутри вашего кластера Kubernetes. Поскольку это внутренний элемент, меры безопасности, такие как самозаверяющие сертификаты, могут создавать проблемы для программы. Чтобы это исправить, настройте Docker на использование незащищенных реестров для локального диапазона IP-адресов. Для этого создайте файл + / etc / docker / daemon.json + и откройте его в текстовом редакторе:

nano /etc/docker/daemon.json

Добавьте следующее содержимое в файл:

/etc/docker/daemon.json

{
 "insecure-registries" : ["0.0.0.0/0"]
}

Сохраните и выйдите из файла. Чтобы эти изменения вступили в силу, перезапустите службу Docker с помощью следующей команды:

systemctl restart docker

Чтобы убедиться, что вы настроили Docker с небезопасными реестрами, используйте следующую команду:

docker info

В конце вывода вы должны увидеть следующую выделенную строку:

OutputContainers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 15
Server Version: 18.06.1-ce
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true

. . .

Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:

127.0.0.0/8
Live Restore Enabled: false

Теперь, когда вы загрузили Jenkins X и настроили реестр Docker, используйте инструмент CLI + jx + для создания кластера Minikube Kubernetes с возможностями CI / CD:

jx create cluster minikube --cpu=5 --default-admin-password=admin --vm-driver=none --memory=13314

Здесь вы создаете кластер Kubernetes, используя Minikube, с флагом + - cpu = 5 + для установки 5 процессоров и + - memory = 13314 + для предоставления вашему кластеру 13314 МБ памяти. Поскольку Jenkins X - надежная, но большая программа, эти спецификации обеспечат беспроблемную работу Jenkins X в этой демонстрации. Кроме того, вы используете + - default-admin-password = admin +, чтобы установить пароль Jenkins X как + admin + и + - vm-driver = none +, чтобы настроить кластер локально, как вы это делали в Шаг 1.

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

Сначала вы получите следующее приглашение:

Output? disk-size (MB) 150GB

Нажмите + ENTER для продолжения. Затем вам будет предложено указать имя, которое вы хотите использовать с git, адрес электронной почты, который вы хотите использовать с git, и ваше имя пользователя GitHub. Введите каждый из них при появлении запроса, затем нажмите + ENTER.

Затем Jenkins X предложит вам ввести свой токен GitHub API:

OutputTo be able to create a repository on GitHub we need an API Token
Please click this URL

Then COPY the token and enter in into the form below:

? API Token:

Введите свой токен здесь или создайте новый токен с соответствующими разрешениями, используя выделенный URL-адрес в предыдущем блоке кода.

Далее Дженкинс Х спросит:

Output? Do you wish to use GitHub as the pipelines Git server: (Y/n)

? Do you wish to use  as the pipelines Git user for GitHub server: (Y/n)

Введите + Y + для обоих вопросов.

После этого Jenkins X предложит вам ответить на следующие вопросы:

Output? Select Jenkins installation type:   [Use arrows to move, type to filter]
>Static Master Jenkins
 Serverless Jenkins

? Pick workload build pack:   [Use arrows to move, type to filter]
> Kubernetes Workloads: Automated CI+CD with GitOps Promotion
 Library Workloads: CI+Release but no CD

Для предыдущего выберите + Static Master Jenkins + и выберите + Kubernetes Workloads: автоматизированный CI + CD с GitOps Promotion + для последнего. Когда будет предложено выбрать организацию для своего репозитория среды, выберите ваше имя пользователя GitHub.

Наконец, вы получите следующий вывод, который проверяет успешную установку и предоставляет ваш пароль администратора Jenkins X.

OutputCreating GitHub webhook for /environment-horsehelix-production for url http://jenkins.jx..nip.io/github-webhook/

Jenkins X installation completed successfully


       ********************************************************

            NOTE: Your admin password is:

       ********************************************************



Your Kubernetes context is now set to the namespace: jx
To switch back to your original namespace use: jx namespace default
For help on switching contexts see: https://jenkins-x.io/developing/kube-context/

To import existing projects into Jenkins:       jx import
To create a new Spring Boot microservice:       jx create spring -d web -d actuator
To create a new microservice from a quickstart: jx create quickstart

Затем используйте команду + js get, чтобы получить список URL-адресов, которые показывают информацию о вашем приложении:

jx get urls

Эта команда выдаст список, подобный следующему:

Name                      URL
jenkins                   http://jenkins.jx..nip.io
jenkins-x-chartmuseum     http://chartmuseum.jx..nip.io
jenkins-x-docker-registry http://docker-registry.jx..nip.io
jenkins-x-monocular-api   http://monocular.jx..nip.io
jenkins-x-monocular-ui    http://monocular.jx..nip.io
nexus                     http://nexus.jx..nip.io

Вы можете использовать URL-адреса для просмотра данных Jenkins X о вашей среде CI / CD через пользовательский интерфейс, введя адрес в браузере и введя свое имя пользователя и пароль. В этом случае это будет «администратор» для обоих.

Затем, чтобы гарантировать, что учетные записи службы в пространствах имен + jx +, + jx-staging + и + jx-production + имеют привилегии администратора, измените ваши политики RBAC с помощью следующих команд:

kubectl create clusterrolebinding jx-staging1 --clusterrole=cluster-admin --user=admin --user=expose --group=system:serviceaccounts --serviceaccount=jx-staging:expose --namespace=jx-staging
kubectl create clusterrolebinding jx-staging2 --clusterrole=cluster-admin --user=admin --user=expose --group=system:serviceaccounts --serviceaccount=jx-staging:default --namespace=jx-staging
kubectl create clusterrolebinding jx-production1 --clusterrole=cluster-admin --user=admin --user=expose --group=system:serviceaccounts --serviceaccount=jx-production:expose --namespace=jx-productions
kubectl create clusterrolebinding jx-production2 --clusterrole=cluster-admin --user=admin --user=expose --group=system:serviceaccounts --serviceaccount=jx-production:default --namespace=jx-productions
kubectl create clusterrolebinding jx-binding1 --clusterrole=cluster-admin --user=admin --user=expose --group=system:serviceaccounts --serviceaccount=jx:expose --namespace=jx
kubectl create clusterrolebinding jx-binding2 --clusterrole=cluster-admin --user=admin --user=expose --group=system:serviceaccounts --serviceaccount=jx:default --namespace=jx

Теперь, когда вы создали свой локальный кластер Kubernetes со встроенной функциональностью Jenkins X, вы можете перейти к созданию приложения на платформе для тестирования его возможностей CI / CD и использования конвейера Jenkins X.

Шаг 5 - Создание тестового приложения в вашей среде Jenkins X

С вашей средой Jenkins X, настроенной в вашем кластере Kubernetes, теперь у вас есть инфраструктура CI / CD, которая может помочь вам автоматизировать конвейер тестирования. На этом этапе вы попробуете это, настроив тестовое приложение в работающем конвейере Jenkins X.

В демонстрационных целях в этом руководстве будет использоваться пример приложения RSVP, созданного командой CloudYuga. Вы можете найти это приложение вместе с другими материалами вебинара в репозитории DO-Community GitHub.

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

git clone https://github.com/do-community/rsvpapp.git

После того, как вы клонировали репозиторий, перейдите в каталог + rsvpapp + и удалите файлы git:

cd rsvpapp
rm -r .git/

Чтобы инициализировать репозиторий git и проект Jenkins X для нового приложения, вы можете использовать + jx create +, чтобы начать с нуля или из шаблона, или + jx import +, чтобы импортировать существующее приложение из локального проекта или репозитория git. Для этого руководства импортируйте пример приложения RSVP, выполнив следующую команду в домашнем каталоге приложения:

jx import

Jenkins X запросит у вас имя пользователя GitHub, хотите ли вы инициализировать git, сообщение о коммите, свою организацию и имя, которое вы хотели бы использовать в своем хранилище. Ответьте yes, чтобы инициализировать git, а затем предоставьте остальные подсказки с вашей индивидуальной информацией и предпочтениями GitHub. Когда Jenkins X импортирует приложение, оно создаст диаграммы Helm и файл Jenkinsfile в домашнем каталоге вашего приложения. Вы можете изменить эти диаграммы и файл Jenkins в соответствии с вашими требованиями.

Поскольку пример приложения RSVP работает на порту + 5000 + своего контейнера, измените файл + charts / rsvpapp / values.yaml +, чтобы он соответствовал этому. Откройте + charts / rsvpapp / values.yaml + в текстовом редакторе:

nano charts/rsvpapp/values.yaml

В этом файле + values.yaml + установите для + service: internalPort: + значение + 5000 +. После внесения изменений ваш файл должен выглядеть следующим образом:

Графики / rsvpapp / values.yaml

# Default values for python.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
image:
 repository: draft
 tag: dev
 pullPolicy: IfNotPresent
service:
 name: rsvpapp
 type: ClusterIP
 externalPort: 80
 internalPort:
 annotations:
   fabric8.io/expose: "true"
   fabric8.io/ingress.annotations: "kubernetes.io/ingress.class: nginx"
resources:
 limits:
   cpu: 100m
   memory: 128Mi
 requests:
   cpu: 100m
   memory: 128Mi
ingress:
 enabled: false

Сохраните и выйдите из файла.

Затем измените + charts / preview / needs.yaml + для соответствия вашему приложению. + needs.yaml + - это файл YAML, в котором разработчики могут объявлять зависимости диаграммы вместе с расположением диаграммы и желаемой версией. Поскольку наше приложение использует MongoDB для базы данных, вам нужно изменить файл + charts / preview / needs.yaml +, чтобы включить MongoDB в качестве зависимости. Откройте файл в текстовом редакторе с помощью следующей команды:

nano charts/preview/requirements.yaml

Отредактируйте файл, добавив запись + mongodb-replicaset + после записи + alias: cleanup +, как это выделено в следующем блоке кода:

графики / просмотр / requirements.yaml

# !! File must end with empty line !!
dependencies:
- alias: expose
 name: exposecontroller
 repository: http://chartmuseum.jenkins-x.io
 version: 2.3.92
- alias: cleanup
 name: exposecontroller
 repository: http://chartmuseum.jenkins-x.io
 version: 2.3.92




 # !! "alias: preview" must be last entry in dependencies array !!
 # !! Place custom dependencies above !!
- alias: preview
 name: rsvpapp
 repository: file://../rsvpapp

Здесь вы указали диаграмму + mongodb-replicaset + как зависимость для диаграммы + preview +.

Затем повторите этот процесс для вашей диаграммы + rsvpapp +. Создайте файл + charts / rsvpapp / needs.yaml + и откройте его в текстовом редакторе:

nano charts/rsvpapp/requirements.yaml

Когда файл открыт, добавьте следующее, убедившись, что до и после заполненных строк есть одна строка пустого пространства:

Графики / rsvpapp / requirements.yaml

dependencies:
- name: mongodb-replicaset
 repository: https://kubernetes-charts.storage.googleapis.com/
 version: 3.5.5

Теперь вы указали диаграмму + mongodb-replicaset + как зависимость для вашей диаграммы + rsvpapp +.

Затем, чтобы подключить внешний интерфейс примера приложения RSVP к бэкэнду MongoDB, добавьте переменную окружения + MONGODB_HOST + в файл + deploy.yaml + в + charts / rsvpapp / templates / +. Откройте этот файл в вашем текстовом редакторе:

nano charts/rsvpapp/templates/deployment.yaml

Добавьте следующие выделенные строки в файл, кроме одной пустой строки вверху файла и двух пустых строк внизу файла. Обратите внимание, что эти пустые строки необходимы для работы файла YAML:

графики / rsvpapp / шаблоны / deployment.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
 name: {{ template "fullname" . }}
 labels:
   draft: {{ default "draft-app" .Values.draft }}
   chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}"
spec:
 replicas: {{ .Values.replicaCount }}
 template:
   metadata:
     labels:
       draft: {{ default "draft-app" .Values.draft }}
       app: {{ template "fullname" . }}
{{- if .Values.podAnnotations }}
     annotations:
{{ toYaml .Values.podAnnotations | indent 8 }}
{{- end }}
   spec:
     containers:
     - name: {{ .Chart.Name }}
       image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"



       imagePullPolicy: {{ .Values.image.pullPolicy }}
       ports:
       - containerPort: {{ .Values.service.internalPort }}
       resources:
{{ toYaml .Values.resources | indent 12 }}

С этими изменениями Helm сможет развернуть ваше приложение с MongoDB в качестве своей базы данных.

Затем, проверьте + Jenkinsfile +, сгенерированный Jenkins X, открыв файл из домашнего каталога вашего приложения:

nano Jenkinsfile

Этот + Jenkinsfile + определяет конвейер, который запускается каждый раз, когда вы фиксируете версию своего приложения в своем хранилище GitHub. Если вы хотите автоматизировать тестирование кода, чтобы тесты запускались при каждом запуске конвейера, вы должны добавить тест в этот документ.

Чтобы продемонстрировать это, добавьте настраиваемый тестовый пример, заменив + sh" python -m unittest "+ в + stage ('CI Build and push snapshot') + и + stage ('Build Release') + в + Jenkinsfile + со следующими выделенными строками:

/ Rsvpapp / Jenkinsfile

. . .
 stages {
   stage('CI Build and push snapshot') {
     when {
       branch 'PR-*'
     }
     environment {
       PREVIEW_VERSION = "0.0.0-SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER"
       PREVIEW_NAMESPACE = "$APP_NAME-$BRANCH_NAME".toLowerCase()
       HELM_RELEASE = "$PREVIEW_NAMESPACE".toLowerCase()
     }
     steps {
       container('python') {


         sh "export VERSION=$PREVIEW_VERSION && skaffold build -f skaffold.yaml"
         sh "jx step post build --image $DOCKER_REGISTRY/$ORG/$APP_NAME:$PREVIEW_VERSION"
         dir('./charts/preview') {
           sh "make preview"
           sh "jx preview --app $APP_NAME --dir ../.."
         }
       }
     }
   }
   stage('Build Release') {
     when {
       branch 'master'
     }
     steps {
       container('python') {

         // ensure we're not on a detached head
         sh "git checkout master"
         sh "git config --global credential.helper store"
         sh "jx step git credentials"

         // so we can retrieve the version in later steps
         sh "echo \$(jx-release-version) > VERSION"
         sh "jx step tag --version \$(cat VERSION)"


         sh "export VERSION=`cat VERSION` && skaffold build -f skaffold.yaml"
         sh "jx step post build --image $DOCKER_REGISTRY/$ORG/$APP_NAME:\$(cat VERSION)"
       }
     }
   }
. . .

С добавленными строками конвейер Jenkins X установит зависимости и выполнит тест Python всякий раз, когда вы вносите изменения в свое приложение.

Теперь, когда вы изменили пример приложения RSVP, зафиксируйте и отправьте эти изменения в GitHub с помощью следующих команд:

git add *
git commit -m update
git push

Когда вы отправите эти изменения в GitHub, вы запустите новую сборку вашего приложения. Если вы откроете пользовательский интерфейс Jenkins, перейдя к + http: // jenkins.jx..nip.io + и введя «admin» для своего имени пользователя и пароля, вы найдете информацию о вашей новой сборке. Если вы нажмете «История сборки» в меню в левой части страницы, вы увидите историю ваших совершенных сборок. Если вы щелкнете по синему значку рядом со сборкой, а затем выберите «Консольный вывод» в левом меню, вы найдете выход консоли для автоматизированных шагов в вашем конвейере. Прокрутив до конца этого вывода, вы увидите следующее сообщение:

Output. . .
Finished: SUCCESS

Это означает, что ваше приложение прошло пользовательские тесты и теперь успешно развернуто.

Как только Jenkins X соберет релиз приложения, он переведет приложение в среду + staging +. Чтобы убедиться, что ваше приложение работает, перечислите приложения, запущенные в вашем кластере Kubernetes, с помощью следующей команды:

jx get app

Вы получите вывод, подобный следующему:

OutputAPPLICATION STAGING PODS URL
rsvpapp     0.0.2   1/1  http://rsvpapp.jx-staging..nip.io

Из этого вы можете видеть, что Jenkins X развернул ваше приложение в вашей среде + jx-staging + как версия + 0.0.2 +. В выводе также отображается URL, который вы можете использовать для доступа к своему приложению. Посещение этого URL покажет вам пример приложения RSVP:

изображение: https: //assets.digitalocean.com/articles/cart_64885/Sample_App_jx-staging.png [Пример приложения RSVP в промежуточной среде]

Далее, проверьте активность вашего приложения с помощью следующей команды:

jx get activity -f rsvpapp

Вы получите вывод, подобный следующему:

OutputSTEP                                        STARTED      AGO DURATION STATUS
/rsvpappv/master #1    3h42m23s    4m51s Succeeded Version: 0.0.1
 Checkout Source                          3h41m52s       6s Succeeded
 CI Build and push snapshot               3h41m46s          NotExecuted
 Build Release                            3h41m46s      56s Succeeded
 Promote to Environments                  3h40m50s    3m17s Succeeded
 Promote: staging                         3h40m29s    2m36s Succeeded
   PullRequest                            3h40m29s    1m16s Succeeded  PullRequest: https://github.com//environment-horsehelix-staging/pull/1 Merge SHA: dc33d3747abdacd2524e8c22f0b5fbb2ac3f6fc7
   Update                                 3h39m13s    1m20s Succeeded  Status: Success at: http://jenkins.jx..nip.io/job//job/environment-horsehelix-staging/job/master/2/display/redirect
   Promoted                               3h39m13s    1m20s Succeeded  Application is at: http://rsvpapp.jx-staging..nip.io
 Clean up                                 3h37m33s       1s Succeeded
/rsvpappv/master #2      28m37s    5m57s Succeeded Version: 0.0.2
 Checkout Source                            28m18s       4s Succeeded
 CI Build and push snapshot                 28m14s          NotExecuted
 Build Release                              28m14s      56s Succeeded
 Promote to Environments                    27m18s    4m38s Succeeded
 Promote: staging                           26m53s     4m0s Succeeded
   PullRequest                              26m53s     1m4s Succeeded  PullRequest: https://github.com//environment-horsehelix-staging/pull/2 Merge SHA: 976bd5ad4172cf9fd79f0c6515f5006553ac6611
   Update                                   25m49s    2m56s Succeeded  Status: Success at: http://jenkins.jx..nip.io/job//job/environment-horsehelix-staging/job/master/3/display/redirect
   Promoted                                 25m49s    2m56s Succeeded  Application is at: http://rsvpapp.jx-staging..nip.io
 Clean up                                   22m40s       0s Succeeded

Здесь вы получаете активность Jenkins X для приложения RSVP, применяя фильтр с помощью + -f rsvpapp +.

Далее, перечислите модули, работающие в пространстве имен + jx-staging +, с помощью следующей команды:

kubectl get pod -n jx-staging

Вы получите вывод, подобный следующему:

NAME                                 READY     STATUS    RESTARTS   AGE
jx-staging-mongodb-replicaset-0      1/1       Running   0          6m
jx-staging-mongodb-replicaset-1      1/1       Running   0          6m
jx-staging-mongodb-replicaset-2      1/1       Running   0          5m
jx-staging-rsvpapp-c864c4844-4fw5z   1/1       Running   0          6m

Эти выходные данные показывают, что ваше приложение работает в пространстве имен + jx-staging + вместе с тремя модулями базы данных MongoDB на сервере, придерживаясь изменений, которые вы внесли в файлы YAML ранее.

Теперь, когда вы запустили тестовое приложение через конвейер Jenkins X, вы можете попробовать продвинуть это приложение в производственную среду.

Шаг 6 - Продвижение вашего тестового приложения в другое пространство имен

Чтобы завершить эту демонстрацию, вы завершите процесс CI / CD, продвинув пример приложения RSVP в свое пространство имен + jx-production +.

Во-первых, используйте + jx advance + в следующей команде:

jx promote rsvpapp --version=0.0.2 --env=production

Это продвинет приложение + rsvpapp +, работающее с + version = 0.0.2 +, в производственную среду. На протяжении всего процесса сборки Jenkins X будет предлагать вам ввести информацию о вашей учетной записи GitHub. Ответьте на эти запросы с вашими индивидуальными ответами, как они появляются.

После успешного продвижения проверьте список приложений:

jx get app

Вы получите вывод, подобный следующему:

OutputAPPLICATION STAGING PODS URL                                             PRODUCTION PODS URL
rsvpapp     0.0.2   1/1  http://rsvpapp.jx-staging..nip.io 0.0.2      1/1  http://rsvpapp.jx-production..nip.io

С помощью этой информации «+ PRODUCTION» вы можете подтвердить, что Jenkins X внедрила приложение «+ rsvp» в производственную среду. Для дальнейшей проверки посетите производственный URL + http: // rsvpapp.jx-production..nip.io + в своем браузере. Вы должны увидеть работающее приложение, не запущенное из «производства»:

изображение: https: //assets.digitalocean.com/articles/cart_64885/Sample_App_jx-production.png [Пример приложения RSVP в производственной среде]

Наконец, перечислите ваши модули в пространстве имен + jx-production +.

kubectl get pod -n jx-production

Вы обнаружите, что в этом пространстве имен работают + rsvpapp + и модули MongoDB:

NAME                                     READY     STATUS    RESTARTS   AGE
jx-production-mongodb-replicaset-0       1/1       Running   0          1m
jx-production-mongodb-replicaset-1       1/1       Running   0          1m
jx-production-mongodb-replicaset-2       1/1       Running   0          55s
jx-production-rsvpapp-54748d68bd-zjgv7   1/1       Running   0          1m

Это показывает, что вы успешно внедрили образец приложения RSVP в свою производственную среду, имитируя готовое к развертыванию приложение в конце конвейера CI / CD.

Заключение

В этом руководстве вы использовали Helm для управления пакетами в смоделированном кластере Kubernetes и настроили диаграмму Helm для упаковки и развертывания своего собственного приложения. Вы также настраиваете среду Jenkins X в своем кластере Kubernetes и запускаете пример приложения через конвейер CI / CD от начала до конца.

Теперь у вас есть опыт работы с этими инструментами, которые вы можете использовать при создании системы CI / CD в своем собственном кластере Kubernetes. Если вы хотите узнать больше о шлеме, ознакомьтесь с нашим An Введение в шлем , менеджер пакетов для Kubernetes и How для установки программного обеспечения о кластерах Kubernetes с помощью диспетчера пакетов Helm. Чтобы узнать больше о CI / CD-инструментах в Kubernetes, вы можете прочитать о сервисной сетке Istio в следующем уроке из этой серии вебинаров.

Related