Рубрики
Uncategorized

Как развернуть приложение на Kubernetes с рулем

Изображение обложки Эндрю Нила на Unsplash В этом сообщении я представлю пошаговый, как развернуть Mult … Помечено Kubernetes, Helm, Beginters, DevOps.

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 Анкет

Но непосредственно перед этим, скучные инсталляции и конфигурации (но обещайте, это пойдет быстро). В моей демонстрации я использую:

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

Рекомендации

Kubernetes & Tools (4 серии деталей)

Оригинал: «https://dev.to/wkrzywiec/how-to-deploy-application-on-kubernetes-with-helm-8p»