水平扩展和伸缩
正值流量高峰期,如何快速添加一个或几个web服务器呢?流量高峰期过去以后,又如何减少几个web服务器呢?
假设目前只有两台服务器,一台部署了web服务器,一台部署了其他业务,如何保证web服务器崩溃以后,还能够提供web服务呢?
在本文中,tomcat服务指的是一个pod中只有一个tomcat容器,在kubernetes集群中,deployment对象就是用来做这样一件事情。以tomcat服务为例子,deployment可以保证tomcat服务的个数,集群中某一部署tomcat服务的服务器崩溃了,集群中tomcat服务的个数依然不变。
假设,我们创建创建了一个要求tomcat的pod的个数为2的deployment对象。如下图所示。此时,kubernetes就会定时检测集群中tomcat的pod的状态,比如pod中tomcat是否正常运行,tomcat所在主机是否正常。然后根据返回的结果,进行下一步操作。若woker1上的tomcat出现问题,则deployment就会在合适的节点上重新开启一个tomcat的pod。(重新开启的意思是将worker1上的tomcat的pod删除,然后再worker3上新建一个)
# 保持集群中tomcat的个数为2
# 集群环境 一个master两个worker
[root@master deployment]# cat deployment1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-deployment
labels:
app: tomcat
spec:
replicas: 2
selector:
matchLabels:
app: deployment-tomcat
template:
metadata:
labels:
app: deployment-tomcat
spec:
containers:
- name: tomcat
image: tomcat
ports:
- containerPort: 8080
# kubectl get deployments -o wide
NAME READY UP-TO-DATE AVAILABLE
tomcat-deployment 2/2 2 2
# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
tomcat-deployment-74d7b749f7-tvszz 1/1 Running 0 2m4s 10.44.0.32 worker1
tomcat-deployment-74d7b749f7-cjnt8 1/1 Running 0 2m4s 10.36.0.2 compute1
# kubectl delete pod tomcat-deployment-74d7b749f7-tvszz # 删除一个tomcat的pod,看看集群中tomcat的pod个数
# kubectl get pods -o wide # 发现又有一个新的被创建了
NAME READY STATUS RESTARTS AGE IP NODE
tomcat-deployment-74d7b749f7-n7mtb 1/1 Running 0 4m49s 10.44.0.32 worker1
tomcat-deployment-74d7b749f7-cjnt8 1/1 Running 0 2m4s 10.36.0.2 compute1
滚动更新
对于水平伸缩和扩展的功能,replica set和replica controller就可以完成了(自行百度),而 deployment对象通过对replicat set上进一步封装,实现了滚动更新的能力
上一个案例中,tomcat默认拉取的是最新版本的镜像,现在发现有漏洞,我们要立即将降低的tomcat的版本,该怎么办呢?
我们可以帮deployment的yaml文件执行kubectl delete -f deployment.yaml把tomcat服务给删除,然后重现编写旧版本的tomcat就可以了。所付出的代价就是稍微停止那么一下下web服务
现在要做的就是修改目前deployment中tomcat的版本,就可以完成下降tomcat的版本,对于用户来说该访问的web服务继续可以访问。
如下图所示,在执行滚动更新的时候,worker上的tomcat由版本下降到tomcat:7x版本的时候(下降版本指的是将之前的pod给删除掉,然后创建一个新的pod),此时所有对tomcat的请求都会由worker2上的来负责。当worker2上的tomcat版本下降的时候,此时的请求又会由worker1上已经更新后的tomcat负责。最后两个tomcat都完成更新。
# 对上面的版本进行更新
[root@master deployment]# cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-deployment
labels:
app: tomcat
spec:
replicas: 2
selector:
matchLabels:
app: deployment-tomcat
template:
metadata:
labels:
app: deployment-tomcat
spec:
containers:
- name: tomcat
image: tomcat:7.0.92
ports:
- containerPort: 8080
# kubectl apply -f deployment3.yaml
deployment.apps/tomcat-deployment configured
[root@master deployment]# kubectl get deployment -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
tomcat-deployment 2/2 1 2 14m tomcat tomcat:7.0.92 app=deployment-tomcat
# 可以看到UP-TO-DATE字段为1表示的是已经完成更新的pod的数量,在本例子中为2则完成更新
# kubectl describe deployment tomcat-deployment
RollingUpdateStrategy: 25% max unavailable, 25% max surge # 这个字段表示更新的策略
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 14m deployment-controller Scaled up replica set tomcat-deployment-74d7b749f7 to 2
Normal ScalingReplicaSet 38s deployment-controller Scaled up replica set tomcat-deployment-785f4d6fc9 to 1
Normal ScalingReplicaSet 3s deployment-controller Scaled down replica set tomcat-deployment-74d7b749f7 to 1
Normal ScalingReplicaSet 3s deployment-controller Scaled up replica set tomcat-deployment-785f4d6fc9 to 2
# 发现deployment是对replica set对象做的操作
# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
tomcat-deployment-74d7b749f7-r9db4 0/1 Terminating 0 14m 10.36.0.2 compute1
tomcat-deployment-785f4d6fc9-77hzb 1/1 Running 0 17s 10.44.0.32 worker1
tomcat-deployment-785f4d6fc9-nzfds 1/1 Running 0 52s 10.36.0.4 compute1
# kubectl describe pod tomcat-deployment-785f4d6fc9-77hzb
Image: tomcat:7.0.92
# 通过对pod的终止,然后创建新的tomcat镜像的pod完成了更新操作
# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
tomcat-deployment 2/2 2 2 16m
# up-to-date字段为2表示目前已经完成更新操作