[K8S] Phần 5 – Metrics Server cho K8S và demo HPA

Lời tựa Chào các bạn, lại là mình đây trên hành trình cài lab. Mục tiêu ngày hôm nay là cài đặt Metrics Server để theo dõi được tải của hệ thống. Metrics Server đóng vai trò quan trọng trong việc Scale hệ thống khi tải tăng lên theo thời gian. Các bạn khi tìm

Lời tựa

Chào các bạn, lại là mình đây trên hành trình cài lab. Mục tiêu ngày hôm nay là cài đặt Metrics Server để theo dõi được tải của hệ thống. Metrics Server đóng vai trò quan trọng trong việc Scale hệ thống khi tải tăng lên theo thời gian. Các bạn khi tìm hiểu về K8S sẽ nghe tới các khái niệm như HPA (Horizontal Pod Autoscaling) hay VPA (Vertial Pod Autoscaling).

Trong phần này mình sẽ chưa nói sâu về Auto Scaling, mà sẽ hướng dẫn cách cài đặt Metrics Server là điều kiện cần cho Auto Scaling. Ngoài ra sẽ chia sẻ cách cấu hình HPA để “thử” xem Auto Scale nó đầu cua tai nheo như thế nào. Có thời gian mình sẽ viết chi tiết hơn về Auto Scaling ở các phần tiếp theo.

Bài viết này nằm trong Series về Kubernetes Cluster các bạn có thể tham khảo full tại link: https://viblo.asia/s/chinh-phuc-kubernetes-tu-so-0-GJ59jLJaKX2

Giới thiệu

Trước khi bắt đầu mình xin nhắc lại về kiến trúc của hệ thống LAB mình đang cài đặt như sau:
image.pngTới phần 5 này thì mình đã hoàn thành được các nội dung sau:

  • Cài đặt Kubernetes Cluster trên 06 node (03 Master + 03 Worker)
  • Cài đặt NFS Server trên OS Service (chạy trên node vtq-cicd)
  • Cài đặt longhorn storage chạy trên K8S Cluster (trên 03 Worker Node)
  • Cài đặt nfs-storageclass và longhorn-storageclass sử dụng 2 storage đã cài bên trên

Cài đặt Metrics Server

Phần này thì cơ bản là đơn giản, khi cài đặt lần đầu có thể bạn sẽ gặp phải một số vấn nho nhỏ phát sinh mà nếu chưa có kinh nghiệm debug trên K8S thì có thể sẽ bị stuck luôn thì hơi chán.
Bản thân mình lần đầu cài cũng phải troubleshoot toát mồ hôi, nên giờ sẽ note cho các bạn tiết kiệm thời gian nhất, chạy phát là ăn ngay 😄

Cài đặt Metrics Server bằng helm-chart

Vẫn như mọi khi, mình sẽ đứng từ node vtq-cicd để bắt đầu cài đặt. Trước hết là tạo thư mục lưu file cài đặt:

cd /home/sysadmin/kubernetes_installation/
mkdir metric-server
cd metric-server

Thực hiện cài đặt Metrics Server:

helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/
helm search repo metrics-server
helm pull metrics-server/metrics-server --version 3.8.2
tar -xzf metrics-server-3.8.2.tgz
helm install metric-server metrics-server -n kube-system

Tới đây cần edit lại deployment của Metrics Server để fix lỗi liên quan tới kết nối. Bạn chạy lệnh sau:

kubectl -n kube-system edit deploy metric-server-metrics-server

Sau đó sửa các tham số dưới thẻ “args” cho giống như bên dưới:

spec:containers:-args:---secure-port=4443
        ---cert-dir=/tmp
        ---kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        ---kubelet-insecure-tls=true
        ---kubelet-use-node-status-port
        ---metric-resolution=15s
        image: k8s.gcr.io/metrics-server/metrics-server:v0.6.1
        imagePullPolicy: IfNotPresent

