内容简介:本文风哥教程参考Linux官方文档、Red Hat Enterprise Linux官方文档、Ansible Automation Platform官方文档、Docker官方文档、Kubernetes官方文档和Podman官方文档等内容,详细介绍了相关技术的配置和使用方法。
本文档介绍
风哥提示:
Kubernetes自动扩缩容的配置方法。
Part01-自动扩缩容概述
1.1 扩缩容类型
[root@k8s-master ~]# cat > /root/k8s-autoscaling.txt << 'EOF' Kubernetes自动扩缩容 ==================== 1. HPA (Horizontal Pod Autoscaler) - 基于CPU/内存自动扩缩Pod数量 - 支持自定义指标 - 适用于无状态应用 2. VPA (Vertical Pod Autoscaler) - 自动调整Pod资源请求 - 优化资源分配 - 需要重启Pod 3. CA (Cluster Autoscaler) - 自动增减节点数量 - 基于资源需求 - 云环境支持 4. 扩缩容策略 - 最小/最大副本数 - 扩缩容阈值 - 冷却时间 EOF
Part02-HPA配置
2.1 创建HPA
[root@k8s-master ~]# kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.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.更多视频教程www.fgedu.net.cnrbac.authorization.k8s.io/metrics-server-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
service/metrics-server created
deployment.apps/metrics-server created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
# 验证Metrics Server
[root@k8s-master ~]# kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k8s-master 200m 5% 1024Mi 12%
k8s-node1 150m 3% 512Mi 6%
k8s-node2 150m 3% 512Mi 6%
# 创建测试Deployment
[root@k8s-master ~]# cat >更多学习教程公众号风哥教程itpux_com fgedu-app-deployment.yaml << 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: fgedu-web
namespace: fgedu-prod
spec:
replicas: 2
selector:
matchLabels:
app: fgedu-web
template:
metadata:
labels:
app: fgedu-web
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
EOF
[root@k8s-master ~]# kubectl apply -f fgedu-app-deployment.yaml
deployment.apps/fgedu-web created
# 创建HPA
[root@k8s-master ~]# cat > fgedu-hpa.yaml << 'EOF'
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: fgedu-web-hpa
namespace: fgedu-prod
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: fgedu-web
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
EOF
[root@k8s-master ~]# kubectl apply -f fgedu-hpa.yaml
horizontalpodautoscaler.autoscaling/fgedu-web-hpa created
# 查看HPA状态
[root@k8s-master ~]# kubectl get hpa -n fgedu-prod
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
fgedu-web-hpa Deployment/fgedu-web 5%/70%, 10%/80% 2 10 2 1m
# 查看HPA详情
[root@k8s-master ~]# kubectl describe hpa fgedu-web-hpa -n fgedu-prod
Name: fgedu-web-hpa
Namespace: fgedu-prod
Labels:
Annotations:
CreationTimestamp: Sat, 04 Apr 2026 18:00:00 +0800
Reference: Deployment/fgedu-web
Metrics: ( current / target )
resource cpu on pods (as a percentage of request): 5% (5m) / 70%
resource memory on pods (as a percentage of request): 10% (13Mi) / 80%
Min replicas: 2
Max replicas: 10
Deployment pods: 2 current / 2 desired
Conditions:
Type Status Reason Message
—- —— ——- ——-
AbleToScale True ScaleDownStabilized recent recommendations were higher than current one, applying the highest recent result
ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from cpu resource utilization (percentage of request)
ScalingLimited False DesiredWithinRange the desired count is within the acceptable range
Events:
Part03-压力测试验证
3.1 模拟负载
[root@k8s-master ~]# kubectl run -i –tty load-generator –rm –image=busybox –restart=Never — /bin/sh -c “while sleep 0.01; do wget -q学习交流加群风哥QQ113257174 -O- http://fgedu-web.fgedu-prod.svc.cluster.local; done”
If you don’t see a command prompt, try pressing enter.
# 另开终端查看HPA状态
[root@k8s-master ~]# kubectl get hpa -n fgedu-prod -w
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
fgedu-web-hpa Deployment/fgedu-web 5%/70% 2 10 2 5m
fgedu-web-hpa Deployment/fgedu-web 85%/70% 2 10 2 6m
fgedu-web-hpa Deployment/fgedu-web 85%/70% 2 10 4 6m
fgedu-web-hpa Deployment/fgedu-web 75%/70% 2 10 4 7m
fgedu-web-hpa Deployment/fgedu-web 72%/70% 2 10 6 7m
fgedu-web-hpa Deployment/fgedu-web 68%/70% 2 10 6 8m
# 查看Pod扩容情况
[root@k8s-master ~]# kubectl get pods -n fgedu-prod
NAME READY STATUS RESTARTS AGE
fgedu-web-abc12-xyz789 1/1 Running 0 10m
fgedu-web-abc12-abc12 1/1 Running 0 10m
fgedu-web-abc12-def34 1/1 Running 0 2m
fgedu-web-abc12-ghi56 1/1 Running 0 2m
fgedu-web-abc12-jkl78 1/1 Running 0 1m
fgedu-web-abc12-mno90 1/1 Running 0 1m
# 停止负载后查看缩容
[root@k8s-master ~]# kubectl get hpa -n fgedu-prod
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
fgedu-web-hpa Deployment/fgedu-web 5%/70% 2 10 2 20m
Part04-VPA配置
4.1 安装VPA
[root@k8s-master ~]# git clone https://github.com/kubernetes/autoscaler.git
Cloning into ‘autoscaler’…
remote: Enumerating objects: 12345, done.
remote: Counting objects: 100% (1234/1234), done.
remote: Compressing objects: 100% (567/567), done.
remote: Total 12345 (delta 667), reused 1111 (delta 555), pack-reused 11111
[root@k8s-master ~]# cd autoscaler/vertical-pod-autoscaler/hack
[root@k8s-master hack]# ./vpa-up.sh
Installing VPA…
customresourcedefinition.apiextensions.k8s.io/verticalpodautoscalers.autoscaling.k8s.io created
customresourcedefinition.apiextensions.k8s.io/verticalpodautoscalercheckpoints.autoscaling.k8s.io created
clusterrole.rbac.authorization.k8s.io/system:metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:vpa-actor created
clusterrole.rbac.authorization.k8s.io/system:vpa-checkpoint-actor created
clusterrole.rbac.authorization.k8s.io/system:vpa-target-reader created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-reader created
clusterrolebinding.rbac.authorization.k8s.io/system:vpa-actor created
clusterrolebinding.rbac.authorization.k8s.io/system:vpa-checkpoint-actor created
clusterrole.rbac.authorization.k8s.io/system:vpa-evictionter created
clusterrolebinding.rbac.authorization.k8s.io/system:vpa-evictionter-binding created
serviceaccount/vpa-admission-controller created
serviceaccount/vpa-recommender created
serviceaccount/vpa-updater created
clusterrole.rbac.authorization.k8s.io/system:vpa-admission-controller created
clusterrolebinding.rbac.authorization.k8s.io/system:vpa-admission-controller created
clusterrole.rbac.authorization.k8s.io/system:vpa-recommender created
clusterrolebinding.r学习交流加群风哥微信: itpux-combac.authorization.k8s.io/system:vpa-recommender created
clusterrole.rbac.authorization.k8s.io/system:vpa-updater created
clusterrolebinding.rbac.authorization.k8s.io/system:vpa-updater created
service/vpa-webhook created
deployment.apps/vpa-admission-controller created
deployment.apps/vpa-recommender created
deployment.apps/vpa-updater created
# 创建VPA
[root@k8s-master ~]# cat > fgedu-vpa.yaml << 'EOF'
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: fgedu-web-vpa
namespace: fgedu-prod
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment
name: fgedu-web
updatePolicy:
updateMode: "Auto"
resourcePolicy:
containerPolicies:
- containerName: nginx
minAllowed:
cpu: 50m
memory: 64Mi
maxAllowed:
cpu: 2
memory: 4Gi
controlledResources: ["cpu", "memory"]
EOF
[root@k8s-master ~]# kubectl apply -f fgedu-vpa.yaml
verticalpodautoscaler.autoscaling.k8s.io/fgedu-web-vpa created
# 查看VPA推荐
[root@k8s-master ~]# kubectl describe vpa fgedu-web-vpa -n fgedu-prod
Name: fgedu-web-vpa
Namespace: fgedu-prod
Spec:
Target Ref:
API Version: apps/v1
Kind: Deployment
Name: fgedu-web
Update Policy:
Update Mode: Auto
Status:
Conditions:
Last Transition Time: 2026-04-04T10:00:00Z
Status: True
Type: RecommendationProvided
Recommendation:
Container Recommendations:
Container Name: nginx
Lower Bound:
Cpu: 50m
Memory: 64Mi
Target:
Cpu: 150m
Memory: 200Mi
Uncapped Target:
Cpu: 150m
Memory: 200Mi
Upper Bound:
Cpu: 500m
Memory: 512Mi
- 合理设置扩缩容阈值
- 配置最小/最大副本数
- 监控扩缩容事件
- 测试验证扩缩容效果
- 结合VPA优化资源配置
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
