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 文件配置
---apiVersion rbac.authorization.k8s.io/v1 kind ClusterRole metadata name system aggregated-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"---apiVersion rbac.authorization.k8s.io/v1 kind ClusterRoleBinding metadata name metrics-server system auth-delegator roleRef apiGroup rbac.authorization.k8s.io kind ClusterRole name system auth-delegator subjectskind ServiceAccount name metrics-server namespace kube-system ---apiVersion rbac.authorization.k8s.io/v1 kind RoleBinding metadata name metrics-server-auth-reader namespace kube-system roleRef apiGroup rbac.authorization.k8s.io kind Role name extension-apiserver-authentication-reader subjectskind ServiceAccount name metrics-server namespace kube-system ---apiVersion apiregistration.k8s.io/v1beta1 kind APIService metadata name v1beta1.metrics.k8s.io spec service name metrics-server namespace kube-system group metrics.k8s.io version v1beta1 insecureSkipTLSVerifytrue groupPriorityMinimum100 versionPriority100---apiVersion v1 kind ServiceAccount metadata name metrics-server namespace kube-system ---apiVersion apps/v1 kind Deployment metadata name metrics-server namespace kube-system labels k8s-app metrics-server spec selector matchLabels k8s-app metrics-server template metadata name metrics-server labels k8s-app metrics-server spec serviceAccountName metrics-server volumes# mount in tmp so we can safely use from-scratch images and/or read-only containersname tmp-dir emptyDir containersname metrics-server image liuyi71sinacom/metrics-server-amd64 v0.3.6 imagePullPolicy IfNotPresent args --cert-dir=/tmp --secure-port=4443 --kubelet-insecure-tls --kubelet-preferred-address-types=InternalIP portsname main-port containerPort4443 protocol TCP securityContext readOnlyRootFilesystemtrue runAsNonRoottrue runAsUser1000 volumeMountsname tmp-dir mountPath /tmp nodeSelector kubernetes.io/os linux kubernetes.io/arch"amd64"---apiVersion v1 kind Service metadata name metrics-server namespace kube-system labels kubernetes.io/name"Metrics-server" kubernetes.io/cluster-service"true"spec selector k8s-app metrics-server portsport443 protocol TCP targetPort main-port ---apiVersion rbac.authorization.k8s.io/v1 kind ClusterRole metadata name system metrics-server rulesapiGroups"" resources pods nodes nodes/stats namespaces configmaps verbs get list watch ---apiVersion rbac.authorization.k8s.io/v1 kind ClusterRoleBinding metadata name system metrics-server roleRef apiGroup rbac.authorization.k8s.io kind ClusterRole name system metrics-server subjectskind ServiceAccount name metrics-server namespace kube-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
apiVersion v1 kind Service metadata name myngx spec portsname myngx port3080 targetPort80 selector app myngx ---apiVersion apps/v1 kind Deployment metadata name myngx spec replicas10 strategy rollingUpdate maxSurge 40% maxUnavailable 40% type RollingUpdate selector matchLabels app myngx template metadata labels app myngx spec containersimage nginx1.7.9 name myngx portscontainerPort80 resources requests cpu 3m
创建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的缩容过程