VK Cloud

Запуск приложения в кластере через Containerum

21 января 2019 г.
_blog_head_42.png

Многие менеджеры, которым нужно управлять проектами в кластере 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
    <a href="https://kubernetes.io/docs/tasks/tools/install-kubectl/\" target="_blank" rel="nofollow noopener noreferrer">(Как поставить kubectl на другие ОС).

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

  • Его можно скопировать с удаленного сервера мастер ноды ~/.kube/config и поместить локально в ту же папку.
  • Если же используете решения для автоматизированного развёртывания кластеров Kubernetes (например, контейнеры VK в облаке), большинство таких решений даёт скачать готовый конфигурационный файл из панели администратора.
3. Ставим Helm на локальную машину, с которой будет происходить управление кластером Kubernetes. На MacOS это можно сделать с помощью brew:
brew install kubernetes-helm
  1. Создадим service account и дадим ему разрешение на работу с Kubernetes в рамках всего кластера:

    kubectl create serviceaccount --namespace kube-system tiller
    helm init --service-account tiller
    kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller

  2. Установим NGINX Ingress-Controller из официального репозитория kubernetes:

Создадим сервис, в котором укажем внешний 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

  1. Для запуска Containerum выполним три команды:
    helm repo add containerum https://charts.containerum.io
    helm repo update
    helm 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-namespaces
watch 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

  1. 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

  1. Чтобы открыть Web UI в браузере, добавляем этот IP-адрес в /etc/hosts:

    sudo nano /etc/hosts 79.137.175.205 local.containerum.io api.local.containerum.io

  2. Заходим по адресу в браузере 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/

  1. При создании 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 можно <a href="/containers/">быстро развернуть в облаке. Он настроен сразу после установки, и его можно свернуть сразу, как только он перестанет быть нужным. При первом подключении вы получаете бонус, которого хватает, чтобы, к примеру, поднять Dev-среду в минимальной конфигурации на неделю и позапускать там небольшие приложения или поучиться работать с Kubernetes.


Запомнить

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

Узнавайте о выходе новых статей в блоге первыми!

Будем держать в курсе новостей и облачных трендов

section-subscribe_2x.png
    section-subscribe_2x.png
    Теги: Разработка
    Ссылка скопирована
    Поделиться

    Почитать по теме

    _blog_head_158.png
    24 июля

    External Secrets Operator в Managed Kubernetes: безопасное управление секретами без ручной работы

    _blog_head_100.png
    24 июля

    S3-CSI в Managed Kubernetes: масштабирование приложений без потери общих файлов

    40+ готовых сервисов