Kubernetes应用的扩展与收缩
📋 概述
在Kubernetes中,您可以通过调整Deployment中的副本数量来轻松扩展应用程序实例。本文将向您展示如何手动扩展应用程序实例,并使用负载均衡器将流量分发到所有Pod。
🔧 先决条件
在开始之前,请确保:
-
已完成之前教程中的步骤,创建了
kubernetes-bootcampDeployment -
已创建一个类型为
LoadBalancer的服务(如果没有,请运行以下命令):kubectl expose deployment/kubernetes-bootcamp --type="LoadBalancer" --port 8080
📊 扩展工作原理
核心概念
-
副本(Replicas):在Deployment中运行的应用程序实例数量
-
自动扩缩:Kubernetes还支持Pod自动扩缩,但本教程仅涵盖手动扩缩
-
负载均衡:Service会自动将流量均匀分发到所有可用的Pod
-
端点监控:Service持续监控Pod健康状态,确保流量仅发送到可用的Pod
扩展优势
-
处理流量增加:通过增加实例数量来满足用户需求
-
高可用性:多个实例确保部分故障不会影响整体服务
-
无缝更新:运行多个实例后,可以进行滚动更新而无需停机
🚀 扩展应用实例
1. 查看当前Deployment状态
kubectl get deployments
输出示例:
ccc@cccs-MBP ~ % kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE kubernetes-bootcamp 1/1 1 1 168m ccc@cccs-MBP ~ %
列说明:
-
READY:当前副本数/期望副本数
-
UP-TO-DATE:已更新到期望状态的副本数
-
AVAILABLE:用户可用的副本数
-
AGE:应用运行时长
2. 查看ReplicaSet
kubectl get rs
ReplicaSet名称格式为:[DEPLOYMENT-NAME]-[RANDOM-STRING]
ccc@cccs-MBP ~ % kubectl get rs
NAME DESIRED CURRENT READY AGE
kubernetes-bootcamp-75c5d958ff 1 1 1 170m
ccc@cccs-MBP ~ %
3. 扩展到4个副本
kubectl scale deployments/kubernetes-bootcamp --replicas=4
ccc@cccs-MBP ~ % kubectl scale deployments/kubernetes-bootcamp --replicas=4
deployment.apps/kubernetes-bootcamp scaled
ccc@cccs-MBP ~ %
4. 验证扩展结果
kubectl get deployments
kubectl get pods -o wide
ccc@cccs-MBP ~ % kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 4/4 4 4 171m
ccc@cccs-MBP ~ % kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kubernetes-bootcamp-75c5d958ff-8jz9t 1/1 Running 0 102s 10.1.0.20 docker-desktop <none> <none>
kubernetes-bootcamp-75c5d958ff-flfdd 1/1 Running 0 172m 10.1.0.17 docker-desktop <none> <none>
kubernetes-bootcamp-75c5d958ff-rzfjt 1/1 Running 0 103s 10.1.0.19 docker-desktop <none> <none>
kubernetes-bootcamp-75c5d958ff-wzbdr 1/1 Running 0 102s 10.1.0.18 docker-desktop <none> <none>
ccc@cccs-MBP ~ %
现在应该有4个Pod运行,每个都有不同的IP地址。
5. 查看详细事件
kubectl describe deployments/kubernetes-bootcamp
ccc@cccs-MBP ~ % kubectl describe deployments/kubernetes-bootcamp
Name: kubernetes-bootcamp
Namespace: default
CreationTimestamp: Fri, 30 Jan 2026 09:18:24 +0800
Labels: app=kubernetes-bootcamp
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=kubernetes-bootcamp
Replicas: 4 desired | 4 updated | 4 total | 4 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=kubernetes-bootcamp
Containers:
kubernetes-bootcamp:
Image: gcr.io/google-samples/kubernetes-bootcamp:v1
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Progressing True NewReplicaSetAvailable
Available True MinimumReplicasAvailable
OldReplicaSets: <none>
NewReplicaSet: kubernetes-bootcamp-75c5d958ff (4/4 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 2m46s deployment-controller Scaled up replica set kubernetes-bootcamp-75c5d958ff to 4 from 1
ccc@cccs-MBP ~ %
查看输出中显示的副本数量变化。
⚖️ 负载均衡验证
1. 获取服务信息
kubectl describe services/kubernetes-bootcamp
ccc@cccs-MBP ~ % kubectl describe services/kubernetes-bootcamp
Name: kubernetes-bootcamp
Namespace: default
Labels: app=kubernetes-bootcamp
Annotations: <none>
Selector: app=kubernetes-bootcamp
Type: LoadBalancer
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.98.179.76
IPs: 10.98.179.76
LoadBalancer Ingress: localhost
Port: <unset> 8080/TCP
TargetPort: 8080/TCP
NodePort: <unset> 31450/TCP
Endpoints: 10.1.0.17:8080,10.1.0.18:8080,10.1.0.19:8080 + 1 more...
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
ccc@cccs-MBP ~ %
2. 设置环境变量
export NODE_PORT="$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')"
echo NODE_PORT=$NODE_PORT
ccc@cccs-MBP ~ % export NODE_PORT="$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')"
echo NODE_PORT=$NODE_PORT
NODE_PORT=31450
ccc@cccs-MBP ~ %
3. 测试负载均衡
多次运行以下命令:
curl http://localhost:8080
每次请求会命中不同的Pod:
ccc@cccs-MBP ~ % curl http://localhost:8080
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-75c5d958ff-flfdd | v=1
ccc@cccs-MBP ~ % curl http://localhost:8080
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-75c5d958ff-8jz9t | v=1
ccc@cccs-MBP ~ % curl http://localhost:8080
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-75c5d958ff-rzfjt | v=1
ccc@cccs-MBP ~ % curl http://localhost:8080
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-75c5d958ff-flfdd | v=1
ccc@cccs-MBP ~ % curl http://localhost:8080
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-75c5d958ff-wzbdr | v=1
ccc@cccs-MBP ~ %
📉 缩减应用实例
1. 缩减到2个副本
kubectl scale deployments/kubernetes-bootcamp --replicas=2
ccc@cccs-MBP ~ % kubectl scale deployments/kubernetes-bootcamp --replicas=2
deployment.apps/kubernetes-bootcamp scaled
2. 验证缩减结果
kubectl get deployments
kubectl get pods -o wide
ccc@cccs-MBP ~ % kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 2/2 2 2 179m
ccc@cccs-MBP ~ % kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kubernetes-bootcamp-75c5d958ff-8jz9t 1/1 Terminating 0 8m56s 10.1.0.20 docker-desktop <none> <none>
kubernetes-bootcamp-75c5d958ff-flfdd 1/1 Running 0 3h 10.1.0.17 docker-desktop <none> <none>
kubernetes-bootcamp-75c5d958ff-rzfjt 1/1 Terminating 0 8m57s 10.1.0.19 docker-desktop <none> <none>
kubernetes-bootcamp-75c5d958ff-wzbdr 1/1 Running 0 8m56s 10.1.0.18 docker-desktop <none> <none>
ccc@cccs-MBP ~ %
确认Pod数量已减少到2个。
📈 扩展相关操作总结
| 操作 | 命令 | 说明 |
|---|---|---|
| 查看Deployment | kubectl get deployments |
查看所有部署状态 |
| 查看Pod详情 | kubectl get pods -o wide |
查看Pod详细信息 |
| 扩展副本数 | kubectl scale deployments/[NAME] --replicas=[NUM] |
增加或减少副本 |
| 查看事件 | kubectl describe deployments/[NAME] |
查看部署详细事件 |
| 测试负载均衡 | curl http://$(minikube ip):$NODE_PORT |
验证流量分发 |