Деплой чат-додатку на Kubernetes за допомогою Kind, Metallb та Ingress

pic

Цей посібник надає покрокові інструкції для розгортання повнофункціонального чат-застосунку на Kubernetes за допомогою Kind, Metallb та Ingress. Він розроблений для допомоги розробникам у налаштуванні надійного Kubernetes-кластера для хостингу контейнеризованих застосунків на віртуальному приватному сервері (VPS).

Розгортання включає налаштування необхідних інструментів Kubernetes, конфігурацію балансувальника навантаження, інтеграцію SSL для забезпечення безпечної комунікації та розгортання як фронтенд, так і бекенд-сервісів. Додатково є розділи, які охоплюють моніторинг застосунку за допомогою Prometheus і Grafana для покращеної спостережуваності та відстеження продуктивності.

Незалежно від того, чи розгортаєте ви чат-застосунок для виробничого середовища, чи вивчаєте можливості Kubernetes, цей посібник стане всебічною картою, яка допоможе ефективно розгорнути ваш застосунок.

🚀 Початок роботи з k8s

pic

Індекс завдань

📢 Попередні вимоги для реалізації цього проєкту:

[!Примітка]
мінімальні вимоги до VPS

  • Оперативна пам'ять — 4GB
  • Процесор — 2 ядра
  • Місце на диску — 20 GB
  • Один домен

🐳 Встановлення та налаштування Docker

sudo apt-get update  

sudo apt-get install docker.io -y  
sudo usermod -aG docker $USER && newgrp docker

📦 Встановлення та налаштування Kind і kubectl

Встановіть KIND і kubectl за допомогою наданого скрипта. Створіть файл kindkubectlconfig.yaml:

#!/bin/bash  

# Для AMD64 / x86_64  
[$(uname -m) = x86_64] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.26.0/kind-linux-amd64  
chmod +x ./kind  
sudo cp ./kind /usr/local/bin/kind  

VERSION="v1.31.0"  
URL="https://dl.k8s.io/release/${VERSION}/bin/linux/amd64/kubectl"  
INSTALL_DIR="/usr/local/bin"  

curl -LO "$URL"  
chmod +x kubectl  
sudo mv kubectl $INSTALL_DIR/  
kubectl version --client  

rm -f kubectl  
rm -rf kind  

echo "Встановлення kind і kubectl завершено."
./kind_kubectl_config.yaml

[!Примітка]

Якщо ваш VPS має архітектуру ARM64, використовуйте цей скрипт:

[$(uname -m) = x86_64] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.26.0/kind-linux-amd64

Запустіть цей скрипт, і він налаштує середовище kubectl і kind.

Документація по встановленню Kind

🛠️ Налаштування KIND кластера

Створіть файл kind-cluster-config.yaml:

kind: Cluster  
apiVersion: kind.x-k8s.io/v1alpha4  

nodes:  
- role: control-plane  
 image: kindest/node:v1.31.2  
- role: worker  
 image: kindest/node:v1.31.2  
- role: worker  
 image: kindest/node:v1.31.2  
 extraPortMappings:  
 - containerPort: 80  
 hostPort: 80  
 protocol: TCP  
 - containerPort: 443  
 hostPort: 443  
 protocol: TCP

Створіть кластер, використовуючи конфігураційний файл:

kind create cluster --config kind-cluster-config.yaml --name my-kind-cluster

Перевірте кластер:

kubectl get nodes  
kubectl cluster-info

[!Примітка]

Тут я додаю extraPortMappings для запуску Ingress.

pic

🍏 Встановлення Metallb

[!Примітка]

Я використовую Metallb для налаштування LoadBalancer. Якщо ви використовуєте AWS/Azure/DigitalOcean або інші сервіси, які надають можливість використання Kubernetes LoadBalancer, то Metallb не потрібен. Я ж придбав VPS у місцевої компанії, яка надає одну IP-адресу для доступу до VPS.

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.9/config/manifests/metallb-frr.yaml

Перевірте конфігурацію Metallb:

kubectl get all -n metallb-system

pic

[!Примітка]

Тут service/ingress-nginx-controller показує EXTERNAL-IP, який є вашою VPS IP-адресою. Моя VPS IP-адреса — 160.191.163.33.
Це гарантує, що наш Metallb LoadBalancer працює.

🧊 Встановлення та налаштування Helm

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:

helm version

