Thank you for reading this post, don't forget to subscribe!
На картинке выше представлено целевое решение. Внутри кластера будет развернут фронтенд ( kanban-ui ) и backend ( kanban-app ). Для сохранения данных будет использоваться база данных postgres
Кроме того, я добавил приложение администратора , которое является клиентом с графическим интерфейсом для входа в базу данных.
На приведенном выше рисунке показаны не только приложения, которые будут развернуты в кластере Kubernetes , но и объекты, необходимые для их запуска, такие как Deployments или Services . При классическом подходе kubectl мы были вынуждены создавать файлы определений для каждого из них. Даже если в большинстве случаев, например, в случае ClusterIP , эти объекты не сильно различаются между приложениями.
Определенно, этот подход не масштабируется в мире микросервисов, где обычно необходимо развернуть десятки или даже сотни приложений. И если бы для каждого из них нам потребовалось бы создать пару файлов YAML, это быстро превратилось бы в кошмар. Но эту проблему можно решить с помощью движка шаблонов Kubernetes - Helm . Мы можем определить общую диаграмму (шаблон) Helm и повторно использовать ее в нескольких приложениях, только добавив определенные значения в шаблон.
Проблема решена?
В некоторой степени да, но в использовании Helm есть один недостаток . Чтобы установить или обновить любую диаграмму в кластере, вам необходимо выполнить определенную императивную команду. Другими словами, чтобы изменить состояние кластера, вам нужно запустить команду, специфичную для данного развертывания.
В мире Java мы используем Maven, а для JavaScript - npm . Оба этих инструмента позволяют запускать одну и ту же команду в нескольких проектах для выполнения одного и того же действия, например, запуска тестов - mvn test
. Helm в настоящее время не поддерживает эту функцию, мы не можем установить, обновить или откатить все приложения из всего кластера с помощью одной команды.
Но есть файл helmfile , который может помочь .
Helmfile позволяет объявить определение всего кластера Kubernetes в одном файле YAML, он объединяет несколько выпусков Helm (установка диаграмм Helm ) и позволяет настраивать спецификацию каждого выпуска в зависимости от типа среды (разработка, тестирование, производство) на котором вы, возможно, захотите развернуть свои приложения.
Лучше всего показать, как это работает, на примере. Перед этим нам нужно настроить рабочую среду. Если вы хотите следовать моим шагам, вам необходимо установить и настроить:
- Докер,
- локально установленный кластер Kubernetes - minikube ,
- Инструмент командной строки Kubernetes - kubectl,
- Шлем (v3) ,
- helmfile .
1 2 3 4 5 6 7 8 9 10 11 |
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 |
- Ubuntu
- Windows
- MacOS
172.17.0.2 adminer.k8s.com
172.17.0.2 kanban.k8s.com
$ minikube ip
172.17.0.2
Все папки - app
, ingress
, postgres
- поместить в новом называется charts
и все YAML файлов поместить в новой папке под названием values
. Затем добавьте новый helmfile.yaml
файл в корневой каталог, чтобы получившаяся структура выглядела следующим образом:
что означает каждая из этих папок:
./charts
- вот все три диаграммы Helms, которые являются шаблонами для каждого выпуска -app
(для администратора , kanban -ui , kanban-app )postgres
иingress
,helmfile.yaml
- здесь будет конфигурация для файла управления , в настоящее время пустого,./values
- папка со значениями, специфичными для каждого приложения, которое будет развернуто.
Если мы используем helmfile, последний шаг не понадобится, потому что он определит и загрузит все необходимые зависимости внутри каждой диаграммы. Итак, мы могли бы оставить ingress
диаграмму такой, какая она есть, но на этот раз я хотел бы использовать другой подход. Я хотел бы рассматривать nginx-ingress chart как отдельный выпуск Helm , помимо конфигурации Ingress Controller для маршрутизации.
Поэтому удалите из ./charts/ingress/Chart.yaml
файла следующие строки :
1 2 3 4 |
dependencies: - name: nginx-ingress version: 1.36.0 repository: https://kubernetes-charts.storage.googleapis.com/ |
После этих изменений диаграмма ingress
Helm отвечает только за определение Ingress Controller. Требуется обслуживание бэкенда Ingress будет введено с выпуском Helm.
Теперь, наконец, мы можем перейти к аранжировке файла helmfile.yaml
.
Сначала нам нужно указать, из каких репозиториев Helm мы хотим загружать диаграммы. Поскольку мы будем загружать только один - стабильный / nginx-ingress - график из одного репо, мы поместили одну запись:
1 2 3 4 5 6 7 8 |
repositories: - name: stable url: https://kubernetes-charts.storage.googleapis.com releases: - name: postgres chart: ./charts/postgres values: - ./values/kanban-postgres.yaml |
name
- это название релиза, мы можем называть как угодно,chart
- сообщает helmfile, где находится базовая карта Helm ,values
- поскольку мы используем шаблон диаграммы Helm , мы хотели бы добавить в него некоторые значения, поэтому вот список файлов YAML, которые их содержат.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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 |
В version
поле мы указываем, какую версию диаграммы использовать.
И, наконец, определение релиза Ingress Controller Helm :
1 2 3 4 5 |
releases: - name: ingress-controller chart: ./charts/ingress values: - ./values/ingress.yaml |
общий вид следующий:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
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 (вам нужно будет сделать это только один раз):
1 2 3 4 5 6 7 |
$ helmfile repos Adding repo stable 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!⎈ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
$ helmfile sync Adding repo stable 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: 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 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: <base64 encoded cert> tls.key: <base64 encoded 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 |