Kubernetes Autoscaling

2021/12/28閱讀時間約 9 分鐘

介紹

Autoscaling 的目的是當有大量請求時,系統可以自動的增加運算資源,處理當下的大量請求;也可以根據當下資源使用率低時,自動降低運算資源,達到省錢的目的。這篇文章會說明在 Kubernetes 怎麼做 Autoscaling。
Kubernetes 內建 Autoscaling pipeline,可根據指標(CPU, Memory 使用率等等)的高低自動調整 Deployment.replicas 的數量,根據資源不足事件調整 Kubernetes Worker Node 的數量。大致上運作會牽涉到以下項目:
  1. 用 Metrics Server 取出指標,比如可以根據 CPU、Memory 的使用率調整。
  2. 用 HPA CRD 告知 Kubernetes 要根據什麼指標調整 Deployment.replicas 的數量。
  3. 用 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 的範例:
  1. scaleTargetRef - 對哪個 Deployment 調整 replicas 參數。
  2. minReplicas, maxReplicas - Pod 的數量範圍。
  3. 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
  },]
}
為什麼會看到廣告
    專注於 C#, DevOps 的工程師
    留言0
    查看全部
    發表第一個留言支持創作者!
    從 Google News 追蹤更多 vocus 的最新精選內容