环境CentOS7
[root@k8s-master deploy]# cat /etc/hosts
192.168.41.191 k8s-master
192.168.41.192 k8s-node1
192.168.41.193 k8s-node2
[root@k8s-master deploy]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 12d v1.21.0
k8s-node1 Ready <none> 12d v1.22.1
k8s-node2 Ready <none> 4h26m v1.21.0
HPA
查询指定的资源(RC或者Deployment)中Pod的资源使用率,并且与创建时设定的值和指标做对比,从而实现自动伸缩的功能。
安装
K8S资源指标获取工具:metrics-server,提供每个hpa所需要的当前值,从每个pod的kubelet中拿到pod所使资源量。
下载yaml文件,wget失败
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
#修改镜像地址,默认为k8s.gcr.io,国内无法拉取,添加--kubelet-insecure-tls参数
131 - args:
132 - --cert-dir=/tmp
133 - --secure-port=4443 #pod监控1000以下端口需要root权限
134 - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
135 - --kubelet-use-node-status-port
136 - --kubelet-insecure-tls #取消检测
137 image: bitnami/metrics-server:0.4.1
---
name: metrics-server
ports:
- containerPort: 4443
---
kubectl apply -f components.yam
#测试,kubectl top nodes
[root@k8s-master metrics-server]# kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k8s-master 465m 23% 1990Mi 54%
k8s-node1 439m 21% 715Mi 38%
k8s-node2 145m 7% 773Mi 41%
#新建Pod测试
apiVersion: apps/v1
kind: Deployment
metadata:
name: hpa-nginx-deploy
labels:
app: nginx-demo
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: 192.168.41.191:5000/nginx:v1
name: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
resources: #资源限制
limits: #limits上限
cpu: 400m
requests:
cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: nginx-demo
name: hpa-nginx-deploy
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: NodePort
status:
loadBalancer: {}
kubectl create -f hap-deploy-demo.yaml
#创建HPA
kubectl autoscale deployment hpa-nginx-deploy --cpu-percent=10 --min=1 --max=10
#查看
[root@k8s-master deploy]# kubectl get hpa -A
NAMESPACE NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
zedd hpa-nginx-deploy Deployment/hpa-nginx-deploy 0%/10% 1 10 1 111s
hpa.yaml kubectl get hpa hpa-nginx-deploy -o yaml > hpa.yaml
spec:
maxReplicas: 10 #资源最大副本数
minReplicas: 1 #资源最小副本数
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment #需要伸缩的资源类型
name: hpa-nginx-deploy #需要伸缩的资源名称
targetCPUUtilizationPercentage: 10 #触发伸缩的cpu使用率,10%是为了方便测试
status:
currentCPUUtilizationPercentage: 0 #当前资源下pod的cpu使用率
currentReplicas: 1 #当前的副本数
desiredReplicas: 1 #期望的副本数
#使用busybox容器测试
[root@k8s-master Service]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hpa-nginx-deploy NodePort 10.109.47.110 <none> 80:30828/TCP 77s
/ # while true; do wget -q -O- http://192.168.41.191:30828; done
#查看hpa
[root@k8s-master Service]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
hpa-nginx-deploy Deployment/hpa-nginx-deploy 21%/10% 1 10 1 12m
#副本数变为3个
[root@k8s-master Service]# kubectl get deployment hpa-nginx-deploy
NAME READY UP-TO-DATE AVAILABLE AGE
hpa-nginx-deploy 3/3 3 3 12m
#中断命令,过一会查看
[root@k8s-master Service]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
hpa-nginx-deploy Deployment/hpa-nginx-deploy 0%/10% 1 10 3 12m
#副本数
[root@k8s-master Service]# kubectl get deployment hpa-nginx-deploy
NAME READY UP-TO-DATE AVAILABLE AGE
hpa-nginx-deploy 1/1 1 1 18m