- vừa được xem lúc

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

0 0 34

Người đăng: Trịnh Quốc Việt

Theo Viblo Asia

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.png Tớ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

[_@.com ~]$ 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:

[_@.com ~]$ 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: 1 template: metadata: labels: run: php-apache spec: containers: - name: php-apache image: k8s.gcr.io/hpa-example ports: - containerPort: 80 resources: limits: cpu: 500m requests: cpu: 200m
---
apiVersion: v1
kind: Service
metadata: name: php-apache labels: run: php-apache
spec: ports: - port: 80 selector: run: php-apache

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

kubectl apply -f php-apache.yaml
[_@.com 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 1 1 2m56s NAME DESIRED CURRENT READY AGE
replicaset.apps/php-apache-d4cf67d68 1 1 1 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% 1 10 0 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% 1 10 1 4m24s
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 21%/50% 1 10 1 4m24s
php-apache Deployment/php-apache 250%/50% 1 10 1 4m36s
php-apache Deployment/php-apache 250%/50% 1 10 4 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% 1 10 1 4m24s
php-apache Deployment/php-apache 250%/50% 1 10 1 4m36s
php-apache Deployment/php-apache 250%/50% 1 10 4 4m52s
php-apache Deployment/php-apache 250%/50% 1 10 5 5m7s
php-apache Deployment/php-apache 69%/50% 1 10 5 5m53s
php-apache Deployment/php-apache 67%/50% 1 10 5 6m8s
php-apache Deployment/php-apache 59%/50% 1 10 7 6m39s
php-apache Deployment/php-apache 47%/50% 1 10 7 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é!

[_@.com hpa-example]$ kubectl get hpa php-apache --watch
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 21%/50% 1 10 1 4m24s
php-apache Deployment/php-apache 250%/50% 1 10 1 4m36s
php-apache Deployment/php-apache 250%/50% 1 10 4 4m52s
php-apache Deployment/php-apache 250%/50% 1 10 5 5m7s
php-apache Deployment/php-apache 69%/50% 1 10 5 5m53s
php-apache Deployment/php-apache 67%/50% 1 10 5 6m8s
php-apache Deployment/php-apache 46%/50% 1 10 7 9m27s
php-apache Deployment/php-apache 48%/50% 1 10 7 11m
php-apache Deployment/php-apache 93%/50% 1 10 10 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é:

[_@.com hpa-example]$ kubectl get hpa php-apache --watch
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 10 10 16m
php-apache Deployment/php-apache 0%/50% 1 10 10 18m
php-apache Deployment/php-apache 0%/50% 1 10 9 18m
php-apache Deployment/php-apache 0%/50% 1 10 1 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é!

Bình luận

Bài viết tương tự

- vừa được xem lúc

Performance Optimization 104: Trinh sát ứng dụng với monitoring

Con đường trở thành thám tử chuyên nghiệp của chàng developer. Nếu bạn yêu ứng dụng của mình thì chỉ có cách cần trô thật chặt, thật kinh khủng, thật mất tự do vào.

0 0 43

- vừa được xem lúc

Java Performance Tool Part 1: VisualVM

Giới thiệu VisualVM tool. VisualVm là 1 công cụ hữu ích giúp chúng ta quan sát thông tin của các ứng dụng JAVA chạy trên local hay trên các máy khác.

0 0 124

- vừa được xem lúc

Chỉ bạn 5 tips với Prometheus và Prometheus Exporters để cải thiện hiệu năng hệ thống.

Dự án Prometheus của Cloud Native Computing Foundation (CNCF) là một giải pháp giám sát và cảnh báo mã nguồn mở phổ biến, được tối ưu hóa cho các môi trường bộ chứa (container). Prometheus hiện nay đa

0 0 38

- vừa được xem lúc

[K8S] Phần 1 - Kubernetes là gì?

Lời tựa. Trong bài viết này mình sẽ giới thiệu ngắn gọn, không mang tính chất hàn lâm mà sẽ chủ yếu dựa vào các kiến thức và kinh nghiệm thực tế để bạn đọc tiết kiệm được thời gian và đi thẳng vào các

0 0 45

- vừa được xem lúc

[K8S] Phần 8 - Monitoring trên Kubernetes Cluster dùng Prometheus và Grafana

Lời tựa. Chào các bạn, hôm nay chúng ta sẽ đến với một topic khá hot khi làm việc với Kubernetes đó là Monitoring, cụ thể hơn là Prometheus và Grafana - Cái mà hầu như ai làm với K8S sẽ đều phải va ch

0 0 120

- vừa được xem lúc

Robusta nhưng không phải là coffee, Robusta này giúp bạn giám sát Kubernetes

Mở đầu. Môi trường Container ngày càng được sử dụng nhiều hơn và kéo theo đó là công cụ Kubernetes phục vụ cho việc quản lý các container cũng được sử dụng nhiều hơn.

0 0 16