Изображение обложки от Кевин Ку на Неспособный
Задумывались ли вы, как добиться полной инфраструктуры в качестве кодового подхода для развертывания ваших приложений в кластере Kubernetes? Независимо от того, достигли ли вы этого или только начали искать лучший инструмент, Helmfile может быть ответом для вас. В этом сообщении я представлю, как вы можете настроить свой первый Helmfile.
Этот пост является третьим и последним, от моей серии на Kubernetes. В каждом из них я представляю, как развернуть приложения на кластере Kubernetes, используя один из подходов:
используя kubectl — Развертывание нескольких приложений на кластере Kubernetes — Прохождение В
используя Хелм — Как развернуть приложение на Kubernetes с Helm В
используя Helmfile — Вот этот.
Если вы не читали первые два, я бы порекомендовал сделать это, прежде чем погрузиться в этот. Но это не обязательно, я кратко представлю вас в среде, которая будет построена.
Выше изображение представляет целевое решение. Внутри кластера будет развернут фронт ( kanban-ui ) и бэкэнд ( kanban-app ). Будет использоваться база данных Postgres Postgres. Исходный код для обоих микросервисов можно найти в моем репозитории GitHub — Канбан-доска Анкет
Кроме того, я добавил Adminer Приложение, которое является клиентом GUI для прохождения базы данных.
На рисунке выше показаны не только приложения, которые будут развернуты на Kubernetes кластер, но также и объекты, которые необходимы для их запуска, как Развертывания или Услуги . С классикой, kubectl Подход, мы были вынуждены создавать файлы определения для каждого из них. Даже если в большинстве случаев, например, в случае Кластерипы Эти объекты не сильно отличаются между приложениями.
Определенно этот подход не масштабируется в мире микросервиса, где обычно необходимо развернуть десятки или даже сотни приложений. И если для каждого из них нам потребуется создать пару файлов YAML, это действительно быстро станет кошмаром. Но эта проблема может быть решена с помощью Kubernetes шаблонный двигатель — Хелм Анкет Мы можем определить общий Хелм Диаграмма (шаблон) и повторно использовал его в нескольких приложениях только путем введения конкретных значений в шаблон.
Это проблема решена?
В некотором расширении да, но вот недостаток использования Хелм Анкет Чтобы установить или обновить любую диаграмму в кластере, вам необходимо запустить конкретную императивную команду. Другими словами, чтобы изменить состояние кластера, вам необходимо запустить команду, которая является конкретной для данного развертывания.
В мире Java мы используем Maven или для JavaScript мы используем npm . Оба эти инструмента позволяют запускать одну и ту же команду в нескольких проектах, чтобы выполнить одно и то же действие, как запуск тестов — MVN Тест
Анкет Хелм в настоящее время не поддерживает эту функцию, мы не можем установить, обновлять или откатить все приложения из всего кластера с помощью одной команды.
Но есть Helmfile , что может быть лекарством.
Helmfile Позволяет объявить определение всего Kubernetes кластер в одном файле yaml, он объединяет несколько Хелм Выпуски (установка графиков Helm ) и позволяет настроить спецификацию каждого выпуска в зависимости от типа среды (разработка, тест, производство), на которой вы можете развернуть свои приложения.
Лучший подход — показать, как это работает на примере. До этого нам нужно настроить рабочую среду. Если вы хотите выполнить мои шаги, вам нужно установить и настроить:
Локально установлен Kubernetes Cluster — Minikube ,
Командная строка Kubernetes — kubectl,
Helmfile Анкет
Когда все будет установлено, вы можете запустить Minikube кластер и включите Andress 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
Подготовка сделана, давайте сделаем немного Helmfile магия В предыдущем сообщении в блоге — Как развернуть приложение на Kubernetes с Helm — Я описал, как создать Helm Charts для проекта Kanban Board. Здесь мы их повторно используем. Поэтому копировать вставку все файлы отсюда- K8s-Helm-Helmfile/Helm .
Все папки — приложение
, Вход
, Postgres
— Поместите внутрь новой, называемой диаграммы и все файлы YAML, помещенные в новую папку, называемую Значения
Анкет Затем добавьте новый helmfile.yaml файл в корневой каталог, поэтому полученная структура будет выглядеть следующим образом:
Позвольте мне кратко объяснить, что означает каждая из этих папок:
./charts
— Вот все три диаграммы Helms, которые представляют собой шаблоны для каждого выпуска —приложение
(для adminer , Канбан-Уи В Kanban-App ),постгрес
иВход
Вhelmfile.yaml
— Здесь будет конфигурация для Helmfile , в настоящее время пусто,./ценности
— Папка со значениями, которые являются специфическими для каждого приложения, которое будет развернуто.
Прежде чем перейти к заполнению helmfile.yaml Я хочу настроить одну вещь. В предыдущем, родной Хелм , решение есть вход
Диаграмма, которая имеет зависимость от nginx-ingress helm helm диаграмма доступна на Helm Hub Анкет Перед установкой его на кластере нам нужно было загрузить его (будет сохранен в .Charts/Ingress/Dicarts
Папка) с использованием отдельной команды Helm.
Если мы используем Helmfile Последний шаг не понадобится, потому что он выяснит и загрузит все необходимые зависимости внутри каждой диаграммы. Итак, мы могли бы сохранить Вход
Таблица как есть, но на этот раз я хотел бы иметь другой подход. Я хотел бы лечить nginx-ingress Диаграмма как отдельный Хелм Выпуск, кроме Контроллер входа Конфигурация для маршрутизации.
Поэтому удалите следующие строки из ./charts/ingress/chart.yaml
файл:
dependencies: - name: nginx-ingress version: 1.36.0 repository: https://kubernetes-charts.storage.googleapis.com/
Также вы можете удалить Chart.lock
файл полностью.
После этих изменений вход Хелм Диаграмма отвечает только за определение *контроллера входа. Требуемый бэкэнд -сервис вступления будет представлена с выпуском Helm.
Теперь, наконец, мы можем перейти к организации helmfile.yaml Анкет
Сначала нам нужно указать, из чего Хелм Репозитории Мы хотели бы загрузить диаграммы. Потому что мы будем загружать только один — стабильный/nginx-ingress — Диаграмма из одного репо, мы поместили одну запись:
repositories: - name: stable url: https://kubernetes-charts.storage.googleapis.com
Затем мы можем перейти к следующему разделу — определение Хелм выпуски. Он будет содержать список всех приложений, которые Helmfile нужно будет развернуть. Начиная с первого — Postgres
:
releases: - name: postgres chart: ./charts/postgres values: - ./values/kanban-postgres.yaml
Здесь не так много, но для ясности:
имя
— это имя релиза, мы можем назвать, что нам нравится,Диаграмма
— рассказывает Helmfile где база Хелм Диаграмма расположена,Значения
— Потому что мы используем Хелм Шаблон диаграммы, мы хотели бы ввести некоторые значения в него, так что вот список Yaml файлы, которые их удерживают.
Далее, давайте определим релизы, основанные на диаграмме приложений:
releases: - name: adminer chart: ./charts/app values: - ./values/adminer.yaml - name: kanban-app chart: ./charts/app values: - ./values/kanban-app.yaml - name: kanban-ui chart: ./charts/app values: - ./values/kanban-ui.yaml
А затем мы определяем Хелм выпуск для Вход Бэкэнд, который будет загружен из публичного хранилища:
releases: - name: ingress-backend chart: stable/nginx-ingress version: 1.36.0
В Диаграмма
Раздел. стабильный/
Префикс является названием репозитория, который был определен в Репозитории
Несколько мгновений назад.
В версии мы указываем, какую версию диаграммы использовать.
И, наконец, определение для Включение контроллера Хелм выпускать:
releases: - name: ingress-controller chart: ./charts/ingress values: - ./values/ingress.yaml
И если мы объединим их все, helmfile.yaml будет выглядеть следующим образом:
repositories: - name: stable url: https://kubernetes-charts.storage.googleapis.com releases: - name: postgres chart: ./charts/postgres values: - ./values/kanban-postgres.yaml - name: adminer chart: ./charts/app values: - ./values/adminer.yaml - name: kanban-app chart: ./charts/app values: - ./values/kanban-app.yaml - name: kanban-ui chart: ./charts/app values: - ./values/kanban-ui.yaml - name: ingress-backend chart: stable/nginx-ingress version: 1.36.0 - name: ingress-controller chart: ./charts/ingress values: - ./values/ingress.yaml
И теперь это забавная часть, только с двумя командами мы можем развернуть все приложения.
Во -первых, нам нужно добавить репозиторий в наш экземпляр Helm (вам нужно сделать это только один раз):
> helmfile repos Adding repo stable [https://kubernetes-charts.storage.googleapis.com](https://kubernetes-charts.storage.googleapis.com) "stable" has been added to your repositories Updating repo Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "stable" chart repository Update Complete. ⎈ Happy Helming!⎈
Затем установите все диаграммы на кластер:
> helmfile sync Adding repo stable [https://kubernetes-charts.storage.googleapis.com](https://kubernetes-charts.storage.googleapis.com) "stable" has been added to your repositories Updating repo Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "stable" chart repository Update Complete. ⎈ Happy Helming!⎈ Building dependency release=postgres, chart=charts/postgres Building dependency release=adminer, chart=charts/app Building dependency release=kanban-app, chart=charts/app Building dependency release=kanban-ui, chart=charts/app Building dependency release=ingress-controller, chart=charts/ingress Affected releases are: adminer (./charts/app) UPDATED ingress-backend (stable/nginx-ingress) UPDATED ingress-controller (./charts/ingress) UPDATED kanban-app (./charts/app) UPDATED kanban-ui (./charts/app) UPDATED postgres (./charts/postgres) UPDATED Upgrading release=postgres, chart=charts/postgres Upgrading release=kanban-app, chart=charts/app Upgrading release=adminer, chart=charts/app Upgrading release=kanban-ui, chart=charts/app Upgrading release=ingress-controller, chart=charts/ingress Upgrading release=ingress-backend, chart=stable/nginx-ingress Release "adminer" does not exist. Installing it now. NAME: adminer LAST DEPLOYED: Wed Apr 15 16:16:31 2020 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None Listing releases matching ^adminer$ Release "kanban-ui" does not exist. Installing it now. NAME: kanban-ui LAST DEPLOYED: Wed Apr 15 16:16:31 2020 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None Listing releases matching ^kanban-ui$ adminer default 1 2020-04-15 16:16:31.990139954 +0200 CEST deployed app-0.1.0 1.16.0 Release "kanban-app" does not exist. Installing it now. NAME: kanban-app LAST DEPLOYED: Wed Apr 15 16:16:31 2020 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None Listing releases matching ^kanban-app$ kanban-ui default 1 2020-04-15 16:16:31.968291217 +0200 CEST deployed app-0.1.0 1.16.0 Release "postgres" does not exist. Installing it now. NAME: postgres LAST DEPLOYED: Wed Apr 15 16:16:31 2020 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None Listing releases matching ^postgres$ kanban-app default 1 2020-04-15 16:16:31.958860307 +0200 CEST deployed app-0.1.0 1.16.0 postgres default 1 2020-04-15 16:16:31.958951797 +0200 CEST deployed postgres-0.1.0 1.16.0 Release "ingress-controller" does not exist. Installing it now. NAME: ingress-controller LAST DEPLOYED: Wed Apr 15 16:16:31 2020 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None Listing releases matching ^ingress-controller$ ingress-controller default 1 2020-04-15 16:16:31.958844983 +0200 CEST deployed ingress-0.1.0 1.16.0 Release "ingress-backend" does not exist. Installing it now. NAME: ingress-backend LAST DEPLOYED: Wed Apr 15 16:16:35 2020 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: The nginx-ingress controller has been installed. It may take a few minutes for the LoadBalancer IP to be available. You can watch the status by running 'kubectl --namespace default get services -o wide -w ingress-backend-nginx-ingress-controller' An example Ingress that makes use of the controller: apiVersion: extensions/v1beta1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: nginx name: example namespace: foo spec: rules: - host: [www.example.com](http://www.example.com) http: paths: - backend: serviceName: exampleService servicePort: 80 path: / # This section is only required if TLS is to be enabled for the Ingress tls: - hosts: - [www.example.com](http://www.example.com) secretName: example-tls If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided: apiVersion: v1 kind: Secret metadata: name: example-tls namespace: foo data: tls.crt:tls.key: type: kubernetes.io/tls Listing releases matching ^ingress-backend$ ingress-backend default 1 2020-04-15 16:16:35.070513181 +0200 CEST deployed nginx-ingress-1.36.0 0.30.0 UPDATED RELEASES: NAME CHART VERSION adminer ./charts/app 0.1.0 kanban-ui ./charts/app 0.1.0 kanban-app ./charts/app 0.1.0 postgres ./charts/postgres 0.1.0 ingress-controller ./charts/ingress 0.1.0 ingress-backend stable/nginx-ingress 1.36.0
Через пару минут вы сможете войти http://kanban.k8s.com Анкет
Вывод
Вот и все! Очень просто и все — настройка внешнего репозитория и список каждого Хелм Выпуски находятся в одном файле, который можно хранить в системе управления версиями (например, GIT
И то, что больше следует упомянуть, что тезисы не единственные особенности Helmfile . Больше из них вы можете найти в Официальная документация Анкет
Подводя итог всей серии, я надеюсь, что вы что -то узнаете, и вы узнаете, в чем разница для развертывания в родном Kubernetes , Хелм и Helmfile . Я надеюсь, что для вас станет более ясно, как каждый из них выглядит и каковы они плюсы и минусы. Вы можете прокомментировать это здесь или в другом сообщении в блоге, что вам нравится и что, по вашему мнению, стоит исправить с моей стороны. Буду признателен.
Как обычно, вот ссылка на исходный код — на этот проект:
wkrzywiec/k8s-helm-helmfile
Проект, который сравнивает 3 подхода для развертывания приложений в кластере Kubernetes (с помощью Kubectl, Helm & Helmfile)
И для проекта Kanban-Board:
Wkrzywiec/Kanban-Board
Приложение с полным стеком с одним щелчком (Postgres, Spring Boot & Angular) с использованием Docker Compose
использованная литература
- Роболл/Хельмфил на github.com
Helmfile — декларативная спецификация для развертывания хелм на reddit.com
Оригинал: «https://dev.to/wkrzywiec/how-to-declaratively-run-helm-charts-using-helmfile-4ld8»