Многие менеджеры, которым нужно управлять проектами в кластере Kubernetes, не имеют навыка работы с консолью и другими инструментами, привычными для разработки. Поэтому kubectl и нативный дашборд для управления и мониторинга Kubernetes им не всегда удобен.

Containerum platform — open source-инструмент для работы с кластером Kubernetes, как раз для такого случая. С помощью него вы управляете проектами на Kubernetes через UI. Containerum помогает создавать и мониторить высоконагруженные системы, отражает полную картину разработки проекта, стадии, занятость людей в проектах. Ещё Containerum будет полезен тем, кто только осваивает инструментарий Kubernetes.

В этой статье мы покажем, как подключить Containerum platform к кластеру Kubernetes. Потом покажем его возможности на примере установки и мониторинга приложения (Rocket Chat).


Ставим Containerum platform — UI для Kubernetes

Containerum устанавливается с помощью пакетного менеджера для Kubernetes — Helm. Мы поставим Helm и интерфейс командной строки kubectl на локальную машину, с которой будет происходить управление кластером.

Ещё мы установим балансировщик Ingress-controller, чтобы не выделять под каждый домен отдельный IP.

Ingress controller — это балансировщик нагрузки, который работает по протоколам http/https и маршрутизирует http/https-запросы на основе доменного имени и пути. Это позволяет хостить на одном IP-адресе множество сайтов и приложений и экономить белые IP-адреса. Ingress controller является расширением Kubernetes и отлично с ним интегрируется.

Итак, пререквизит — у нас уже есть кластер Kubernetes. Теперь выполним следующие шаги:

1. Ставим kubectl на локальную машину, с которой мы будем управлять кластером Kubernetes. На MacOS это можно сделать с помощью brew:
brew install kubernetes-cli(Как поставить kubectl на другие ОС).

2. Для управления кластером Kubernetes с локальной машины нам потребуется конфигурационный файл:

  • Его можно скопировать с удаленного сервера мастер ноды ~/.kube/config и поместить локально в ту же папку.
  • Если же используете решения для автоматизированного развёртывания кластеров Kubernetes (например, контейнеры VK в облаке), большинство таких решений даёт скачать готовый конфигурационный файл из панели администратора.

3. Ставим Helm на локальную машину, с которой будет происходить управление кластером Kubernetes. На MacOS это можно сделать с помощью brew:
brew install kubernetes-helm

4. Создадим service account и дадим ему разрешение на работу с Kubernetes в рамках всего кластера:
kubectl create serviceaccount --namespace kube-system tillerhelm init --service-account tillerkubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller

5. Установим NGINX Ingress-Controller из официального репозитория kubernetes:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml

Создадим сервис, в котором укажем внешний IP-адрес машины. Создадим yaml-файл, например, ingress-svc.yaml:

apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
spec:
  ports:
  - name: http
    port: 80
    targetPort: 80
    protocol: TCP
  - name: https
    port: 443
    targetPort: 443
    protocol: TCP
  selector:
    app.kubernetes.io/name: ingress-nginx
  externalIPs:
  - %EXTERNAL IP%

Где %EXTERNAL IP% — внешний статический IP-адрес машины.

Запустим созданный сервис:
kubectl apply -f ingress-svc.yaml

6. Для запуска Containerum выполним три команды:
helm repo add containerum https://charts.containerum.iohelm repo updatehelm install --namespace containerum --set mongodb.image.setPermissions=true --set postgresql.persistence.enabled=true --set mongodb.persistence.enabled=true --set tags.monitoring=true --set user-manager.env.local.ADMIN_PASSWORD=your_super_secret_password --name=containerum --version 1.2.2 containerum/containerum

Поясним параметры, которые указали при запуске:

helm install —namespace containerum
`# задаёт неймспейс, где Containerum будет развёрнут`

—set mongodb.image.setPermissions=true
`# включает инит контейнер, который меняет права доступа на PV mongodb`

—set postgresql.persistence.enabled=true
`# включает использование PVC для PostgreSQL`

—set mongodb.persistence.enabled=true
`# включает использование PVC для MongoDB`

—set tags.monitoring=true
`# включает мониторинг через Prometheus`

—set user-manager.env.local.ADMIN_PASSWORD=your_super_secret_password
`# задаёт пароль для admin@local.containerum.io`

—name=containerum
`# название этой инсталляции Containerum`

—version 1.2.2
`# версия чарта` containerum/containerum `# название чарта`

