Kubernetes & Tools (4 серии деталей)
Изображение обложки от Эндрю Нил на Неспособный
В этом сообщении в блоге Я представляю шаг за шагом, как развернуть несколько приложений в кластере Kubernetes с помощью Helm.
Это вторая часть моей серии на Kubernetes. Он сравнивает три подхода приложений развертывания:
с kubectl — Развертывание нескольких приложений на кластере Kubernetes — пошагово
с Хелм — Вот этот,
с Helmfile — Как декларативно запустить Helm Charts, используя Helmfile .
Если вы не читали его первым, я бы посоветовал сделать это, а затем вернуться к этому посту. Но если вы предпочитаете прыгать сразу же к этому посту, не волнуйтесь, я кратко познакомлю вас с проектом.
Выше изображение представляет целевое решение. Внутри кластера будут развернуты фронтальные ( kanban-ui ) и бэкэнд ( kanban-app ) вместе с базой данных Postgres. Исходный код для обоих микросервисов можно найти в моем репозитории GitHub — Канбан-доска Анкет
Кроме того, я добавил Adminer , который является клиентом GUI для прохождения базы данных.
Если мы сосредоточимся на одной из услуг, например на Канбан-Уи Мы можем видеть, что он должен создать два объекта Kubernetes — Кластерип & Развертывание Анкет С помощью простого подхода, используя Kubectl, нам нужно было создать два файла для каждого объекта Kubernetes:
apiVersion: v1 kind: Service metadata: name: kanban-ui labels: group: backend spec: type: ClusterIP selector: app: kanban-ui ports: - port: 80 targetPort: 80
apiVersion: apps/v1 kind: Deployment metadata: name: kanban-ui labels: app: kanban-ui group: frontend spec: replicas: 1 selector: matchLabels: app: kanban-ui template: metadata: labels: app: kanban-ui group: frontend spec: containers: - name: kanban-ui image: wkrzywiec/kanban-ui:k8s ports: - containerPort: 80
Та же история для любого другого приложения — им нужны как минимум два файла определения. Некоторые из них требуют еще большего, таких как Postgres, которые должны иметь PersistentVolumeclaims определено дополнительно. В результате даже небольшого проекта мы можем получить множество файлов, которые очень похожи друг на друга:
Как достичь сухой в этом случае? Является ли это возможным?
Чтобы уменьшить количество файлов YAML, мы могли бы объединить их в один, например, для Канбан-Уи это будет выглядеть так:
apiVersion: v1 kind: Service metadata: name: kanban-ui labels: group: backend spec: type: ClusterIP selector: app: kanban-ui ports: - port: 80 targetPort: 80 --- apiVersion: apps/v1 kind: Deployment metadata: name: kanban-ui labels: app: kanban-ui group: frontend spec: replicas: 1 selector: matchLabels: app: kanban-ui template: metadata: labels: app: kanban-ui group: frontend spec: containers: - name: kanban-ui image: wkrzywiec/kanban-ui:k8s ports: - containerPort: 80
Но это все еще не решает основную проблему-как избежать копирования всего файла, чтобы заменить пару значений? Было бы здорово, если бы есть способ определить план для обоих объектов, а затем вводить значения в определенные поля.
К счастью, есть решение! Хелм на помощь!
Соответственно с официальным веб -сайтом — Хелм менеджер пакетов для Kubernetes . Это помогает развернуть сложное приложение, объединив необходимые ресурсы в Диаграммы , который содержит всю информацию для запуска приложения на кластере.
Есть пара подходов, как работать с Хелм Анкет Один из них — скачать общедоступные диаграммы из Хелм Хаб . Они подготовлены сообществом и могут свободно использовать.
Например, если мы хотим запустить Прометей На кластере это было бы просто легко, как описано на этой странице — https://hub.helm.sh/charts/stable/prometheus — С одной командой:
> helm install stable/prometheus
Он содержит некоторую конфигурацию по умолчанию, но может быть легко переопределена с файлом YAML и прошел во время установки. Подробный пример, который я покажу через минуту.
Но Хелм Не только предоставляет некоторые предопределенные чертежи, вы можете создать свои собственные диаграммы!
Это очень просто и может быть сделано одной командой Хелм создать <чартное имя>
, который создает папку с основной структурой:
> helm create example Creating example
В шаблонах/папке есть Шаблоны шлема что с комбинацией значений. YAML приведет к набору объектов Kubernetes.
Давайте создадим первую диаграмму — Postgres Анкет
Но непосредственно перед этим, скучные инсталляции и конфигурации (но обещайте, это пойдет быстро). В моей демонстрации я использую:
Docker В
Локально установлен Kubernetes Cluster — minikube В
Командная строка Kubernetes — kubectl В
Хелм (v3) Анкет
Когда все будет установлено, вы можете запустить кластер Minikube и включить Adress Addon:
> minikube start 😄 minikube v1.8.1 on Ubuntu 18.04 ✨ Automatically selected the docker driver 🔥 Creating Kubernetes in docker container with (CPUs=2) (8 available), Memory=2200MB (7826MB available) ... 🐳 Preparing Kubernetes v1.17.3 on Docker 19.03.2 ... ▪ kubeadm.pod-network-cidr=10.244.0.0/16 ❌ Unable to load cached images: loading cached images: stat /home/wojtek/.minikube/cache/images/k8s.gcr.io/kube-proxy_v1.17.3: no such file or directory 🚀 Launching Kubernetes ... 🌟 Enabling addons: default-storageclass, storage-provisioner ⌛ Waiting for cluster to come online ... 🏄 Done! kubectl is now configured to use "minikube" > minikube addons enable ingress 🌟 The 'ingress' addon is enabled
Тогда вам нужно будет отредактировать вас Хозяева файл. Его местоположение варьируется на ОС:
Когда вы обнаружите, что добавьте следующие строки:
172.17.0.2 adminer.k8s.com 172.17.0.2 kanban.k8s.com
Чтобы убедиться, что эта конфигурация верна, вам нужно проверить, является ли IP -адрес minikube Кластер на вашей машине такой же, как и выше. Чтобы сделать это запустить команду:
> minikube ip 172.17.0.2
Теперь мы можем создать первую диаграмму Helm:
> helm create postgres Creating postgres
Нам не понадобятся сгенерированные файлы внутри ./Templates
Папка, так что удалите их, а также очистите весь контент внутри values.yaml Анкет
Теперь мы можем свернуть наши рукава и определить все необходимые файлы для создания диаграммы для базы данных Postgres. Для напоминания, чтобы развернуть его с Kubectl У нас должно было быть следующие файлы:
Они содержат определения Configmap, развертывание, PersistentVolumeclair и Кластерип . Их полные определения можно найти в репозитории Анкет
Во -первых, давайте создадим шаблон для Postgres Развертывание объект, поэтому внутри ./Templates
Создать развертывание. YAML файл:
На первый взгляд вы можете увидеть эти странные части между двумя парами вьющихся кронштейнов, таких как {{.Values.postgres.name}}
Анкет Они написаны в Go шаблонный язык и ссылаются на значение, расположенное в values.yaml который расположен внутри корневой папки диаграммы. Для упомянутого примера Helm попытается сопоставить его со значением от values.yaml :
postgres: name: postgres
Другой пример. Значение для базового изображения Docker, определенного на изображении: {{.Values.postgres.container.image}}
будет взят из:
postgres: name: postgres container: image: postgres:9.6-alpine
И так далее. Мы можем определить структуру внутри этого файла, что бы нам нравится.
Это развертывание базы данных требует PersistentVolumeclair Чтобы быть созданным, чтобы зарезервировать некоторое хранилище на диске, поэтому нам нужно создать шаблон шлема — Pvc.yaml Внутри ./Templates
папка:
Это короче, и здесь нет ничего нового.
Следующий шаблон, который нам нужно создать, для Кластерип , что позволит другим Стручки Внутри кластера, чтобы ввести* стручку с Postgres — Service.yaml :
И, наконец, Configmap Шаблон должен быть создан — config.yaml Анкет Он содержит информацию о созданной базе данных, пользователе и его пароле (да, не очень безопасно, но для простого примера этого достаточно).
Здесь вы можете увидеть странное {{-range ...}}
пункт, который может быть переведен как для каждого цикла, известного на любом языке программирования. В приведенном выше примере шаблон шлема попытается ввести значения из массива, определенного в Значения.yaml :
postgres: config: data: - key: key value: value
Внутри шаблона есть только фиктивные значения. Если вы хотите иметь разные, вам необходимо переопределить их во время установки этого набора объектов в кластере Kubernetes.
Все values.yaml подарки следующим образом:
replicaCount: 1 postgres: name: postgres group: db container: image: postgres:9.6-alpine port: 5432 service: type: ClusterIP port: 5432 volume: name: postgres-storage kind: PersistentVolumeClaim mountPath: /var/lib/postgresql/data pvc: name: postgres-persistent-volume-claim accessMode: ReadWriteOnce storage: 4Gi config: name: postgres-config data: - key: key value: value
Чтобы завершить создание первой диаграммы, нам нужно изменить некоторые метаданные внутри Chart.yaml файл:
apiVersion: v2 name: postgres description: A Helm chart for PostgreSQL database type: application version: 0.1.0 appVersion: 1.16.0 keywords: - database - postgres home: https://github.com/wkrzywiec/k8s-helm-helmfile/tree/master/helm maintainers: - name: Wojtek Krzywiec url: https://github.com/wkrzywiec
Затем создайте новый Kanban-postgres.yaml Файл, который содержит некоторые конкретные значения. Поместите это за пределы Postgres
Папка диаграммы, чтобы структура файла была похожа на эту:
Внутри файла поместите только значения, которые будут специфичными для этого развертывания, то есть учетные данные по базе данных Postgres (все другие значения, которые мы можем сохранить в качестве по умолчанию):
postgres: config: data: - key: POSTGRES_DB value: kanban - key: POSTGRES_USER value: kanban - key: POSTGRES_PASSWORD value: kanban
Все настроено, теперь мы можем развернуть Postgres в кластер. В мире руля этот шаг называется «Создание нового Выпуск :
> helm install -f kanban-postgres.yaml postgres ./postgres NAME: postgres LAST DEPLOYED: Mon Apr 13 16:13:16 2020 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None > helm list NAME NAMESPACE REVISION STATUS CHART APP VERSION postgres default 1 deployed postgres-0.1.0 1.16.0 > kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE postgres 1/1 1 1 2m14s
Круто, Postgres работает и работает! Прежде чем двигаться вперед, давайте поближе посмотрите на команду установки Helm, что означает каждый аргумент:
Если вы планируете использовать диаграмму только для того, чтобы создать один выпуск Helm, вы можете задаться вопросом, что стоит за использованием Helm.
Позвольте мне показать вам это в другом примере. Давайте создадим новую таблицу под названием приложение — Это будет диаграмма шаблонов для трех разных выпусков — Adminer , Kanban-App & Канбан-Уи Анкет
> helm create app Creating app
После удаления ненужного файла из ./Templates
Папка и очистка values.yaml Создать развертывание. YAML файл:
Ничего нового, в частности, только некоторые заполнители для значений и двух циклов диапазона, чтобы вводить значения из *configmap *s или простые значения в контейнер приложения.
Все 3 приложения требуют, чтобы также иметь Кластерип Объекты, которые будут развернуты, поэтому вот его шаблон — Service.yaml :
Все значения по умолчанию в обоих шаблонах вводятся из values.yaml :
app: name: app group: app replicaCount: 1 container: image: add-image-here port: 8080 config: [] env: - key: key value: value service: type: ClusterIP port: 8080
И чтобы закрыть задачу создания диаграммы приложений — нам нужно определить некоторые метаданные в Chart.yaml файл:
apiVersion: v2 name: app description: A Helm chart for any application type: application version: 0.1.0 appVersion: 1.16.0 keywords: - app - java - javascript - angular home: https://github.com/wkrzywiec/k8s-helm-helmfile/tree/master/helm maintainers: - name: Wojtek Krzywiec url: https://github.com/wkrzywiec
Затем, аналогично предыдущему примеру, за пределами папки приложения создайте файлы YAML со значениями, которые будут переопределять из них из Значения.yaml Внутренняя диаграмма приложений.
А Adminer.yaml Файл выглядит следующим образом:
app: name: adminer group: db container: image: adminer:4.7.6-standalone port: 8080 env: - key: ADMINER_DESIGN value: pepa-linha - key: ADMINER_DEFAULT_SERVER value: postgres
A Kanban-app.yaml файл:
app: name: kanban-app group: backend container: image: wkrzywiec/kanban-app:k8s config: - name: postgres-config env: - key: DB_SERVER value: postgres
A Kanban-ui.yaml файл:
app: name: kanban-ui group: frontend container: image: wkrzywiec/kanban-ui:k8s port: 80
Полученная структура файла:
Теперь , Для создания трех выпусков для каждого приложения используйте команды:
> helm install -f adminer.yaml adminer ./app NAME: adminer LAST DEPLOYED: Mon Apr 13 16:57:17 2020 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None > helm install -f kanban-app.yaml kanban-app ./app NAME: kanban-app LAST DEPLOYED: Mon Apr 13 16:57:36 2020 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None > helm install -f kanban-ui.yaml kanban-ui ./app NAME: kanban-ui LAST DEPLOYED: Mon Apr 13 16:57:54 2020 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None > helm list NAME NAMESPACE REVISION STATUS CHART APP VERSION adminer default 1 deployed app-0.1.0 1.16.0 kanban-app default 1 deployed app-0.1.0 1.16.0 kanban-ui default 1 deployed app-0.1.0 1.16.0 postgres default 1 deployed postgres-0.1.0 1.16.0 > kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE adminer 1/1 1 1 112s kanban-app 1/1 1 1 93s kanban-ui 1/1 1 1 75s postgres 1/1 1 1 45m
Идеальный! Есть еще одна вещь — создайте диаграмму с Контроллер входа — шлюз в кластер.
Как и раньше, создайте новый график:
> helm create ingress Creating ingress
Удалить все файлы из папки шаблонов и очистить содержимое values.yaml Анкет На этот раз, прежде чем сразу перейти к определению шаблонов, давайте сосредоточимся на Chart.yaml первый.
apiVersion: v2 name: ingress description: A Helm chart for Ingress Controller type: application version: 0.1.0 appVersion: 1.16.0 keywords: - ingress - nginx - api-gateway home: https://github.com/wkrzywiec/k8s-helm-helmfile/tree/master/helm maintainers: - name: Wojtek Krzywiec url: https://github.com/wkrzywiec dependencies: - name: nginx-ingress version: 1.36.0 repository: https://kubernetes-charts.storage.googleapis.com/
Здесь есть новый раздел — зависимости
— который был добавлен. Он создает бэкэнд -сервисы по умолчанию, которые позволяют Контроллер входа Особенности.
Но это не единственное, что нам нужно сделать здесь. Этот раздел определяет только от того, от чего зависит этот диаграмма, он не загружает его автоматически во время установки. Мы должны позаботиться об этом сами. Чтобы сделать это запустить команду:
> helm dependency update ./ingress/ Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "stable" chart repository Update Complete. ⎈Happy Helming!⎈ Saving 1 charts Downloading nginx-ingress from repo [https://kubernetes-charts.storage.googleapis.com/](https://kubernetes-charts.storage.googleapis.com/) Deleting outdated charts
Внутри Вход/диаграммы
Папка появится новый файл — nginx-ingress-1.36.0.tgz
Анкет
Теперь мы можем определить шаблон для входа — он будет расположен внутри ./Templates
папка и будет называться Ingress.yaml :
Наиболее интересной частью находится в разделе спецификации. Там есть две вложенные петли, которые позволяют определять несколько хостов и несколько путей для каждого хоста.
А также вот по умолчанию values.yaml файл:
ingress: name: ingress-service replicaCount: 1 annotations: class: nginx hosts: - host: chart-example.local paths: - path: / backend: serviceName: serviceName servicePort: 8080
Полученная структура папки:
За пределами вход
Диаграмма мы теперь можем создать Ingress.yaml Файл, который будет хранить все правила маршрутизации для нашего кластера.
ingress: hosts: - host: adminer.k8s.com paths: - path: / backend: serviceName: adminer servicePort: 8080 - host: kanban.k8s.com paths: - path: /api/ backend: serviceName: kanban-app servicePort: 8080 - path: / backend: serviceName: kanban-ui servicePort: 80
И теперь мы можем создать релиз Helm:
> helm install -f ingress.yaml ingress ./ingress NAME: ingress LAST DEPLOYED: Tue Apr 14 07:22:44 2020 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None > helm list NAME NAMESPACE REVISION STATUS CHART APP VERSION adminer default 1 deployed app-0.1.0 1.16.0 ingress default 1 deployed ingress-0.1.0 1.16.0 kanban-app default 1 deployed app-0.1.0 1.16.0 kanban-ui default 1 deployed app-0.1.0 1.16.0 postgres default 1 deployed postgres-0.1.0 1.16.0 > kubectl get deployments NAME READY UP-TO-DATE AVAILABLE adminer 1/1 1 1 ingress-nginx-ingress-controller 1/1 1 1 ingress-nginx-ingress-default-backend 1/1 1 1 kanban-app 1/1 1 1 kanban-ui 1/1 1 1 postgres 1/1 1 1
Все настроено, вы можете начать тестирование. Перейти к http://kanban.k8s.com И вы должны получить эту страницу:
Поздравляю! 🍾🤘
Выводы
В этой короткой записи я представил, как, с помощью русла, вы можете сократить задачи, пропагандирующие копию, и можете принести единый шаблон для развертывания нескольких приложений в кластере Kubernetes, который может быть очень удобен в мире микросервиса. Надеюсь, вам понравилось.
Но остается еще одна вещь, которая удерживает нас от создания полностью декларативного подхода к инфраструктуре. Чтобы развернуть каждое приложение, нам все еще нужно запустить императивные команды, такие как Helm Install. Но, к счастью, есть еще один инструмент — Helmfile! Но Это я опишу в своей следующей истории.
На данный момент, вот мой репозиторий GitHub с исходным кодом для этого проекта: wkrzywiec/k8s-helm-helmfile на github.com
А вот исходный код проекта Kanban: Wkrzywiec/Kanban-Board на github.com
Рекомендации
- Документы домой на Helm.sh
- Лучшие практики руководителя на codefresh.io
- Пакет приложения Kubernetes с рулем на akomljen.com
- Радикально улучшить развертывание Kubernetes с помощью русла на itnext.io
- Alexellis/helm3-expressjs-tutorial на github.com
Kubernetes & Tools (4 серии деталей)
Оригинал: «https://dev.to/wkrzywiec/how-to-deploy-application-on-kubernetes-with-helm-8p»