介紹
Autoscaling 的目的是當有大量請求時,系統可以自動的增加運算資源,處理當下的大量請求;也可以根據當下資源使用率低時,自動降低運算資源,達到省錢的目的。這篇文章會說明在 Kubernetes 怎麼做 Autoscaling。
Kubernetes 內建 Autoscaling pipeline,可根據指標(CPU, Memory 使用率等等)的高低自動調整 Deployment.replicas 的數量,根據資源不足事件調整 Kubernetes Worker Node 的數量。大致上運作會牽涉到以下項目:
- 用 Metrics Server 取出指標,比如可以根據 CPU、Memory 的使用率調整。
- 用 HPA CRD 告知 Kubernetes 要根據什麼指標調整 Deployment.replicas 的數量。
- 用 CA CRD 告知 Kubernetes 當 Worker Node 資源不足時(Worker Node 沒有足夠的 CPU, Memory 可以運行 Pod),新增 Worker Node。
註 - 指標可以是 CPU, Memory 使用率,也可以是自己客製化的指標,比如請求延遲(Request Latency)、請求數量等等。
Metrics Server
第一件事情是安裝 Metrics Server,讓 Kubernetes 可以取到 CPU, Memory 使用率的指標。
安裝 metrics-server:
helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/
helm upgrade --install metrics-server metrics-server/metrics-server
當安裝成功後,可以用 kubectl top 檢視 Metrics Server 收集的指標:
❯ kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
gke-default-pool-4d64e7e1-o5h7 158m 16% 2029Mi 77%
❯ kubectl top pod
NAME CPU(cores) MEMORY(bytes)
haproxy-ic-kubernetes-ingress-7ddcc5db-kkjdl 5m 109Mi
haproxy-ic-kubernetes-ingress-default-backend-56844d87f8-gjfbz 0m 2Mi
haproxy-ic-kubernetes-ingress-default-backend-56844d87f8-r2vmm 0m 2Mi
註 - GKE 預設會安裝 Metrics Server。
註 - Metrics Server 不是設計給監控系統使用。
Reference:
Pod Resource Request
Pod 的規格(spec)必須要加上 spec.containers[].resources.requests.cpu, spec.containers[].resources.requests.memory,否則 HPA 無法正常運行。
apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- name: app
image: images.my-company.example/app:v4
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
Reference:
HorizontalPodAutoscaler(HPA)
HPA 可以根據 CPU, Memory 使用率調整 Deployment replicas 的數量。
以下是 HorizontalPodAutoscaler 的範例:
- scaleTargetRef - 對哪個 Deployment 調整 replicas 參數。
- minReplicas, maxReplicas - Pod 的數量範圍。
- metrics - 根據什麼指標做調整,這個範例是當全部 Pod 累計的 CPU 使用率超過 80% 時,增加 Pod 的數量。
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: my-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-deployment
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 80
以下是 VerticalPodAutoscaler 的範例:
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: my-app-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: my-app
updatePolicy:
updateMode: "Auto"
Reference:
Cluster Autoscaling(CA)
Cluster Autoscaling 是 Kubernetes Cluster 的設定,Kubernetes 會自動的調整 Worker Node 的數量,觸發的時機點是 Kubernetes Scheduler 安排 Pod 到 Worker Node 時發現「CPU or Memory 不足」,此時就會新增新的 Worker Node。
以 GKE 來說,相關的設定是 cluster_autoscaling 和 node_pools 的 autoscaling, min_count, max_count。
module "gke" {
source = "terraform-google-modules/kubernetes-engine/google"
version = "~>17.1.0"
...
cluster_autoscaling = {
enabled = true
min_cpu_cores = 1
max_cpu_cores = 20
min_memory_gb = 3
max_memory_gb = 20
gpu_resources = []
}
node_pools = [
{
...
autoscaling = true
min_count = 1
max_count = 10
},]
}