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»