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

Многие менеджеры, которым нужно управлять проектами в кластере 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 и отлично с ним интегрируется.
-
Ставим kubectl на локальную машину, с которой мы будем управлять кластером Kubernetes. На MacOS это можно сделать с помощью brew:
<a href="https://kubernetes.io/docs/tasks/tools/install-kubectl/\" target="_blank" rel="nofollow noopener noreferrer">(Как поставить kubectl на другие ОС).brew install kubernetes-cli -
Для управления кластером Kubernetes с локальной машины нам потребуется конфигурационный файл:
- Его можно скопировать с удаленного сервера мастер ноды ~/.kube/config и поместить локально в ту же папку.
- Если же используете решения для автоматизированного развёртывания кластеров Kubernetes (например, контейнеры VK в облаке), большинство таких решений даёт скачать готовый конфигурационный файл из панели администратора.
brew install kubernetes-helm-
Создадим 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 -
Установим 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- Для запуска 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
# версия чарта# название чартаЖдём 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- Containerum запускает деплои только на нодах, которые имеют label slave. Поэтому выполним следующую команду:
Где kubernetes-cluster-containerum-minion-0 — имя worker-узла. Таким образом мы помечаем все ноды, на которых хотим запускать поды через Containerum UI.
kubectl label node kubernetes-cluster-containerum-minion-0 role=slave
Узнаём внешний 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-
Чтобы открыть Web UI в браузере, добавляем этот IP-адрес в /etc/hosts:
sudo nano /etc/hosts 79.137.175.205 local.containerum.io api.local.containerum.io -
Заходим по адресу в браузере 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/
- При создании 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) поможет начинающим пользователям управлять кластером и приложениями, а менеджерам — иметь полную картину работы кластера.Узнавайте о выходе новых статей в блоге первыми!
Будем держать в курсе новостей и облачных трендов


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


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

