I.Triển khai Cụm Grafana – Prometheous Stack bằng Helm Chart
- Tổng quan.
- Chúng ta sẽ sử dụng kube-prometheus-stack chart từ repository prometheus-community. Đây là một chart rất phổ biến, bao gồm:
- Prometheus: Để thu thập và lưu trữ metrics.
- Grafana: Để trực quan hóa dữ liệu và tạo dashboard.
- Alertmanager: Để xử lý các cảnh báo.
- Các Exporters khác để thu thập metrics hệ thống.
- Để đảm bảo dữ liệu không bị mất khi Pod khởi động lại, chúng ta sẽ lưu trữ chúng trên một ổ đĩa mạng NFS.
- Chuẩn bị Storage trên NFS Server
2.1 Tạo thư mục và cấp quyền.# Tạo thư mục cha
Thêm thư mục vừa tạo vào file cấu hình /etc/exports để cho phép các client trong mạng truy cập.
sudo mkdir -p /export/k8s
# Gán quyền sở hữu cho user/group mà NFS thường sử dụng
sudo chown -R nobody:nogroup /export/k8s
# Cấp toàn quyền đọc/ghi/thực thi
sudo chmod 0777 /export/k8s
2.2 Cấu hình và chia sẽ thư mụcecho '/export/k8s *(rw,sync,no_subtree_check,no_root_squash)' | sudo tee -a /etc/exports
2.3 Áp dụng cấu hình
Áp dụng các thay đổi vừa rồi mà không cần khởi động lại hoàn toàn máy chủ.# Cập nhật lại danh sách các thư mục được
2.4 Kiểm tra từ các Node
export sudo exportfs -ra
# Khởi động lại dịch vụ NFS để chắc chắn mọi thứ được áp dụng
sudo systemctl restart nfs-server# Cài đặt gói công cụ NFS client
sudo apt-get update && sudo apt-get install -y nfs-common
# Thử mount, kiểm tra và unmount
# Thay <IP_NFS_Server> bằng địa chỉ IP thực tế của máy chủ NFS
sudo mount -t nfs4 192.168.9.29:/export/k8s /mnt && ls /mnt && sudo umount /mnt

- Cài đặt Dynamic Provisioner trên node master (k8s-master-1):
Kubernetes cần một “provisioner” để có thể tự động tạo PersistentVolume (PV) trên NFS server mỗi khi có yêu cầu PersistentVolumeClaim (PVC). Chúng ta sẽ cài đặt nó bằng Helm.
# Thêm repository chứa charthelm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
# Update Helmhelm repo update
# Cài vào kube-system, đặt tên storageClass là nfs-storagehelm upgrade --install nfs-provisioner \
nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
-n hoatranlocal-storage \
--create-namespace \
--set nfs.server=192.168.9.29 \
--set nfs.path=/export/k8s \
--set storageClass.name=hoatranlocal-nfs-monitoring-storage \
--set storageClass.defaultClass=false
# Kiểm tra trạng tháikubectl -n hoatranlocal-storage get pods -l app=nfs-subdir-external-provisioner
kubectl get sc - Dynamic Provisioner
4.1 Dynamic provisioning: Có một Provisioner (controller) chạy trong cluster. Khi PVC được tạo, provisioner sẽ tự động tạo PV mới khớp với yêu cầu (size, StorageClass, accessMode). → App tự xin storage là có, không cần admin làm thủ công.
4.2 Không có Dynamic provisioner thì sao:
PVC sẽ pednding mãi đến khi được tạo –> phải thao tác thủ công.
4.3 Nếu có Dynamic provisioner thì tạo 1 storageClass duy nhất, các app chỉ cần khai báo size hiêu, mode như thế nào. Phần còn lại sẽ do Dynamic Provisioner xử lý, khi xóa PVC thì chúng sẽ tự xóa theo. - Ưu điểm khi setup Dynamic Provisioner
Nhanh: Không phải viết PV thủ công.
Scale: Deploy thêm app nào cũng có storage.
An toàn: Dữ liệu tách riêng theo PVC/PV → không “dẫm chân” nhau.
Quản lý dễ: Chỉ cần theo dõi PVC/PV, không lo mapping thủ công - Vì sao cần sử dụng Prometheus
Prometheus (và Grafana, Alertmanager) là stateful app:
– Prometheus lưu time-series data vài GB đến hàng trăm GB.
– Nếu không có PVC, Prometheus chỉ chạy được trong memory (ephemeral storage), – khi pod bị xóa là mất hết data. - Cài kube-prometheus-stack ở hoatranlocal -monitoring trên node master (triển khai trên Node Master)
Thực hiện bằng lệnh (CMD)
7.1: Tạo Namspace#Tạo Namespace
kubectl create ns hoatranlocal-monitoring
#Add repo prometheus vào helm chart.
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
#Cập nhật repo helm chart.
helm repo update
7.2: Cấu hình file value-prom.yaml.#Tạo folder prometheus.
mkdir -p ~/helm-configs/prometheus
cd ~/helm-configs/prometheus
vim values-prom.yaml
#Tạo file values-prom.yaml
prometheus:
prometheusSpec:
storageSpec:
volumeClaimTemplate:
spec:
storageClassName: hoatranlocal-nfs-monitoring-storage
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
alertmanager:
alertmanagerSpec:
storage:
volumeClaimTemplate:
spec:
storageClassName: hoatranlocal-nfs-monitoring-storage
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 2Gi
grafana:
persistence:
enabled: true
storageClassName: hoatranlocal-nfs-monitoring-storage
accessModes: ["ReadWriteOnce"]
size: 5Gi
service:
type: NodePort # Hoặc Ingress sau này
7.3: Cài đặt prometheus.
#Chạy khối lệnh bên dưới.helm upgrade --install hoatranlocal-helm prometheus-community/kube-prometheus-stack \
-n hoatranlocal-monitoring \
-f values-prom.yaml
7.4. Truy cập kiểm tra kết quả:
Vào rancher –>tìm port tương ứng và truy cập.