Ждём 1-2 минуты, пока запустятся все поды. Чтобы отслеживать статус подов в реальном времени, используем команду:
watch kubectl get po --all-namespaceswatch kubectl get po --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
default rafting-moth-api-gateway-7566f4dcdc-pw4tt 1/1 Running 0 1m
default rafting-moth-auth-749f7798bc-krcck 1/1 Running 0 1m
default rafting-moth-kube-76fcfd7cd7-rqsxc 1/1 Running 0 1m
default rafting-moth-kube-importer-666dbb475d-7qxwt 1/1 Running 0 1m
default rafting-moth-mail-57b857667c-wghb7 1/1 Running 0 1m
default rafting-moth-mongodb-59cf9c6b5d-zxmzv 1/1 Running 0 1m
default rafting-moth-nodemetrics-67b5795679-ctvn4 1/1 Running 0 1m
default rafting-moth-permissions-797ff4d78d-zzpjg 1/1 Running 2 1m
default rafting-moth-postgresql-56d9b8755-g7755 1/1 Running 0 1m
default rafting-moth-prometheus-node-exporter-vrrkd 1/1 Running 0 1m
default rafting-moth-prometheus-server-d5d64f7d-w7cmg 2/2 Running 0 1m
default rafting-moth-resource-5985b7f66c-xm6jx 1/1 Running 2 1m
default rafting-moth-solutions-79bdcc4659-twrfm 1/1 Running 0 1m
default rafting-moth-ui-75df495c85-9dt44 1/1 Running 0 1m
default rafting-moth-user-manager-55c888fbcc-lgwkg 1/1 Running 0 1m
default rafting-moth-volume-84b98465cf-z9lfp 1/1 Running 0 1m
ingress-nginx nginx-ingress-controller-6d6bf49bf9-48wbn 1/1 Running 0 2m
kube-system calico-kube-controllers-79c97cf859-czr5l 1/1 Running 0 1h
kube-system calico-node-58xp2 2/2 Running 0 1h
kube-system calico-node-dsrcm 2/2 Running 0 1h
kube-system coredns-8c464859d-q6mvw 1/1 Running 0 1h
kube-system heapster-5c6d75b6c7-7ggqh 1/1 Running 0 1h
kube-system kubernetes-dashboard-586c8fd6f-xhjbl 1/1 Running 0 1h
kube-system monitoring-grafana-75c48d8548-bqxwb 1/1 Running 0 1h
kube-system monitoring-influxdb-5df959859f-rzds6 1/1 Running 0 1h
kube-system tiller-deploy-56c4cf647b-6zvg9 1/1 Running 0 4m

7. Containerum запускает деплои только на нодах, которые имеют label slave. Поэтому выполним следующую команду:
kubectl label node kubernetes-cluster-containerum-minion-0 role=slave
Где kubernetes-cluster-containerum-minion-0 — имя worker-узла. Таким образом мы помечаем все ноды, на которых хотим запускать поды через Containerum UI.

Узнаём внешний IP-адрес ingress-nginx:
kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx ClusterIP 10.254.10.193 79.137.175.205 80:30034/TCP,443:30428/TCP 3h

9. Чтобы открыть Web UI в браузере, добавляем этот IP-адрес в /etc/hosts:
sudo nano /etc/hosts 79.137.175.205 local.containerum.io api.local.containerum.io

10. Заходим по адресу в браузере local.containerum.io

Готово!

Дефолтные данные для входа:
login: admin@local.containerum.io
password: verystrongpassword

Теперь управлять кластером Kubernetes можно из UI Containerum. Мы готовы управлять приложениями. Посмотрим, как это работает.


Установка Rocket chat с помощью Containerum

Rocket Chat — веб-чат на JavaScript. Мы установим его в качестве примера, потому что любим чаты. С помощью Containerum мы установим сервер чата.

Добавляем внутренний IP-адрес

Containerum пробрасывает порты, используя сервис типа ExternalIP. Это означает, что Containerum нужно знать IP-адрес одной или нескольких машин, на которые приходит трафик извне. Поэтому на IP-адресе рабочей ноды кластера Kubernetes на странице http://local.containerum.io/settings#ips добавляем внутренний IP-адрес машины в раздел «Add IP», на которой будет запущено приложение.

Запускаем MongoDB

База данных будет запущена как деплоймент. Для простоты в нашем примере мы не будем привязывать к нему Persistent Volume, хотя это — хорошая практика, чтобы обеспечить надёжность приложения. О том, что такое Persistent Volume, Persistent volume Claim, зачем они и как с ними работать, мы расскажем в следующей статье. Итак:

Создаем проект:
NAME: rocket-chat
CPU: 2000 (mcpu)
RAM: 2048 (mb)

Заходим в созданный проект создаем deploy:
NAME: mongodb
REPLICAS: 1
CONTAINER NAME: mongodb
DOCKER IMAGE: mongo
CPU: 500 (mcpu)
RAM: 512 (mb)

При создании deploy создаем внутренний service:
SERVICE NAME: mongo-svc
PORT NAME: mongo-port
PORT: 27017
TARGET PORT: 27017

Deployment MongoDB запущен.

Запускаем Rocket Chat

1. Заходим в созданный проект, создаем deploy:
NAME: rocket-chat
REPLICAS: 1
CONTAINER NAME: rocket-chat
DOCKER IMAGE: rocket.chat
CPU: 1500 (mcpu)
RAM: 1500 (mb)

В environment указываем:
имя: MONGO_URL
значение: mongodb://mongo-svc:27017/

2. При создании deploy, создаем внешний service:
SERVICE NAME: rocketchat-svc
PORT NAME: rocket-port
TARGET PORT: 3000

Deployment Rocket Chat запущен:

Доступ к запущенному Rocket Chat открыт по внешнему адресу ноды, на которой запущено приложение, и порту, который можно найти во вкладке Services -> rocketchat-svc:

С помощью браузера открываем админку запущенного Rocket Chat по адресу http://ip:port. Чат установлен, теперь могут подключаться клиенты.

Обратите внимание, сервис Rocket Chat запущен с дефолтными данными для входа. В целях безопасности мы рекомендуем сразу же сменить их на надежные из панели управления Rocket Chat.

Кластер Kubernetes можно быстро развернуть в облаке. Он настроен сразу после установки, и его можно свернуть сразу, как только он перестанет быть нужным. При первом подключении вы получаете бонус, которого хватает, чтобы, к примеру, поднять Dev-среду в минимальной конфигурации на неделю и позапускать там небольшие приложения или поучиться работать с Kubernetes.


Запомнить

Чтобы было проще освоить развёртывание приложений в Kubernetes, можно подключить сервисы, которые помогут получить результат без сложных настроек. Использование UI вместо нативного CLI (kubectl) поможет начинающим пользователям управлять кластером и приложениями, а менеджерам — иметь полную картину работы кластера.