必须先满足一些要求,然后才能在 Kubernetes 集群中使用 HPA。

确保您的 Kubernetes 集群服务至少以以下参数运行:

  • kube-api:

  • kubelet: read-only-port 为 10255

  • kube-controller: 可选,仅在需要与默认值不同时才需要。

    • horizontal-pod-autoscaler-downscale-delay: "5m0s"
    • horizontal-pod-autoscaler-upscale-delay: "3m0s"
    • horizontal-pod-autoscaler-sync-period: "30s"

对于 RKE 部署的 Kubernetes 集群,在 services 部分添加此代码段。要使用 Rancher v2.0 UI 添加此代码段,请打开集群视图,然后为要在其中使用 HPA 的集群选择省略号(… )> 编辑。然后,从集群选项中,单击编辑为 YAML。将以下代码段添加 services 部分:

一旦配置和部署了 Kubernetes 集群,就可以部署指标服务(metrics services)。

先决条件:您必须运行 kubectl 1.8 或更高版本。

  1. 使用 kubectl 连接到您的 Kubernetes 集群。

  2. 克隆 GitHub metrics-server 仓库:

    1. # git clone https://github.com/kubernetes-incubator/metrics-server
  3. 安装 metrics-server 软件包。

    1. # kubectl create -f metrics-server/deploy/1.8+/
  4. 检查 metrics-server 是否正常运行。在 kube-system 命名空间里检查对应的 pod 和日志是否正常。

    1. 检查 pod 状态是否为 running 状态。输入以下命令:

      1. # kubectl get pods -n kube-system

      然后检查是否 pod 的状态 running .

    2. 检查 pod 日志以确保服务可用性。输入以下命令:

      1. # kubectl -n kube-system logs metrics-server-6fbfb84cdd-t2fk9
      1. I0723 08:09:56.193136 1 heapster.go:71] /metrics-server --source=kubernetes.summary_api:''
      2. I0723 08:09:56.194480 1 configs.go:61] Using Kubernetes client with master "https://10.43.0.1:443" and version
      3. I0723 08:09:56.194501 1 configs.go:62] Using kubelet port 10255
      4. I0723 08:09:56.198612 1 heapster.go:128] Starting with Metric Sink
      5. I0723 08:09:56.780114 1 serving.go:308] Generated self-signed cert (apiserver.local.config/certificates/apiserver.crt, apiserver.local.config/certificates/apiserver.key)
      6. I0723 08:09:57.391518 1 heapster.go:101] Starting Heapster API server...
      7. [restful] 2018/07/23 08:09:57 log.go:33: [restful/swagger] listing is available at https:///swaggerapi
      8. [restful] 2018/07/23 08:09:57 log.go:33: [restful/swagger] https:///swaggerui/ is mapped to folder /swagger-ui/
      9. I0723 08:09:57.394080 1 serve.go:85] Serving securely on 0.0.0.0:443
  5. 检查是否可以通过 kubectl 访问 metrics api。

    • 如果要通过 Rancher 访问集群,请在 kubectl 配置中以以下格式输入服务器 URL: https:// <RANCHER_URL>/k8s/clusters/<CLUSTER_ID> 。将后缀 /k8s/clusters/<CLUSTER_ID> 添加到 API 路径。

      1. # kubectl get --raw /k8s/clusters/<CLUSTER_ID>/apis/metrics.k8s.io/v1beta1

      如果 API 正常运行,您应该收到与以下输出类似的输出。

    • 如果直接访问集群,请在 kubectl 配置中以以下格式输入服务器 URL: https://<K8s_URL>:6443

      1. # kubectl get --raw /apis/metrics.k8s.io/v1beta1

      如果 API 正常运行,您应该收到与以下输出类似的输出。

      1. {"kind":"APIResourceList","apiVersion":"v1","groupVersion":"metrics.k8s.io/v1beta1","resources":[{"name":"nodes","singularName":"","namespaced":false,"kind":"NodeMetrics","verbs":["get","list"]},{"name":"pods","singularName":"","namespaced":true,"kind":"PodMetrics","verbs":["get","list"]}]}

默认情况下,HPA 使用system:anonymous用户读取资源和自定义指标。在 ClusterRole 和 ClusterRoleBindings 清单中将system:anonymous分配给view-resource-metricsview-custom-metrics。这些角色用于访问指标。

为此,请按照下列步骤操作:

  1. 资源指标: ApiGroups resource.metrics.k8s.io

    1. apiVersion: rbac.authorization.k8s.io/v1
    2. kind: ClusterRole
    3. metadata:
    4. rules:
    5. - apiGroups:
    6. - metrics.k8s.io
    7. - pods
    8. - nodes
    9. verbs:
    10. - get
    11. - list
    12. - watch
    13. ---
    14. apiVersion: rbac.authorization.k8s.io/v1
    15. kind: ClusterRoleBinding
    16. metadata:
    17. name: view-resource-metrics
    18. roleRef:
    19. apiGroup: rbac.authorization.k8s.io
    20. kind: ClusterRole
    21. name: view-resource-metrics
    22. subjects:
    23. - apiGroup: rbac.authorization.k8s.io
    24. kind: User
    25. name: system:anonymous
  1. # kubectl create -f <CUSTOM_METRICS_MANIFEST>