- hpa:(水平扩容)
表示Pod数量资源不足时,可以自动增加Pod副本数量,以抵抗流量过多的情况,降低负载。
- vpa: (垂直扩容)
表示可以动态调整容器的资源上限,比如一个Pod一开始是200Mi内存,如果资源达到定义的阈值,就可以扩展内存,但不会增加pod副本数量。
典型的区别在于vpa具有一定的资源上限问题,因为pod是K8S集群调度的最小单元,不可拆分,因此这个将来扩容时,取决于单节点的资源上限。
2.部署metrics-server组件
2.1 下载资源清单
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/high-availability-1.21+.yaml
vim high-availability-1.21+.yaml
...
114 apiVersion: apps/v1
115 kind: Deployment
116 metadata:
...
144 - args:
145 - --kubelet-insecure-tls # 不要验证Kubelets提供的服务证书的CA。不配置则会报错x509。
...
... image: registry.aliyuncs.com/google_containers/metrics-server:v0.7.2
2.3 部署metrics-server组件
[root@master231 ~]# kubectl apply -f high-availability-1.21+.yaml
serviceaccount/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
service/metrics-server created
deployment.apps/metrics-server created
poddisruptionbudget.policy/metrics-server created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
[root@master231 ~]#
2.4 查看镜像是否部署成功
[root@master231 02-metrics-server]# kubectl get pods,svc -n kube-system -l k8s-app=metrics-server -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/metrics-server-57c6f647bb-6n74n 1/1 Running 0 71s 10.100.1.102 worker232 <none> <none>
pod/metrics-server-57c6f647bb-f5t5j 1/1 Running 0 71s 10.100.2.73 worker233 <none> <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/metrics-server ClusterIP 10.200.24.39 <none> 443/TCP 71s k8s-app=metrics-server
[root@master231 02-metrics-server]#
[root@master231 02-metrics-server]# kubectl -n kube-system describe svc metrics-server
Name: metrics-server
Namespace: kube-system
Labels: k8s-app=metrics-server
Annotations: <none>
Selector: k8s-app=metrics-server
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.200.24.39
IPs: 10.200.24.39
Port: https 443/TCP
TargetPort: https/TCP
Endpoints: 10.100.1.102:10250,10.100.2.73:10250
Session Affinity: None
Events: <none>
[root@master231 02-metrics-server]#
2.5 验证metrics组件是否正常工作
[root@master231 02-metrics-server]# kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
master231 73m 3% 1331Mi 17%
worker232 31m 1% 831Mi 10%
worker233 30m 1% 912Mi 11%
[root@master231 02-metrics-server]#
[root@master231 02-metrics-server]# kubectl top pods -A
NAMESPACE NAME CPU(cores) MEMORY(bytes)
default xiuxian-77b9d95d56-4dxpr 1m 0Mi
kube-flannel kube-flannel-ds-5hbns 5m 12Mi
kube-flannel kube-flannel-ds-dzffl 4m 12Mi
kube-flannel kube-flannel-ds-h5kwh 5m 12Mi
kube-system coredns-6d8c4cb4d-k52qr 1m 11Mi
kube-system coredns-6d8c4cb4d-rvzd9 1m 11Mi
kube-system etcd-master231 9m 108Mi
kube-system kube-apiserver-master231 29m 216Mi
kube-system kube-controller-manager-master231 13m 53Mi
kube-system kube-proxy-g5sfd 5m 17Mi
kube-system kube-proxy-m6mxj 5m 17Mi
kube-system kube-proxy-q5bqh 5m 17Mi
kube-system kube-scheduler-master231 2m 16Mi
kube-system metrics-server-57c6f647bb-6n74n 2m 14Mi
kube-system metrics-server-57c6f647bb-f5t5j 2m 14Mi
metallb-system controller-644c958987-57rzz 1m 14Mi
metallb-system speaker-4t849 3m 15Mi
metallb-system speaker-gnh9v 3m 16Mi
metallb-system speaker-kp99v 3m 15Mi
[root@master231 02-metrics-server]#
[root@master231 02-metrics-server]# kubectl top pods
NAME CPU(cores) MEMORY(bytes)
xiuxian-77b9d95d56-4dxpr 1m 0Mi
[root@master231 02-metrics-server]#
- 水平Pod伸缩hpa实战
1.什么是hpa
hpa是k8s集群内置的资源,全称为"HorizontalPodAutoscaler"。
可以自动实现Pod水平伸缩,说白了,在业务高峰期可以自动扩容Pod副本数量,在集群的低谷期,可以自动缩容Pod副本数量。
2.hpa
2.1 导入镜像
[root@worker233 ~]# wget http://192.168.21.253/Resources/Kubernetes/Add-ons/metrics-server/oldboyedu-linux-tools-v0.1-stress.tar.gz
[root@worker233 ~]# docker load -i oldboyedu-linux-tools-v0.1-stress.tar.gz
[root@worker233 ~]# docker tag jasonyin2020/oldboyedu-linux-tools:v0.1 harbor250.oldboyedu.com/oldboyedu-test/stress:v0.1
[root@worker233 ~]# docker push harbor250.oldboyedu.com/oldboyedu-test/stress:v0.1
2.2 编写资源清单
[root@master231 17-HorizontalPodAutoscaler]# cat > 01-deploy-hpa.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-stress
spec:
replicas: 1
selector:
matchLabels:
app: stress
template:
metadata:
labels:
app: stress
spec:
containers:
# - image: jasonyin2020/oldboyedu-linux-tools:v0.1
- image: harbor250.oldboyedu.com/oldboyedu-test/stress:v0.1
name: oldboyedu-linux-tools
args:
- tail
- -f
- /etc/hosts
# 配置容器的资源限制
resources:
# 容器的期望资源
requests:
# CPU限制,1 =1000m
cpu: 0.2
# 内存限制
memory: 300Mi
# 容器的资源上限
limits:
cpu: 0.5
memory: 500Mi
---
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: stress-hpa
spec:
maxReplicas: 5
minReplicas: 2
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: deploy-stress
targetCPUUtilizationPercentage: 95
EOF
2.3 创建资源
[root@master231 17-HorizontalPodAutoscaler]# kubectl apply -f 01-deploy-hpa.yaml
deployment.apps/deploy-stress created
horizontalpodautoscaler.autoscaling/stress-hpa created
[root@master231 17-HorizontalPodAutoscaler]#
2.4 测试验证
[root@master231 17-HorizontalPodAutoscaler]# kubectl get deploy,hpa,po -o wide # 第一次查看发现Pod副本数量只有1个
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deployment.apps/deploy-stress 2/2 2 2 44s oldboyedu-linux-tools harbor250.oldboyedu.com/oldboyedu-test/stress:v0.1 app=stress
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
horizontalpodautoscaler.autoscaling/stress-hpa Deployment/deploy-stress <unknown>/95% 2 5 2 44s
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/deploy-stress-74688d4f56-g4zcc 1/1 Running 0 44s 10.100.1.103 worker232 <none> <none>
pod/deploy-stress-74688d4f56-kz92b 1/1 Running 0 29s 10.100.2.74 worker233 <none> <none>
[root@master231 17-HorizontalPodAutoscaler]#
[root@master231 17-HorizontalPodAutoscaler]#
2.5 压力测试
[root@master231 ~]# kubectl exec deploy-stress-74688d4f56-g4zcc -- stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10m
stress: info: [7] dispatching hogs: 8 cpu, 4 io, 2 vm, 0 hdd
2.6 查看Pod副本数量
[root@master231 17-HorizontalPodAutoscaler]# kubectl get deploy,hpa,po -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deployment.apps/deploy-stress 3/3 3 3 2m47s oldboyedu-linux-tools harbor250.oldboyedu.com/oldboyedu-test/stress:v0.1 app=stress
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
horizontalpodautoscaler.autoscaling/stress-hpa Deployment/deploy-stress 125%/95% 2 5 3 2m47s
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/deploy-stress-74688d4f56-5rpqm 1/1 Running 0 17s 10.100.1.104 worker232 <none> <none>
pod/deploy-stress-74688d4f56-g4zcc 1/1 Running 0 2m47s 10.100.1.103 worker232 <none> <none>
pod/deploy-stress-74688d4f56-kz92b 1/1 Running 0 2m32s 10.100.2.74 worker233 <none> <none>
[root@master231 17-HorizontalPodAutoscaler]#
[root@master231 17-HorizontalPodAutoscaler]#
2.7 再次压测
[root@master231 ~]# kubectl exec deploy-stress-74688d4f56-5rpqm -- stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10m
stress: info: [6] dispatching hogs: 8 cpu, 4 io, 2 vm, 0 hdd
[root@master231 ~]# kubectl exec deploy-stress-74688d4f56-kz92b -- stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10m
stress: info: [7] dispatching hogs: 8 cpu, 4 io, 2 vm, 0 hdd
2.6 发现最多有5个Pod创建
[root@master231 17-HorizontalPodAutoscaler]# kubectl get deploy,hpa,po -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deployment.apps/deploy-stress 5/5 5 5 4m28s oldboyedu-linux-tools harbor250.oldboyedu.com/oldboyedu-test/stress:v0.1 app=stress
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
horizontalpodautoscaler.autoscaling/stress-hpa Deployment/deploy-stress 245%/95% 2 5 5 4m28s
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/deploy-stress-74688d4f56-4q775 1/1 Running 0 28s 10.100.2.75 worker233 <none> <none>
pod/deploy-stress-74688d4f56-5rpqm 1/1 Running 0 118s 10.100.1.104 worker232 <none> <none>
pod/deploy-stress-74688d4f56-9ndkh 1/1 Running 0 28s 10.100.1.105 worker232 <none> <none>
pod/deploy-stress-74688d4f56-g4zcc 1/1 Running 0 4m28s 10.100.1.103 worker232 <none> <none>
pod/deploy-stress-74688d4f56-kz92b 1/1 Running 0 4m13s 10.100.2.74 worker233 <none> <none>
[root@master231 17-HorizontalPodAutoscaler]#