#14 DevOps. Kubernetes. Helm. Deploy в Kubeapps

Представьте, что вам нужно собрать игрушку из конструктора. У вас есть много деталей, инструкция, но задача от этого не становится легче.

Helm — это набор готовых блоков для нашего конструктора и инструкция к ним.

Вместо того, чтобы собирать приложение из отдельных частей (сервисов, конфигураций и зависимостей) вручную, мы используем Helm, который:

  • упаковывает приложение в чарты (все нужные компоненты приложения собраны вместе, как детали конструктора в одной коробке)
  • облегчает установку и настройку приложения (просто берем готовый чарт и разворачиваем его в Kubernetes, аналогично сборке конструктора по инструкции)
  • управляет версиями приложения (helm позволяет легко откатываться к предыдущим версиям приложения, как будто ты разбираешь конструктор до определенного этапа и собираешь заново)

Таким образом, Helm упрощает развертывание и управление приложениями в Kubernetes.

Рассмотрим на практике

Развернем веб-сервер nginx с помощью Helm.

Установим сам Helm — https://helm.sh/docs/intro/install/

curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3

chmod 700 get_helm.sh

./get_helm.sh

helm version

Установим nginx

helm repo add bitnami https://charts.bitnami.com/bitnami

helm install my-nginx bitnami/nginx --version 18.0.1

kubectl get pods

Проверим

kubectl port-forward service/my-nginx 8888:80 --address 0.0.0.0

Перейдем по ip адресу нашей локальной машины на порт 8888 и увидим стартовую страницу nginx

Удалим

helm uninstall my-nginx

Рассмотрим другой пример

kubectl create namespace kubeapps

helm install kubeapps --namespace kubeapps bitnami/kubeapps

kubectl get pods -n kubeapps -w // наблюдаем

Для доступа к Kubeapps выполним

kubectl create --namespace default serviceaccount kubeapps-operator

kubectl create clusterrolebinding kubeapps-operator --clusterrole=cluster-admin --serviceaccount=default:kubeapps-operator

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: kubeapps-operator-token
  namespace: default
  annotations:
    kubernetes.io/service-account.name: kubeapps-operator
type: kubernetes.io/service-account-token
EOF

Узнаем токен

kubectl get --namespace default secret kubeapps-operator-token -o go-template='{{.data.token | base64decode}}'

Проверим

kubectl port-forward -n kubeapps svc/kubeapps 8080:80 --address 0.0.0.0

В браузере переходим на 192.168.2.170:8080 (у вас будет свой адрес) и вводим токен. Нажимаем Submit

Давайте задеплоим Grafana с помощью веб-интерфейса

В правом верхнем углу нажимаем DEPLOY -> вверху в search packages ищем Grafana -> нажимаем на нее -> задаем имя grafana, в Package Version выбираем самую свежую и внизу нажимаем DEPLOY -> ждем

Проверим

kubectl port-forward svc/grafana 5555:3000 --address 0.0.0.0

Заходим 192.168.2.170:5555 (у вас свой адрес)

Логинимся admin пароль смотрим в веб-интерфейсе Kubeapps в разделе grafana -> Application Secrets

Проверим работу Grafana

sudo wget https://github.com/prometheus/prometheus/releases/download/v2.45.3/prometheus-2.45.3.linux-amd64.tar.gz
sudo tar -xzf prometheus*.tar.gz

sudo rm prometheus*.tar.gz

cd prometheus*/

sudo groupadd --system prometheus

sudo useradd -s /sbin/nologin --system -g prometheus prometheus

sudo mv prometheus /usr/local/bin

sudo mv promtool /usr/local/bin

sudo chown prometheus:prometheus /usr/local/bin/prometheus

sudo chown prometheus:prometheus /usr/local/bin/promtool

sudo mkdir /etc/prometheus

sudo mkdir /var/lib/prometheus

sudo mv consoles /etc/prometheus

sudo mv console_libraries /etc/prometheus

sudo mv prometheus.yml /etc/prometheus

sudo chown prometheus:prometheus /etc/prometheus
sudo chown -R prometheus:prometheus /etc/prometheus/consoles
sudo chown -R prometheus:prometheus /etc/prometheus/console_libraries
sudo chown -R prometheus:prometheus /var/lib/prometheus


sudo nano /etc/systemd/system/prometheus.service

[Unit]
Description=Background service of Prometheus
Wants=network-online.target
After=network-online.target

[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
	--config.file /etc/prometheus/prometheus.yml \
	--storage.tsdb.path /var/lib/prometheus/ \
	--web.console.templates=/etc/prometheus/consoles \
	--web.console.libraries=/etc/prometheus/console_libraries

[Install]
WantedBy=multi-user.target


sudo systemctl daemon-reload

sudo systemctl enable prometheus

sudo systemctl start prometheus

sudo systemctl status prometheus

sudo ufw allow 9090/tcp

Проверим

Пройдем по адресу http://192.168.2.170:9090 (у вас будет свой)

Теперь в Grafana выберем Connections -> Add new connection -> Prometheus -> Add new data source -> Зададим имя, например KuberServer -> В Connection пропишем http://192.168.2.170:9090 -> Внизу нажимаем Save & test

Далее выбираем Dashboard -> New -> New dashboard -> Import a dashboard -> Вводим ID 3662 и нажимаем Load.

Внизу выбираем источник Prometheus — наш называется KuberServer и жмем Import.

Видим наш Dashboard

Настройка мониторинга сервера делается намного глубже, но в качестве простого примера данный вариант подойдет.