Lưu lại và chờ Pod được update lại. Các bạn có thể tham khảo thêm về issue này ở topic trên Github và StackOverFlow:

https://github.com/kubernetes-sigs/metrics-server/issues/278

https://stackoverflow.com/questions/68648198/metrics-service-in-kubernetes-not-working

[[email protected] ~]$ kubectl -n kube-system get pods |grep metric
metric-server-metrics-server-67d444b447-prm6l   1/1     Running   0          92m

Như trên là Metrics Server chạy được rồi, giờ kiểm tra tải của node xem sao:

[[email protected] ~]$ kubectl top nodes
NAME             CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
viettq-master1   237m         2%     2346Mi          32%
viettq-master2   195m         1%     2118Mi          29%
viettq-master3   138m         1%     2138Mi          29%
viettq-worker1   156m         1%     2403Mi          32%
viettq-worker2   148m         1%     2328Mi          31%
viettq-worker3   127m         1%     2165Mi          29%

Ngon rồi, với vài câu lệnh thì đã xong Metrics Server. Giờ tới phần hay hơn là ứng dụng nó để chạy thử HPA.

Cấu hình Autoscaling với HPA

Đầu tiên là cứ tạo thư mục để làm cái lab này đã:

cd /home/sysadmin/kubernetes_installation/
mkdir hpa-example
cd hpa-example

Ý tưởng của bài lab HPA này là bạn tạo ra một Deployment gồm 1 Pod chạy Apache và một service trỏ tới Pod đó. Sau đó bạn cấu hình HPA cho Deployment đó với điều kiện tải CPU của pod > 50% thì sẽ scale số pod lên, và khi tải giảm xuống thì số pod cũng dc giảm theo.

Bắt đầu thôi, bạn tạo file cho Deployment như sau:

php-apache.yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: php-apache
spec:selector:matchLabels:run: php-apache
  replicas:1template:metadata:labels:run: php-apache
    spec:containers:-name: php-apache
        image: k8s.gcr.io/hpa-example
        ports:-containerPort:80resources:limits:cpu: 500m
          requests:cpu: 200m
---apiVersion: v1
kind: Service
metadata:name: php-apache
  labels:run: php-apache
spec:ports:-port:80selector:run: php-apache

Sau đó thì apply file trên để tạo Deployment và Service:

kubectl apply -f php-apache.yaml
[[email protected] hpa-example]$ kubectl get all
NAME                             READY   STATUS    RESTARTS   AGE
pod/php-apache-d4cf67d68-gzxb6   1/1     Running   0          2m56s

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service/my-service   NodePort    10.233.13.185   <none>8080:31132/TCP   20h
service/php-apache   ClusterIP   10.233.12.122   <none>80/TCP           2m56s

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/php-apache   1/1     11           2m56s

NAME                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/php-apache-d4cf67d68   111       2m56s

Như vậy là các bạn có thể thấy đang có 1 Pod của php-apache đang chạy.
Giờ ta sẽ cấu hình HPA cho cái Deployment này, để khi các Pod của nó tăng tải thì sẽ được autoscale:

kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
kubectl get hpa
NAME         REFERENCE               TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   <unknown>/50%   1100          2s

Chuẩn bị đến chỗ hay rồi, giờ ta sẽ tăng tải cho thằng php-apache bằng cách chạy một Pod gọi liên tục tới php-apache. Bạn nên mở 2 cửa sổ terminal nhé, một cái để chạy pod để generate load, một cái để theo dõi trạng thái của Deployment để xem nó autoscale như thế nào.

kubectl run -i --tty load-generator --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"

Xong rồi ngồi theo dõi thôi, bạn dùng lệnh sau để xem phim nhé 😄

kubectl get hpa php-apache --watch

Nào xem phim có gì hay:

NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   21%/50%   1101          4m24s
NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   21%/50%   1101          4m24s
php-apache   Deployment/php-apache   250%/50%   1101          4m36s
php-apache   Deployment/php-apache   250%/50%   1104          4m52s