pic

🔒🌐 Встановлення та налаштування Cert Manager || SSL сертифікат

helm repo add jetstack https://charts.jetstack.io --force-update  
helm repo update

Встановлення cert-manager CRDs:

helm install cert-manager --namespace cert-manager --version v1.16.2 jetstack/cert-manager

Примітка: Детальніше про cert-manager
https://artifacthub.io/packages/helm/cert-manager/cert-manager

pic

📚 Розгортання проєкту та інші налаштування

Крок 1

Клонуйте наступний проєкт на вашому VPS:

git clone https://github.com/kamruzzamanripon/k8-node-react-mongodb-app.git

Крок 2

Перейдіть у папку k8s, і ви побачите цей файл:

pic

Крок 3

Створіть Namespace:

kubectl apply -f namespace.yaml

Крок 4

Застосуйте всі секретні файли:

kubectl apply -f backend-secret.yaml  
kubectl apply -f jwt-secret.yaml  
kubectl apply -f mongodb-secret.yaml

Крок 5

Оголосіть MongoDB Volumes та інші налаштування:

kubectl apply -f mongo-pv.yaml  
kubectl apply -f mongo-pvc.yaml  
kubectl apply -f mongodb-deployment.yaml  
kubectl apply -f mongodb-service.yaml

Крок 6

Застосуйте решту файлів:

kubectl apply -f backend-deployment.yaml  
kubectl apply -f backend-service.yaml  
kubectl apply -f frontend-deployment.yaml  
kubectl apply -f frontend-service.yaml

Крок 7

Налаштуйте SSL сертифікат для домену. Відкрийте файл ssl_certificate.yaml та редагуйте бажану доменну назву:

pic

Застосуйте файл ssl_certificate.yaml:

kubectl apply -f ssl_certificate.yaml

Крок 8

Налаштуйте Ingress файл. Відкрийте ingress.yaml та додайте бажану доменну назву.

pic

Застосуйте файл ingress.yaml:

kubectl apply -f ingress.yaml

Перевірка сертифікату

pic

Перевірка Namespace

kubectl get all -n chat-app

pic

🌐 Перегляд у браузері

pic

pic

🎉 Висновок

Вітаємо! Ви успішно розгорнули Full-Stack чат-застосунок. Тепер ви можете отримати доступ до вашого чат-застосунку.

💻 Моніторинг та інші функції [За бажанням]

Тепер ми додаємо додаткові функції, такі як моніторинг. Це допоможе вам дізнатися більше про сервери та застосунки.

Створіть Namespace

kubectl create namespace monitoring

pic

[!Примітка]
Цей Namespace допоможе вам контролювати всі додатки моніторингу, такі як Prometheus, Grafana, Loki тощо.

Встановлення та налаштування Prometheus і Grafana

Встановлення:

helm install prometheus-stack prometheus-community/kube-prometheus-stack --namespace monitoring --set prometheus.service.nodePort=30000 --set grafana.service.nodePort=31000 --set grafana.service.type=NodePort --set prometheus.service.type=NodePort

Запуск Prometheus через порт

kubectl port-forward svc/prometheus-stack-kube-prom-prometheus 9090:9090 -n monitoring --address=0.0.0.0 &

Тепер ви можете отримати доступ до Prometheus через цей порт.
Як

http://160.191.163.33:9090

[!Примітка]
Змініть IP-адресу

pic

Встановлення та налаштування Grafana

Запуск Grafana через порт:

kubectl port-forward svc/prometheus-stack-grafana 3000:80 -n monitoring --address=0.0.0.0 &

Отримання імені користувача та пароля для Grafana

Ім’я користувача:

admin

Пароль:

kubectl get secret prometheus-stack-grafana -n monitoring -o jsonpath="{.data.admin-password}" | base64 --decode

pic

[!Примітка]
Ви можете змінити пароль

pic

Панель інструментів Grafana.

Тут ви можете вибрати різні типи панелей для алгоритмів

pic

Ось і все. Бажаю успіхів у навчанні 🙂 .
[Якщо це було корисно, поставте зірку репозиторію 😇]

Посилання на GitHub проєкту
https://github.com/kamruzzamanripon/k8-node-react-mongodb-app

Перекладено з: Chat App Deploy on Kubernetes Using Kind, Metallb & Ingress

Leave a Reply

Your email address will not be published. Required fields are marked *