怎么为Kubernetes配置Pod水平自动扩展

59次阅读
没有评论

这篇文章主要介绍了怎么为 Kubernetes 配置 Pod 水平自动扩展,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让丸趣 TV 小编带着大家一起了解一下。

介 绍

Kubernetes 有一个强大的功能,它能在运行的服务上进行编码并配置弹性伸缩。如果没有弹性伸缩功能,就很难适应部署的扩展和满足 SLAs。这一功能称为 Horizontal Pod Autoscaler (HPA)。

为什么使用 HPA

使用 HPA,您可以根据资源的使用情况或者自定义的指标,实现部署的自动扩展和缩减,让部署的规模接近于实际服务的负载。

HPA 可以为您的服务带来两个直接的帮助:

在需要计算和内存资源时提供资源,在不需要时释放它们

按需增加 / 降低性能以实现 SLA

HPA 工作原理

HPA 会根据监测到的 CPU/ 内存利用率(资源指标),或基于第三方指标应用程序(如 Prometheus、Datadog 等)提供的自定义指标,自动调整副本控制器、部署或者副本集合的 pods 数量(定义最小和最大 pods 数)。HPA 是一种控制回路,它的周期由 Kubernetes 的 controller manager –horizontal-pod-autoscaler-sync-period 标志控制(默认值是 30s)。

怎么为 Kubernetes 配置 Pod 水平自动扩展

HPA 定义

HPA 是 Kubernetes 中弹性伸缩 API 组下的一个 API 资源。当前稳定的版本是 autoscaling/v1,它只提供了对 CPU 自动缩放的支持。如果您想额外获得对内存和自定义指标的支持,可以使用 Beta 版本 autoscaling/v2beta1。

您可以在 HPA API 对象中看到更多信息:https://git.k8s.io/community/contributors/design-proposals/autoscaling/horizontal-pod-autoscaler.md#horizontalpodautoscaler-object

在一般情况下 HPA 是由 kubectl 来提供支持的。可以使用 kubectl 进行创建、管理和删除:

创建 HPA:

带有 manifest: kubectl create -f HPA_MANIFEST

没有 manifest(只支持 CPU):kubectl autoscale deployment hello-world –min=2 –man=5 –-cpu-percent=50

获取 hpa 信息:

基本信息: kubectl get hpa hello-world

细节描述: kubectl describe hpa hello-world

删除 hpa:

kubectl delete hpa hello-world

下面是一个 HPA manifest 定义的例子:

怎么为 Kubernetes 配置 Pod 水平自动扩展

这里使用了 autoscaling/v2beta1 版本,用到了 cpu 和内存指标

控制 hello-world 项目部署的自动缩放

定义了副本的最小值 1

定义了副本的最大值 10

当满足时调整大小:

CPU 使用率超过 50%

内存使用超过 100Mi

安 装

在 HPA 可以在 Kubernetes 集群上使用之前,有一些元素需要在系统中安装和配置。

需 求

检查确定 Kubernetes 集群服务正在运行并且至少包含了这些标志:

kube-api: requestheader-client-ca-file

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 集群定义,请确定您已经在服务部分添加了这些行。如果要在 Rancher v2.0.X UI 中执行此操作,请打开”Cluster options”-“Edit as YAML”并添加下面的定义:

怎么为 Kubernetes 配置 Pod 水平自动扩展

要部署指标服务,您的 Kubernetes 集群必须要正确配置和部署。

注意:在部署和测试示例时,本文使用的是 Rancher v2.0.6 以及 k8s v1.10.1 集群

资源指标

如果 HPA 想要使用资源指标,那么就需要用到 metrics-server 包了,它在 Kubernetes 集群中的 kube-system 命名空间里。

按照下面的步骤实现:

配置 kubectl 连接到正确的 Kubernetes 集群

克隆 metrics-server 的 Github 仓库:git clone https://github.com/kubernetes-incubator/metrics-server

安装 metrics-server 包(假设 Kubernetes 升级到了 1.8):kubectl create -f metrics-server/deply/1.8+/

检查 metrics-server 是否运行正常。在命名空间 kube-system 可以检查服务 pod 以及日志

怎么为 Kubernetes 配置 Pod 水平自动扩展

检查是否可以从 kubectl 访问指标 API:如果您要直接访问 Kubernetes 集群,请使用 kubectl config 的服务器 URL,比如‘https://:6443’

怎么为 Kubernetes 配置 Pod 水平自动扩展

如果您想通过 Rancher 访问 Kubernetes 集群,那么 kubectl config 的服务器 URL 就要像:https:// RANCHER_URL /k8s/clusters/ CLUSTER_ID,即你还要在原本的

API 路径后面加上 /k8s/clusters/ CLUSTER_ID

怎么为 Kubernetes 配置 Pod 水平自动扩展

自定义指标(Prometheus)

自定义指标作为一种资源,可以由许多第三方应用程序提供。我们准备在演示中使用 Prometheus。假设 Prometheus 已经部署在您的 Kubernetes 集群中了,它可以从 pods、节点、命名空间等等地方获得正确的指标,我们将使用 Prometheus url,http://prometheus.mycompany.io,它公开于端口 80。

Prometheus 可以在 Rancher v2.0 目录中部署。如果在 Kubernetes 集群上没有运行,那么就在 Rancher 目录中部署它。

如果 HPA 想要使用 Prometheus 中的自定义指标,那么 Kubernetes 集群上的 kube-system 命名空间则需要用到 k8s-prometheus-adapter。为了方便 k8s-prometheus-adapter 的安装,我们将使用 banzai-charts 提供的 Helm chart。

通过下面的步骤可以使用这一 chart:

在 k8s 集群上初始化 helm

怎么为 Kubernetes 配置 Pod 水平自动扩展

从 Github 仓库克隆 banzai-charts:

怎么为 Kubernetes 配置 Pod 水平自动扩展

安装 prometheus-adapter,指定具体的 Prometheus URL 和端口

怎么为 Kubernetes 配置 Pod 水平自动扩展

检查 prometheus-adapter 是否运行正常。检查服务 pod 和日志是在 kube-system 命名空间下

怎么为 Kubernetes 配置 Pod 水平自动扩展

检查指标 API 是否可以从 kubectl 进行访问:直接访问 Kubernetes 集群,那么 kubectl config 的服务器 URL 就比如 https:// K8s_URL :6443

怎么为 Kubernetes 配置 Pod 水平自动扩展

如果是从 Rancher 进行访问,那么 kubectl config 的服务器 URL 就是 https:// RANCHER_URL /k8s/clusters/ CLUSTER_ID,需要加上后缀 /k8s/clusters/ CLUSTER_ID

怎么为 Kubernetes 配置 Pod 水平自动扩展

ClusterRole 和 ClusterRoleBinding

默认情况下,HPA 将尝试通过用户的 system:anonymous 读取(系统的和自定义的)指标。用户需要定义 view-resource-metrics 以及 view-custom-metrics,而 ClusterRole 和 ClusterRoleBinding 将它们分配给 system:anonymous 来打开对指标的读取访问。

要实现这一点,需要下面的步骤:

配置 kubectl 正确连接到 k8s 集群

复制 ClusterRole 和 ClusterRoleBinding 文件:

怎么为 Kubernetes 配置 Pod 水平自动扩展

怎么为 Kubernetes 配置 Pod 水平自动扩展

在 Kubernetes 集群上创建它们(如果你想使用自定义指标的话):

怎么为 Kubernetes 配置 Pod 水平自动扩展

服务部署

为了让 HPA 正常工作,服务部署应该要有容器的资源请求定义。

我们用一个 hello-world 的例子来测试一下 HPA 是否正常工作。

我们根据下面步骤进行,第一步,正确配置 kubectl 连接到 k8s 集群,第二步,复制 hello-world 的部署文件。

怎么为 Kubernetes 配置 Pod 水平自动扩展

在 k8s 集群上部署它

怎么为 Kubernetes 配置 Pod 水平自动扩展

为资源或者自定义指标复制 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

自定义指标(和资源指标一样,不过需要添加自定义的 cpu_system 指标)

怎么为 Kubernetes 配置 Pod 水平自动扩展

获得 HPA 信息和描述,并且检查资源指标是否已经显示出来:

资源指标:

怎么为 Kubernetes 配置 Pod 水平自动扩展

自定义指标:

怎么为 Kubernetes 配置 Pod 水平自动扩展

给我们的服务产生负载,进行弹性伸缩的测试。这里可以使用各种各样的工具(产生负载),不过这里我们使用 https://github.com/rakyll/hey 向 hello-world 服务发出 http 请求,并观察弹性伸缩是否正常工作

观察自动的扩缩容

资源指标:

当 cpu 利用率达到目标比例时,自动扩展到 2 个 pods

怎么为 Kubernetes 配置 Pod 水平自动扩展

怎么为 Kubernetes 配置 Pod 水平自动扩展

当 cpu 使用率达到目标值 horizontal-pod-autoscaler-upscale-delay 默认超过 3 分钟时,扩展到 3 个 pods:

怎么为 Kubernetes 配置 Pod 水平自动扩展

怎么为 Kubernetes 配置 Pod 水平自动扩展

当 cpu 使用率降到目标值 horizontal-pod-autoscaler-downscale-delay 默认超过 5 分钟时,缩小到 1 个 pods:

怎么为 Kubernetes 配置 Pod 水平自动扩展

怎么为 Kubernetes 配置 Pod 水平自动扩展

自定义指标:

当 cpu 利用率达到目标时扩展到 2 个 pods:

怎么为 Kubernetes 配置 Pod 水平自动扩展

怎么为 Kubernetes 配置 Pod 水平自动扩展

当 cpu_system 利用率限制达到目标值,扩展到 3 个 pods:

怎么为 Kubernetes 配置 Pod 水平自动扩展

怎么为 Kubernetes 配置 Pod 水平自动扩展

当 cpu 利用率限制达到目标值 horizontal-pod-autoscaler-upscale-delay 超过 3 分钟(默认),扩展到 4 个 pods:

怎么为 Kubernetes 配置 Pod 水平自动扩展

怎么为 Kubernetes 配置 Pod 水平自动扩展

当所有的指标都低于目标值 horizontal-pod-autoscaler-downscale-delay 超过 5 分钟,自动缩小到 1 个 pods:

怎么为 Kubernetes 配置 Pod 水平自动扩展

怎么为 Kubernetes 配置 Pod 水平自动扩展

感谢你能够认真阅读完这篇文章,希望丸趣 TV 小编分享的“怎么为 Kubernetes 配置 Pod 水平自动扩展”这篇文章对大家有帮助,同时也希望大家多多支持丸趣 TV,关注丸趣 TV 行业资讯频道,更多相关知识等着你来学习!