前言
- 本篇来学习Pod控制器-Horizontal Pod Autoscaler
Horizontal Pod Autoscaler
HPA可以获取每个Pod利用率,然后和HPA中定义的指标进行对比,同时计算出需要伸缩的具体值,最后实现Pod的数量的调整。其实HPA与之前的Deployment一样,也属于一种Kubernetes资源对象,它通过追踪分析RC控制的所有目标Pod的负载变化情况,来确定是否需要针对性地调整目标Pod的副本数,这是HPA的实现原理。
安装metrics-server
# 安装git yum install git -y # 获取metrics-server, 注意使用的版本 [root@master ~]# git clone -b v0.3.6 https://github.com/kubernetes-incubator/metrics-server # 修改deployment, 注意修改的是镜像和初始化参数 [root@master ~]# cd /root/metrics-server/deploy/1.8+/ [root@master ~]# vim metrics-server-deployment.yaml 按图中添加下面选项 hostNetwork: true image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.6 args: - --kubelet-insecure-tls - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP # 安装metrics-server [root@master 1.8+]# kubectl apply -f ./ clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader unchanged clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator unchanged rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader unchanged apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io unchanged serviceaccount/metrics-server unchanged deployment.apps/metrics-server created service/metrics-server unchanged clusterrole.rbac.authorization.k8s.io/system:metrics-server unchanged clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server unchanged # 查看pod [root@master 1.8+]# kubectl get pod -n kube-system NAME READY STATUS RESTARTS AGE metrics-server-6b976979db-jwqms 1/1 Running 0 8m35s # 查看资源使用情况 [root@master 1.8+]# kubectl top node NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% master 158m 7% 1020Mi 59% node1 35m 1% 423Mi 24% node2 47m 2% 408Mi 23% node3 55m 2% 440Mi 25% [root@master 1.8+]# kubectl top pod -n kube-system NAME CPU(cores) MEMORY(bytes) coredns-6955765f44-rb6mz 5m 5Mi etcd-master 17m 76Mi kube-apiserver-master 45m 321Mi kube-controller-manager-master 34m 57Mi kube-flannel-ds-m8scb 3m 41Mi kube-flannel-ds-nstpr 2m 49Mi kube-flannel-ds-v46tp 2m 23Mi kube-proxy-4r8jh 1m 14Mi kube-proxy-5v5qn 1m 13Mi kube-proxy-s4fw2 1m 15Mi kube-proxy-tk5bx 1m 22Mi kube-scheduler-master 4m 25Mi metrics-server-6b976979db-jwqms 1m 11Mi
- metrics-server-deployment.yaml 文件修改后如下:
--- 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: hostNetwork: true serviceAccountName: metrics-server volumes: # mount in tmp so we can safely use from-scratch images and/or read-only containers - name: tmp-dir emptyDir: {} containers: - name: metrics-server image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.6 imagePullPolicy: Always args: - --kubelet-insecure-tls - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP volumeMounts: - name: tmp-dir mountPath: /tmp
准备deployment和servie
创建pc-hpa-pod.yaml文件,内容如下:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx namespace: dev spec: strategy: # 策略 type: RollingUpdate # 滚动更新策略 replicas: 1 selector: matchLabels: app: nginx-pod template: metadata: labels: app: nginx-pod spec: containers: - name: nginx image: nginx:1.17.1 resources: # 资源配额 limits: # 限制资源(上限) cpu: "1" # CPU限制,单位是core数 requests: # 请求资源(下限) cpu: "100m" # CPU限制,单位是core数
# 创建deployment [root@master 1.8+]# kubectl run nginx --image=nginx:1.17.1 --requests=cpu=100m -n dev # 创建service [root@master 1.8+]# kubectl expose deployment nginx --type=NodePort --port=80 -n dev service/nginx exposed # 查看 [root@master 1.8+]# kubectl get deployment,pod,svc -n dev NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/nginx 1/1 1 1 20s NAME READY STATUS RESTARTS AGE pod/nginx-778cb5fb7b-2q6zf 1/1 Running 0 19s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/nginx NodePort 10.110.69.156 <none> 80:31898/TCP 8s
部署HPA
创建pc-hpa.yaml文件,内容如下:
apiVersion: autoscaling/v1 kind: HorizontalPodAutoscaler metadata: name: pc-hpa namespace: dev spec: minReplicas: 1 #最小pod数量 maxReplicas: 10 #最大pod数量 targetCPUUtilizationPercentage: 3 # CPU使用率指标 scaleTargetRef: # 指定要控制的nginx信息 apiVersion: /v1 kind: Deployment name: nginx
# 创建hpa [root@master ~]# kubectl create -f pc-hpa.yaml horizontalpodautoscaler.autoscaling/pc-hpa created # 查看hpa [root@master ~]# kubectl get hpa -n dev NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE pc-hpa Deployment/nginx <unknown>/3% 1 10 0 11m
测试
使用压测工具对service地址192.168.96.100:31898
进行压测,然后通过控制台查看hpa和pod的变化
# hpa变化 [root@master ~]# kubectl get hpa -n dev -w # deployment变化 [root@master ~]# kubectl get deployment -n dev -w # pod变化 [root@master ~]# kubectl get pods -n dev -w