Tải vẫn đang tăng dần và hệ thống đã autoscale số pod lên 4 rồi. Do maxpods ta cấu hình là 10 nên chờ thêm khi đạt ngưỡng thì sao nhé:

NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   21%/50%   1101          4m24s
php-apache   Deployment/php-apache   250%/50%   1101          4m36s
php-apache   Deployment/php-apache   250%/50%   1104          4m52s
php-apache   Deployment/php-apache   250%/50%   1105          5m7s
php-apache   Deployment/php-apache   69%/50%    1105          5m53s
php-apache   Deployment/php-apache   67%/50%    1105          6m8s
php-apache   Deployment/php-apache   59%/50%    1107          6m39s
php-apache   Deployment/php-apache   47%/50%    1107          8m11s

Có thể để ý thấy tải tăng càng lúc càng chậm, đơn giản vì lúc đầu bạn chỉ có 1 pod, giờ có 7 pod thì tải sẽ chậm gấp 7 lần so với lúc đầu 😄 nên chờ thêm chút nhé!

[[email protected] hpa-example]$ kubectl get hpa php-apache --watch
NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   21%/50%   1101          4m24s
php-apache   Deployment/php-apache   250%/50%   1101          4m36s
php-apache   Deployment/php-apache   250%/50%   1104          4m52s
php-apache   Deployment/php-apache   250%/50%   1105          5m7s
php-apache   Deployment/php-apache   69%/50%    1105          5m53s
php-apache   Deployment/php-apache   67%/50%    1105          6m8s
php-apache   Deployment/php-apache   46%/50%    1107          9m27s
php-apache   Deployment/php-apache   48%/50%    1107          11m
php-apache   Deployment/php-apache   93%/50%    11010         11m

Rồi lên đỉnh rồi thì phải xuống thôi, giờ ta tắt cái Pod generate load đi để tải nó tụt xuống rồi xem hệ thống autoscale down số pod xuống như thế nào nhé:

[[email protected] hpa-example]$ kubectl get hpa php-apache --watch
NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   0%/50%    11010         16m
php-apache   Deployment/php-apache   0%/50%    11010         18m
php-apache   Deployment/php-apache   0%/50%    1109          18m
php-apache   Deployment/php-apache   0%/50%    1101          18m

Đó khi không còn cao tải nữa (CPU < 50%) thì hệ thống autoscale down số pod của Deployment xuống về đúng trạng thái ban đầu (1 pod).

Trên đây là một ví dụ đơn giản để các bạn hiểu về ý tưởng hoạt động của Autoscale. Ngoài đặt ngưỡng RAM/CPU bạn có thể customize theo rất nhiều điều kiện khác tùy vào nhu cầu thực tế.
Các bạn có thể tham khảo thêm về HPA trên trang của Kubernetes: https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/

Như vậy sau bài viết này bạn đã biết cách cài Metrics Server và cũng voọc qua cách sử dụng của HPA rồi. Trong bài tới mình sẽ hướng dẫn tiếp tới phần cài đặt cấu hình Load Balancing cho hệ thống gồm Nginx-Ingress, Haproxy và Keepalive.
Các bạn chú ý theo dõi nhé!

Nguồn: viblo.asia

Bài viết liên quan

WebP là gì? Hướng dẫn cách để chuyển hình ảnh jpg, png qua webp

WebP là gì? WebP là một định dạng ảnh hiện đại, được phát triển bởi Google

Điểm khác biệt giữa IPv4 và IPv6 là gì?

IPv4 và IPv6 là hai phiên bản của hệ thống địa chỉ Giao thức Internet (IP). IP l

Check nameservers của tên miền xem website trỏ đúng chưa

Tìm hiểu cách check nameservers của tên miền để xác định tên miền đó đang dùn

Mình đang dùng Google Domains để check tên miền hàng ngày

Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