2.4.4 扩容和缩容
前面示例中创建的 Deployment 对象 myapp 仅创建了一个 Pod 对象,其所能够承载的访问请求数量仅受限与这单个 Pod 对象的服务容量。请求流量上升到接近或超过其容量之前,用户可以通过 kubernetes 的“扩容机制”来扩展Pod的副本数量,从而提升其服务容量。
简单来说,所谓的“伸缩”(Scaling)就是指改变特定控制器上Pod副本数量的操作,“扩容”(scaling up)即为增加副本数量,而“缩容”(scaling down)则意指缩减副本数量。不过,无论是扩容还是缩容,其数量都需要用户明确给出。
Service 对象内建的复杂均衡机制可在其后端副本数不止一个时自动进行流量分发,它还会自动监控关联到的Pod的健康状态,以确保仅将请求流量分发至可用的后端Pod对象。若某 Deployment 控制器管理包含多个 Pod 实例,则必要时用户还可以为其使用“滚动更新”机制将其容器镜像升级到新的版本或变更那些支持动态修改的Pod属性。
使用 kubectl run 命令创建 Deployment 对象时,“--replicas=”选项能够指定由该对象创建或管理的Pod对象副本的数量,且其数量支持运行时进行修改,并立即生效。“kubectl scale”命令就是专用于变动控制器应用规模的命令,它支持对 Deployment 资源对象的扩容和缩容操作。例如,如果要将 myapp 的 Pod 副本数量扩展为3个,则可以使用如下命令来完成:
**[terminal]
**[delimiter $ ]**[command kubectl scale deployments/myapp --replicas=3]
deployment.extensions/myapp scaled
而后列出有 myapp 创建的 Pod 副本,确认其扩展操作的完成状态。如下命令显示出其Pod副本数量已经扩增至3个,其中包括此前的 myapp-5c647497bf-9km8t:
**[terminal]
**[delimiter $ ]**[command kubectl get pods -l run=myapp]
NAME READY STATUS RESTARTS AGE
myapp-5c647497bf-9km8t 1/1 Running 0 23h
myapp-5c647497bf-ksg4f 1/1 Running 0 3m6s
myapp-5c647497bf-ncjrq 1/1 Running 0 3m6s
Deployment 对象 myapp 规模扩展完成之后,default 名称空间中的资源对象及其关联关系如图 2-13 所示:
而后由“kubectl describe deployment” 命令打印 Deployment 对象 myapp 的详细信息,了解其应用规模的的变动及当前Pod副本的状态等相关信息。从下面的命令结果可以看出,其Pod副本数量的各项指标都已经转换到了新的目标数量,而其事件信息中也有相应的事件显示其扩增操作已成功完成:
**[terminal]
**[delimiter $ ]**[command kubectl describe deployments/myapp]
Name: myapp
Namespace: default
CreationTimestamp: Wed, 27 Nov 2019 14:38:42 +0800
Labels: run=myapp
Annotations: deployment.kubernetes.io/revision: 1
Selector: run=myapp
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: run=myapp
Containers:
myapp:
Image: ikubernetes/myapp:v1
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Progressing True NewReplicaSetAvailable
Available True MinimumReplicasAvailable
OldReplicaSets: <none>
NewReplicaSet: myapp-5c647497bf (3/3 replicas created)
Events: <none>
由 myapp 自动创建的Pod资源全部都拥有同一个标签选择器“run=myapp”,因此,前面创建的Service资源对象myapp的后端端点也已经通过标签选择器自动扩展到了这3个Pod对象相关的端点,如下面的命令结果及图2-13所示:
**[terminal]
**[delimiter $ ]**[command kubectl describe services/myapp]
Name: myapp
Namespace: default
Labels: run=myapp
Annotations: <none>
Selector: run=myapp
Type: NodePort
IP: 10.101.202.124
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 32204/TCP
Endpoints: 10.244.2.4:80,10.244.3.3:80,172.17.0.2:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
回到此前创建的客户端Pod对象Client的交互式接口,对Service对象myapp反复发起测试请求,即可验证其负载均衡的效果。由如下命令及其结果可以看出,它会将请求调度至后端的各Pod对象进行处理:
**[terminal]
**[delimiter $ ]**[command kubectl run client --image=busybox --restart=Never -it -- /bin/sh]
If you don't see a command prompt, try pressing enter.
/ # while true; do wget -O - -q http://myapp.default:80/hostname.html; sleep 1; done
......
myapp-5c647497bf-9km8t
myapp-5c647497bf-ncjrq
myapp-5c647497bf-ksg4f
......
应用规模缩容的方式与扩容相似,只不过是将Pod副本的数量调至比原来小的数字即可。例如,将 myapp 的 Pod 副本缩减至2个,可以使用如下命令进行:
**[terminal]
**[delimiter $ ]**[command kubectl scale deployments/myapp --replicas=2]
deployment.extensions/myapp scaled
至此,功能基本完整的容器化应用已在 Kubernetes 上部署完成,即便是一个略复杂的分层应用也只需要通过合适的镜像以类似的方式就能完成部署。