跳至主要内容

使用 kubectl 測試 HPA

本文件描述了如何在使用負載測試工具擴展或縮減 HPA 後檢查其狀態。有關如何從 Rancher UI(至少 2.3.x 版本)檢查狀態的資訊,請參閱使用 Rancher UI 管理 HPA。

為了讓 HPA 正常運作,服務部署應該為容器定義資源請求。請按照以下 hello-world 範例來測試 HPA 是否正常運作。

  1. 配置 kubectl 以連接到您的 Kubernetes 叢集。

  2. 複製下面的 hello-world 部署清單。

    Hello World 清單
    apiVersion: apps/v1beta2
    kind: Deployment
    metadata:
    labels:
    app: hello-world
    name: hello-world
    namespace: default
    spec:
    replicas: 1
    selector:
    matchLabels:
    app: hello-world
    strategy:
    rollingUpdate:
    maxSurge: 1
    maxUnavailable: 0
    type: RollingUpdate
    template:
    metadata:
    labels:
    app: hello-world
    spec:
    containers:
    - image: rancher/hello-world
    imagePullPolicy: Always
    name: hello-world
    resources:
    requests:
    cpu: 500m
    memory: 64Mi
    ports:
    - containerPort: 80
    protocol: TCP
    restartPolicy: Always
    ---
    apiVersion: v1
    kind: Service
    metadata:
    name: hello-world
    namespace: default
    spec:
    ports:
    - port: 80
    protocol: TCP
    targetPort: 80
    selector:
    app: hello-world
  3. 將其部署到您的叢集。

    # kubectl create -f <HELLO_WORLD_MANIFEST>
  4. 根據您使用的指標類型,複製下面的其中一個 HPA:

    Hello World HPA:資源指標
    apiVersion: autoscaling/v2beta1
    kind: HorizontalPodAutoscaler
    metadata:
    name: hello-world
    namespace: default
    spec:
    scaleTargetRef:
    apiVersion: extensions/v1beta1
    kind: Deployment
    name: hello-world
    minReplicas: 1
    maxReplicas: 10
    metrics:
    - type: Resource
    resource:
    name: cpu
    targetAverageUtilization: 50
    - type: Resource
    resource:
    name: memory
    targetAverageValue: 1000Mi
    Hello World HPA:自訂指標
    apiVersion: autoscaling/v2beta1
    kind: HorizontalPodAutoscaler
    metadata:
    name: hello-world
    namespace: default
    spec:
    scaleTargetRef:
    apiVersion: extensions/v1beta1
    kind: Deployment
    name: hello-world
    minReplicas: 1
    maxReplicas: 10
    metrics:
    - type: Resource
    resource:
    name: cpu
    targetAverageUtilization: 50
    - type: Resource
    resource:
    name: memory
    targetAverageValue: 100Mi
    - type: Pods
    pods:
    metricName: cpu_system
    targetAverageValue: 20m
  5. 查看 HPA 資訊和描述。確認顯示了指標資料。

    資源指標
    1. 輸入以下命令。
      # kubectl get hpa
      NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
      hello-world Deployment/hello-world 1253376 / 100Mi, 0% / 50% 1 10 1 6m
      # kubectl describe hpa
      Name: hello-world
      Namespace: default
      Labels: <none>
      Annotations: <none>
      CreationTimestamp: Mon, 23 Jul 2018 20:21:16 +0200
      Reference: Deployment/hello-world
      Metrics: ( current / target )
      resource memory on pods: 1253376 / 100Mi
      resource cpu on pods (as a percentage of request): 0% (0) / 50%
      Min replicas: 1
      Max replicas: 10
      Conditions:
      Type Status Reason Message
      ---- ------ ------ -------
      AbleToScale True ReadyForNewScale the last scale time was sufficiently old as to warrant a new scale
      ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from memory resource
      ScalingLimited False DesiredWithinRange the desired count is within the acceptable range
      Events: <none>
    自訂指標
    1. 輸入以下命令。
      # kubectl describe hpa
      您應該收到以下輸出。
      Name:                                                  hello-world
      Namespace: default
      Labels: <none>
      Annotations: <none>
      CreationTimestamp: Tue, 24 Jul 2018 18:36:28 +0200
      Reference: Deployment/hello-world
      Metrics: ( current / target )
      resource memory on pods: 3514368 / 100Mi
      "cpu_system" on pods: 0 / 20m
      resource cpu on pods (as a percentage of request): 0% (0) / 50%
      Min replicas: 1
      Max replicas: 10
      Conditions:
      Type Status Reason Message
      ---- ------ ------ -------
      AbleToScale True ReadyForNewScale the last scale time was sufficiently old as to warrant a new scale
      ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from memory resource
      ScalingLimited False DesiredWithinRange the desired count is within the acceptable range
      Events: <none>
  6. 為服務生成負載以測試您的 pod 是否按預期自動擴展。您可以使用任何負載測試工具(Hey、Gatling 等),但我們使用 Hey。

  7. 測試 pod 自動擴展是否按預期運作。

    使用資源指標測試自動擴展:

    擴展到 2 個 Pod:CPU 使用率達到目標

    使用您的負載測試工具根據 CPU 使用率擴展到兩個 pod。

    1. 查看您的 HPA。
      # kubectl describe hpa
      您應該收到類似以下的輸出。
      Name:                                                  hello-world
      Namespace: default
      Labels: <none>
      Annotations: <none>
      CreationTimestamp: Mon, 23 Jul 2018 22:22:04 +0200
      Reference: Deployment/hello-world
      Metrics: ( current / target )
      resource memory on pods: 10928128 / 100Mi
      resource cpu on pods (as a percentage of request): 56% (280m) / 50%
      Min replicas: 1
      Max replicas: 10
      Conditions:
      Type Status Reason Message
      ---- ------ ------ -------
      AbleToScale True SucceededRescale the HPA controller was able to update the target scale to 2
      ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from cpu resource utilization (percentage of request)
      ScalingLimited False DesiredWithinRange the desired count is within the acceptable range
      Events:
      Type Reason Age From Message
      ---- ------ ---- ---- -------
      Normal SuccessfulRescale 13s horizontal-pod-autoscaler New size: 2; reason: cpu resource utilization (percentage of request) above target
    2. 輸入以下命令以確認已擴展到兩個 pod。
         # kubectl get pods
      您應該收到類似以下的輸出:
         NAME                                                     READY     STATUS    RESTARTS   AGE
      hello-world-54764dfbf8-k8ph2 1/1 Running 0 1m
      hello-world-54764dfbf8-q6l4v 1/1 Running 0 3h
    擴展到 3 個 Pod:CPU 使用率達到目標

    使用您的負載測試工具根據 CPU 使用率擴展到 3 個 pod,horizontal-pod-autoscaler-upscale-delay 設定為 3 分鐘。

    1. 輸入以下命令。
      # kubectl describe hpa
      您應該收到類似以下的輸出
         Name:                                                  hello-world
      Namespace: default
      Labels: <none>
      Annotations: <none>
      CreationTimestamp: Mon, 23 Jul 2018 22:22:04 +0200
      Reference: Deployment/hello-world
      Metrics: ( current / target )
      resource memory on pods: 9424896 / 100Mi
      resource cpu on pods (as a percentage of request): 66% (333m) / 50%
      Min replicas: 1
      Max replicas: 10
      Conditions:
      Type Status Reason Message
      ---- ------ ------ -------
      AbleToScale True SucceededRescale the HPA controller was able to update the target scale to 3
      ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from cpu resource utilization (percentage of request)
      ScalingLimited False DesiredWithinRange the desired count is within the acceptable range
      Events:
      Type Reason Age From Message
      ---- ------ ---- ---- -------
      Normal SuccessfulRescale 4m horizontal-pod-autoscaler New size: 2; reason: cpu resource utilization (percentage of request) above target
      Normal SuccessfulRescale 16s horizontal-pod-autoscaler New size: 3; reason: cpu resource utilization (percentage of request) above target
    2. 輸入以下命令以確認三個 pod 正在執行。
      # kubectl get pods
      您應該收到類似以下的輸出。
       NAME                                                     READY     STATUS    RESTARTS   AGE
      hello-world-54764dfbf8-f46kh 0/1 Running 0 1m
      hello-world-54764dfbf8-k8ph2 1/1 Running 0 5m
      hello-world-54764dfbf8-q6l4v 1/1 Running 0 3h
    縮減到 1 個 Pod:所有指標低於目標

    使用您的負載測試在所有指標低於目標 horizontal-pod-autoscaler-downscale-delay(預設為 5 分鐘)時縮減到 1 個 pod。

    1. 輸入以下命令。
    # kubectl describe hpa

    您應該收到類似以下的輸出。

        Name:                                                  hello-world
    Namespace: default
    Labels: <none>
    Annotations: <none>
    CreationTimestamp: Mon, 23 Jul 2018 22:22:04 +0200
    Reference: Deployment/hello-world
    Metrics: ( current / target )
    resource memory on pods: 10070016 / 100Mi
    resource cpu on pods (as a percentage of request): 0% (0) / 50%
    Min replicas: 1
    Max replicas: 10
    Conditions:
    Type Status Reason Message
    ---- ------ ------ -------
    AbleToScale True SucceededRescale the HPA controller was able to update the target scale to 1
    ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from memory resource
    ScalingLimited False DesiredWithinRange the desired count is within the acceptable range
    Events:
    Type Reason Age From Message
    ---- ------ ---- ---- -------
    Normal SuccessfulRescale 10m horizontal-pod-autoscaler New size: 2; reason: cpu resource utilization (percentage of request) above target
    Normal SuccessfulRescale 6m horizontal-pod-autoscaler New size: 3; reason: cpu resource utilization (percentage of request) above target
    Normal SuccessfulRescale 1s horizontal-pod-autoscaler New size: 1; reason: All metrics below target

    使用自訂指標測試自動擴展:

    擴展到 2 個 Pod:CPU 使用率達到目標

    使用您的負載測試工具根據 CPU 使用率擴展兩個 pod。

    1. 輸入以下命令。
      # kubectl describe hpa

    您應該收到類似以下的輸出。

      Name:                                                  hello-world
    Namespace: default
    Labels: <none>
    Annotations: <none>
    CreationTimestamp: Tue, 24 Jul 2018 18:01:11 +0200
    Reference: Deployment/hello-world
    Metrics: ( current / target )
    resource memory on pods: 8159232 / 100Mi
    "cpu_system" on pods: 7m / 20m
    resource cpu on pods (as a percentage of request): 64% (321m) / 50%
    Min replicas: 1
    Max replicas: 10
    Conditions:
    Type Status Reason Message
    ---- ------ ------ -------
    AbleToScale True SucceededRescale the HPA controller was able to update the target scale to 2
    ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from cpu resource utilization (percentage of request)
    ScalingLimited False DesiredWithinRange the desired count is within the acceptable range
    Events:
    Type Reason Age From Message
    ---- ------ ---- ---- -------
    Normal SuccessfulRescale 16s horizontal-pod-autoscaler New size: 2; reason: cpu resource utilization (percentage of request) above target
    1. 輸入以下命令以確認兩個 pod 正在執行。
      # kubectl get pods

    您應該收到類似以下的輸出。

          NAME                           READY     STATUS    RESTARTS   AGE
    hello-world-54764dfbf8-5pfdr 1/1 Running 0 3s
    hello-world-54764dfbf8-q6l82 1/1 Running 0 6h
    擴展到 3 個 Pod:CPU 使用率達到目標

    使用您的負載測試工具在 cpu_system 使用率達到目標時擴展到三個 pod。

    1. 輸入以下命令。
      # kubectl describe hpa
      您應該收到類似以下的輸出:
         Name:                                                  hello-world
      Namespace: default
      Labels: <none>
      Annotations: <none>
      CreationTimestamp: Tue, 24 Jul 2018 18:01:11 +0200
      Reference: Deployment/hello-world
      Metrics: ( current / target )
      resource memory on pods: 8374272 / 100Mi
      "cpu_system" on pods: 27m / 20m
      resource cpu on pods (as a percentage of request): 71% (357m) / 50%
      Min replicas: 1
      Max replicas: 10
      Conditions:
      Type Status Reason Message
      ---- ------ ------ -------
      AbleToScale True SucceededRescale the HPA controller was able to update the target scale to 3
      ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from cpu resource utilization (percentage of request)
      ScalingLimited False DesiredWithinRange the desired count is within the acceptable range
      Events:
      Type Reason Age From Message
      ---- ------ ---- ---- -------
      Normal SuccessfulRescale 3m horizontal-pod-autoscaler New size: 2; reason: cpu resource utilization (percentage of request) above target
      Normal SuccessfulRescale 3s horizontal-pod-autoscaler New size: 3; reason: pods metric cpu_system above target
    2. 輸入以下命令以確認三個 pod 正在執行。
      # kubectl get pods
      您應該收到類似以下的輸出:
         # kubectl get pods
      NAME READY STATUS RESTARTS AGE
      hello-world-54764dfbf8-5pfdr 1/1 Running 0 3m
      hello-world-54764dfbf8-m2hrl 1/1 Running 0 1s
      hello-world-54764dfbf8-q6l82 1/1 Running 0 6h
    擴展到 4 個 Pod:CPU 使用率達到目標

    使用您的負載測試工具根據 CPU 使用率擴展到四個 pod。horizontal-pod-autoscaler-upscale-delay 預設設定為三分鐘。

    1. 輸入以下命令。
    # kubectl describe hpa

    您應該收到類似以下的輸出。

        Name:                                                  hello-world
    Namespace: default
    Labels: <none>
    Annotations: <none>
    CreationTimestamp: Tue, 24 Jul 2018 18:01:11 +0200
    Reference: Deployment/hello-world
    Metrics: ( current / target )
    resource memory on pods: 8374272 / 100Mi
    "cpu_system" on pods: 27m / 20m
    resource cpu on pods (as a percentage of request): 71% (357m) / 50%
    Min replicas: 1
    Max replicas: 10
    Conditions:
    Type Status Reason Message
    ---- ------ ------ -------
    AbleToScale True SucceededRescale the HPA controller was able to update the target scale to 3
    ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from cpu resource utilization (percentage of request)
    ScalingLimited False DesiredWithinRange the desired count is within the acceptable range
    Events:
    Type Reason Age From Message
    ---- ------ ---- ---- -------
    Normal SuccessfulRescale 5m horizontal-pod-autoscaler New size: 2; reason: cpu resource utilization (percentage of request) above target
    Normal SuccessfulRescale 3m horizontal-pod-autoscaler New size: 3; reason: pods metric cpu_system above target
    Normal SuccessfulRescale 4s horizontal-pod-autoscaler New size: 4; reason: cpu resource utilization (percentage of request) above target
    1. 輸入以下命令以確認四個 pod 正在執行。
      # kubectl get pods
      您應該收到類似以下的輸出。
        NAME                           READY     STATUS    RESTARTS   AGE
      hello-world-54764dfbf8-2p9xb 1/1 Running 0 5m
      hello-world-54764dfbf8-5pfdr 1/1 Running 0 2m
      hello-world-54764dfbf8-m2hrl 1/1 Running 0 1s
      hello-world-54764dfbf8-q6l82 1/1 Running 0 6h
    縮減到 1 個 Pod:所有指標低於目標

    使用您的負載測試工具在所有指標低於目標 horizontal-pod-autoscaler-downscale-delay 時縮減到一個 pod。

    1. 輸入以下命令。
      # kubectl describe hpa
      您應該收到類似以下的輸出。
          Name:                                                  hello-world
      Namespace: default
      Labels: <none>
      Annotations: <none>
      CreationTimestamp: Tue, 24 Jul 2018 18:01:11 +0200
      Reference: Deployment/hello-world
      Metrics: ( current / target )
      resource memory on pods: 8101888 / 100Mi
      "cpu_system" on pods: 8m / 20m
      resource cpu on pods (as a percentage of request): 0% (0) / 50%
      Min replicas: 1
      Max replicas: 10
      Conditions:
      Type Status Reason Message
      ---- ------ ------ -------
      AbleToScale True SucceededRescale the HPA controller was able to update the target scale to 1
      ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from memory resource
      ScalingLimited False DesiredWithinRange the desired count is within the acceptable range
      Events:
      Type Reason Age From Message
      ---- ------ ---- ---- -------
      Normal SuccessfulRescale 10m horizontal-pod-autoscaler New size: 2; reason: cpu resource utilization (percentage of request) above target
      Normal SuccessfulRescale 8m horizontal-pod-autoscaler New size: 3; reason: pods metric cpu_system above target
      Normal SuccessfulRescale 5m horizontal-pod-autoscaler New size: 4; reason: cpu resource utilization (percentage of request) above target
      Normal SuccessfulRescale 13s horizontal-pod-autoscaler New size: 1; reason: All metrics below target
    2. 輸入以下命令以確認只有一個 pod 正在執行。
          # kubectl get pods
      您應該收到類似以下的輸出。
          NAME                           READY     STATUS    RESTARTS   AGE
      hello-world-54764dfbf8-q6l82 1/1 Running 0 6h