1 概述

HorizontalPodAutoscaler 是水平 Pod 自動擴縮器的配置,它根據指定的指標自動管理實現 scale 子資源的任何資源的副本數。

2 Deployment自動擴容

2.1 什麼是PHA

Kubernetes實現Pod的擴縮容需要通過手動來實現,但線上的業務情況比較複雜,依賴於純手動的方式不太現實。所以希望系統能自動感知Pod的壓力來完成擴縮容,比如:當Pod的CPU達到了50%則擴容,當Pod的CPU低於50%自動縮容。

為此Kubernetes提供了這樣的一個資源對象HPA(Horizontal-Pod-Autoscaler),專門用來實現Pod的水平自動擴縮容。PHA通過監控分析一些控制器控制的所有Pod的負載變化情況來確定是否需要調整Pod的副本數量。

HorizontalPodAutoscaler_Pod

2.2 自動擴縮容算法

算法:副本數 = [當前副本數 * (當前指標 / 期望指標)]

當前指標:當前Pod已經到到了百分之多少的壓力;

期望指標:當Pod達到期望的指標百分比時就要進行擴容;

例如,當前副本為1,當前指標值為250%,而期望的指標值為50%,則副本數會擴大5倍。

2.3 動態擴縮容實踐

1、創建deployment

cat deploy-hpa.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-hpa
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demoapp
  template:
    metadata:
      labels:
        app: demoapp
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        lifecycle:
          postStart:
            exec:
              command: ["sh", "-c", "echo demoapp v1.0!! NodeName: ${node_name} PodIP: ${pod_ip} > /usr/share/nginx/html/index.html"]
        env:
        - name: pod_ip
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        - name: node_name
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        resources:
          requests:
            cpu: 6m
          limits:
            cpu: 10m

2、創建負載均衡

apiVersion: v1
kind: Service
metadata:
  name: svc-hpa
spec:
  selector:
    app: demoapp
  ports:
  - port: 80
    targetPort: 80

HorizontalPodAutoscaler_nginx_02

3、創建hpa,設定cpu超過50%,則觸發自動創建Pod副本

cat hpa-demoapp.yml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-demoapp
spec:
  maxReplicas: 5
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: deploy-hpa
  targetCPUUtilizationPercentage: 50

4、模擬負載

頻繁請求

while sleep 0.01; do curl http://10.96.125.61;done

HorizontalPodAutoscaler_Pod_03

降低請求頻率

while sleep 1; do curl http://10.96.125.61;done

HorizontalPodAutoscaler_Deployment_04

HorizontalPodAutoscaler_Pod_05