II.Triển khai Uptime Kuma bằng Helm Chart
Lưu ý bài viết này thực hiện tháng 09/2025
- Trong muôn vàn công cụ monitor thì mình sẽ giới thiệu đến công cụ Kuma Monitor thông qua giao thức HTTP, HTTPS, TCP…
- Nó hỗ trợ rất nhiều app để push notification.
- Tích hợp dễ dàng vào Grafana.
1.Triển Khai
1.1 Tạo thư mục dữ liệu Kuma trong NFS server
sudo mkdir -p /export/uptime-kuma
sudo chown -R nobody:nogroup /export/uptime-kuma
sudo chmod 0777 /export/uptime-kuma
Mục đích: Tạo ra một thư mục riêng biệt để chứa toàn bộ dữ liệu của Uptime Kuma. Việc đặt nó trong /export là một quy ước phổ biến cho các thư mục chia sẻ qua NFS.

1.2 Thêm vào /etc/exports và apply config
sudo echo '/export/uptime-kuma * \(rw,sync,no_subtree_check,no_root_squash)' | sudo tee -a /etc/exports

1.3 Kết nối các K8s tới NFS
Áp dụng tất cả các client trong cụm
# Cài đặt nfs client
sudo apt-get update && sudo apt-get install -y nfs-common
# Kết nối nfs từ các node trong cụm K8S tới NFS server --> lưu ý phần IP thì sẽ thay thế bằng IP srv NFS của bạn
sudo mount -t nfs4 192.168.9.29:/export/uptime-kuma /mnt && ls /mnt && sudo umount /mnt

1.4 Tạo PV và PVC cho cụm
#Khai báo Storage Class trước
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-storage-kuma
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

# Tạo PV và PVC
Dùng rancher import file Yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-storage-kuma
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
apiVersion: v1
kind: PersistentVolume
metadata:
name: uptime-kuma-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
nfs:
path: /export/uptime-kuma
server: 192.168.9.29
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs-storage-kuma
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: hoatranlocal-uptime-kuma-pvc
namespace: hoatranlocal-monitoring
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: nfs-storage-kuma
Lưu ý khi tạo thì PVC sẽ có dang peding vì chưa bound dịch vụ nào (ở đây mình đã bound rồi vì mình làm xong rồi mới chụp hình lại.

1.5 Khởi tạo Uptime Kuma [ lưu ý thực hiện trên k8s master hoặc trên rancher shell]
Kiều kiện tiên quyết là phải cài helm trước, phần này đã hướng dẫn các bài trước, bạn vui lòng xem lại.
Cấu hình file values.yaml
Download template helm chart values.yaml tại và sửa lại thông số.
–> https://github.com/dirsigler/uptime-kuma-helm/blob/main/charts/uptime-kuma/values.yaml
Tại …/home/username/ tạo 1 file có dạng values.yaml và chép toàn bộ nội dụng đã tải và sửa vào.
# helm repo add uptime-kuma https://helm.irsigler.cloud
# helm repo update
# helm install hoatranlocal-uptime-kuma uptime-kuma/uptime-kuma -n hoatranlocal-monitoring -f values.yaml
2. Kiểm tra dịch vụ
2.1 Khởi tạo Uptime Kuma [ lưu ý thực hiện trên k8s master hoặc trên rancher shell]
Truy cập vào rancher của bạn –> tại Service Discovery –> Service à Kiểm tra đã có dịch vụ Kuma.

2.2 Tạo dịch vụ Ingresses trên Rancher
Tại Service Discovery –> Ingresses –> Create


2.3 Chỉnh sửa Host và truy cập Website
Chỉnh sửa host nội bộ để truy cập Website, địa chỉ Nigx-lb


HOÀN THÀNH
