Рубрики
Uncategorized

Как декларативно запустить Helm Charts, используя Helmfile

Cover Image от Kevin Ku на Unsplash. Вы когда -нибудь задумывались, как достичь полностью инфраструктуры как … с меткой Kubernetes, Helm, DevOps, новичков.

Изображение обложки от Кевин Ку на Неспособный

Задумывались ли вы, как добиться полной инфраструктуры в качестве кодового подхода для развертывания ваших приложений в кластере 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 ) и позволяет настроить спецификацию каждого выпуска в зависимости от типа среды (разработка, тест, производство), на которой вы можете развернуть свои приложения.

Лучший подход — показать, как это работает на примере. До этого нам нужно настроить рабочую среду. Если вы хотите выполнить мои шаги, вам нужно установить и настроить:

Когда все будет установлено, вы можете запустить 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

использованная литература

Оригинал: «https://dev.to/wkrzywiec/how-to-declaratively-run-helm-charts-using-helmfile-4ld8»