Thursday, November 21, 2024

[Kubernetes] Deploy Prometheus trên cụm Kubernetes sử dụng Kustomize

-

Trong bài này này, mình sẽ hướng dẫn bạn cách sử dụng Kustomize với Argo CD để triển khai ứng dụng từ kho lưu trữ Github.

Đầu tiên bạn hãy tạo 1 kho chứa như hình dưới. Chúng ta sẽ làm việc với thư mục kustomize-prometheus và file application-prometheus.yaml nên các bạn đừng quan tâm đến thư mục và file khác nhé.

Trong thư mục kustomize-prometheus chúng ta có các file với tên như dưới. Ở thư mục này các bạn đừng quan tâm đến file prometheus.sh nhé vì nó chỉ là file note của mình.

Dưới đây là nội dung chi tiết các file.

cat > ./kustomization.yaml << OEF
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namePrefix: kustomize-

resources:
- prometheus-deployment.yaml
- prometheus-svc.yaml
- prometheus-ingress.yaml
OEF

Chỗ namePrefix với kustomize- sẽ là tên của file tính từ dấu gạch ngang trở về trước, ví dụ kustomize- sẽ map với kustomize-<tên phía sau dấu gạch ngang>

Chỗ resources sẽ là danh sách các file name được Kustomize thực thi.

cat > ./prometheus-deployment.yaml << OEF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus
spec:
  selector:
    matchLabels:
      run: prometheus
  replicas: 5
  template:
    metadata:
      labels:
        run: prometheus
    spec:
      containers:
        - name: prometheus
          image: prom/prometheus
          ports:
            - containerPort: 9090
OEF

Chúng ta sẽ triển khai ứng dụng Prometheus.

cat > ./prometheus-ingress.yaml << OEF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: prometheus
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
    - host: prometheus.hoanghd.fun
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: prometheus
                port:
                  number: 80
OEF

Sử dụng ingress với domain là prometheus.hoanghd.fun

cat > ./prometheus-svc.yaml << OEF
apiVersion: v1
kind: Service
metadata:
  name: prometheus
  labels:
    run: prometheus
spec:
  ports:
    - name: prometheus
      port: 80
      targetPort: 9090
  type: LoadBalancer
  selector:
    run: prometheus
OEF

Service sử dụng type LoadBalancer (tùy bạn nhé), map port 80.

cat > ./application-prometheus.yaml << OEF
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: prometheus-application
  namespace: argocd

spec:
  project: default

  source:
    repoURL: https://github.com/hoanghd164/argocd.git
    targetRevision: HEAD
    path: kustomize-prometheus
  destination:
    server: https://kubernetes.default.svc
    namespace: monitor
    
  syncPolicy:
    syncOptions:
    - CreateNamespace=true
    automated:
      selfHeal: true
      prune: true
OEF
  • Metadata Namespace phải là argocd
  • Source repoURL: là kho lưu trữ file manifest
  • Source Path: là thư mục chứa manifest
  • Source targetRevision: HEAD là thư mục gốc của Source Path
  • Destination Server: là cụm k8s, nơi mà mình cần triển khai ứng dụng lên đó
  • Destination namespace: là namespace ứng dụng

Sau khi tạo xong file application-prometheus.yaml, chúng ta bắt đầu triển khai ứng dụng bằng command dưới.

kubectl apply -f ./application-prometheus.yaml

Triển khai xong, verify lại các thành phần của ứng dụng.

Hình ảnh cho ta thấy ứng ựng đã được triển khai xong, nhưng vẫn còn tiến trình progressing. Lý do là trong type của service mình đang để LoadBalancer nhưng service chưa được cấp ip address. Ta thấy chỗ external-ip đang pending.

root@loadbalancer3:~# kubectl get svc -n monitor
NAME                   TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kustomize-prometheus   LoadBalancer   10.97.220.73   pending       80:30557/TCP   8m21s

Note: Do mình đang sử dụng ingress nên tiến trình progressing trên không ảnh hưởng gì đến ứng dụng nhé hoặc chúng ta có thể fix theo cách dưới đây.

Tạo ta 1 file cm.yaml như dưới, với 192.168.13.230/28 là dải là ip sẽ được cấp cho dịch vụ.

cat >  ./cm.yaml << OEF
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: production
  namespace: metallb-system
spec:
  addresses:
  - 192.168.13.230/28
OEF

Chúng ta triển khai nó

kubectl apply -f ./cm.yaml

Xác minh lại config map đã được áp dụng thành công.

root@loadbalancer3:~# kubectl get svc -n monitor
NAME                   TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)        AGE
kustomize-prometheus   LoadBalancer   10.97.220.73   192.168.13.224   80:30557/TCP   23m

Như vậy đã có 1 ip address đã được cấp cho service này.

Trạng thái progressing không còn nữa, quá trình deploy app thành công.

Truy cập theo domain đã khai báo ở trên ta có kết quả như hình trên.

kubectl delete -f ./application-prometheus.yaml

Để xóa app chúng ta có thể xóa namespace để nó tự động xóa hết các thành phần liên quan đến app nhé.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories