HAP介绍
Horizontal Pod Autoscaler 根据观察到的 CPU 利用率(或者,在自定义指标 支持下,根据 其他一些应用程序提供的指标)自动扩展复制控制器、部署、副本集或有状态集中的 Pod 数量。
请注意,Horizontal Pod Autoscaling 不适用于无法缩放的对象,例如 DaemonSet。
Horizontal Pod Autoscaler 实现为 Kubernetes API 资源和控制器。
资源决定了控制器的行 为。
控制器会定期调整复制控制器或部署中的副本数量,以将观察到的指标(例如平均 CPU 利用率、平均内存利用率或任何其他自定义指标)与用户指定的目标相匹配。
K8s通过HPA,基于获取到的metrics(CPU utilization, custom metrics) value,对rc, deployment 管理的 pods 进行自动伸缩
HPA Controller 周期性(默认每 30s 一次,可通过 kube-controller-manager 的 flag-- horizontal-pod-autoscaler-sync-period 进行设置)的调整对应的 rc, Deployment 中的 replicas 数量,使得指定的 metrics value 能匹配用户指定的 target utilization value。
•在每个 HPA Controller 的处理周期中,kube-controller-manager 都去查询 HPA 中 定义的 metrics 的 utilization。查询方式根据 metric 类型不同而不同:
•如果 metric type 是 resource metrics,则通过 resource metrics API 查询。
•如果 metric type 属于 custom metrics,则通过 custom metrics API 查询。
部署metrics-server
Project Add: https://github.com/kubernetes-sigs/metrics-server
下载部署清单文件:
wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.6/components.yaml
components.yaml 文件的修改:
修改镜像:
修改镜像参数:args
完整的 components.yaml 文件配置
---apiVersionrbac.authorization.k8s.io/v1 kindClusterRole metadata namesystemaggregated-metrics-reader labels rbac.authorization.k8s.io/aggregate-to-view"true" rbac.authorization.k8s.io/aggregate-to-edit"true" rbac.authorization.k8s.io/aggregate-to-admin"true"rulesapiGroups"metrics.k8s.io" resources"pods""nodes" verbs"get""list""watch"---apiVersionrbac.authorization.k8s.io/v1 kindClusterRoleBinding metadata namemetrics-serversystemauth-delegator roleRef apiGrouprbac.authorization.k8s.io kindClusterRole namesystemauth-delegator subjectskindServiceAccount namemetrics-server namespacekube-system ---apiVersionrbac.authorization.k8s.io/v1 kindRoleBinding metadata namemetrics-server-auth-reader namespacekube-system roleRef apiGrouprbac.authorization.k8s.io kindRole nameextension-apiserver-authentication-reader subjectskindServiceAccount namemetrics-server namespacekube-system ---apiVersionapiregistration.k8s.io/v1beta1 kindAPIService metadata namev1beta1.metrics.k8s.io spec service namemetrics-server namespacekube-system groupmetrics.k8s.io versionv1beta1 insecureSkipTLSVerifytrue groupPriorityMinimum100 versionPriority100---apiVersionv1 kindServiceAccount metadata namemetrics-server namespacekube-system ---apiVersionapps/v1 kindDeployment metadata namemetrics-server namespacekube-system labels k8s-appmetrics-server spec selector matchLabels k8s-appmetrics-server template metadata namemetrics-server labels k8s-appmetrics-server spec serviceAccountNamemetrics-server volumes# mount in tmp so we can safely use from-scratch images and/or read-only containersnametmp-dir emptyDir containersnamemetrics-server imageliuyi71sinacom/metrics-server-amd64v0.3.6 imagePullPolicyIfNotPresent args--cert-dir=/tmp --secure-port=4443 --kubelet-insecure-tls --kubelet-preferred-address-types=InternalIP portsnamemain-port containerPort4443 protocolTCP securityContext readOnlyRootFilesystemtrue runAsNonRoottrue runAsUser1000 volumeMountsnametmp-dir mountPath/tmp nodeSelector kubernetes.io/oslinux kubernetes.io/arch"amd64"---apiVersionv1 kindService metadata namemetrics-server namespacekube-system labels kubernetes.io/name"Metrics-server" kubernetes.io/cluster-service"true"spec selector k8s-appmetrics-server portsport443 protocolTCP targetPortmain-port ---apiVersionrbac.authorization.k8s.io/v1 kindClusterRole metadata namesystemmetrics-server rulesapiGroups"" resourcespods nodes nodes/stats namespaces configmaps verbsget list watch ---apiVersionrbac.authorization.k8s.io/v1 kindClusterRoleBinding metadata namesystemmetrics-server roleRef apiGrouprbac.authorization.k8s.io kindClusterRole namesystemmetrics-server subjectskindServiceAccount namemetrics-server namespacekube-system
安装metrics-server
kubectl apply -f deployment.yaml
查看metric-server是否可用
╰─# kubectl top node --use-protocol-buffers NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% k201 290m 3% 1874Mi 24% k202 <unknown> <unknown> <unknown> <unknown> ╭─root@k201 ~/k8s/hpa ╰─#
自动伸缩
通过 CPU、内存监控指标实现应用自动弹性的先决条件
在 rs/rc/deployment 配置下必须有下面的配置,与 image 相同位置 ,需要配置如下内容:
resources requests cpu1
案例:
以myngx 为例,创建deployment
apiVersionv1 kindService metadata namemyngx spec portsnamemyngx port3080 targetPort80 selector appmyngx ---apiVersionapps/v1 kindDeployment metadata namemyngx spec replicas10 strategy rollingUpdate maxSurge40% maxUnavailable40% typeRollingUpdate selector matchLabels appmyngx template metadata labels appmyngx spec containersimagenginx1.7.9 namemyngx portscontainerPort80 resources requests cpu3m
创建deployment
╰─# kubectl create ns hpa ╰─# kubectl apply -f app-nginx.yaml -n hpa
查看pod状态
自动缩容:
手动配置缩容
╭─root@k201 ~/k8s/hpa ╰─# kubectl autoscale deployment myngx --min=1 --max=20 --cpu-percent=5 -n hpa horizontalpodautoscaler.autoscaling/myngx autoscaled ╭─root@k201 ~/k8s/hpa ╰─#
--min=1 : 最小一个pod数量
--max=20 : 最大20个pod的数量
--cpu-percent=5 : 当cup的使用百分比大于5%,自动扩容pod的数量
查看hpa状态
╰─# kubectl get hpa -n hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE myngx Deployment/myngx 0%/5% 1 20 10 2m2s ╭─root@k201 ~/k8s/hpa ╰─#
测试
ab 是 apache 自带的一款功能强大的测试工具,安装了 apache 一般就自带了
yum install httpd-tools -y
一般我们用到的是-n,-t 和-c 例如:
ab -c 1000 -n 50000 http://10.20.4.161:3080/
这个表示一共处理 10000 个请求,每次并发运行 1000 次 index.php 文件.
压力测试
监控pod的缩容过程







