水平擴(kuò)展和伸縮
正值流量高峰期,如何快速添加一個(gè)或幾個(gè)web服務(wù)器呢?流量高峰期過去以后,又如何減少幾個(gè)web服務(wù)器呢?
假設(shè)目前只有兩臺(tái)服務(wù)器,一臺(tái)部署了web服務(wù)器,一臺(tái)部署了其他業(yè)務(wù),如何保證web服務(wù)器崩潰以后,還能夠提供web服務(wù)呢?
在本文中,tomcat服務(wù)指的是一個(gè)pod中只有一個(gè)tomcat容器,在kubernetes集群中,deployment對(duì)象就是用來做這樣一件事情。以tomcat服務(wù)為例子,deployment可以保證tomcat服務(wù)的個(gè)數(shù),集群中某一部署tomcat服務(wù)的服務(wù)器崩潰了,集群中tomcat服務(wù)的個(gè)數(shù)依然不變。
假設(shè),我們創(chuàng)建創(chuàng)建了一個(gè)要求tomcat的pod的個(gè)數(shù)為2的deployment對(duì)象。如下圖所示。此時(shí),kubernetes就會(huì)定時(shí)檢測集群中tomcat的pod的狀態(tài),比如pod中tomcat是否正常運(yùn)行,tomcat所在主機(jī)是否正常。然后根據(jù)返回的結(jié)果,進(jìn)行下一步操作。若woker1上的tomcat出現(xiàn)問題,則deployment就會(huì)在合適的節(jié)點(diǎn)上重新開啟一個(gè)tomcat的pod。(重新開啟的意思是將worker1上的tomcat的pod刪除,然后再worker3上新建一個(gè))

# 保持集群中tomcat的個(gè)數(shù)為2
# 集群環(huán)境 一個(gè)master兩個(gè)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 # 刪除一個(gè)tomcat的pod,看看集群中tomcat的pod個(gè)數(shù)
# kubectl get pods -o wide # 發(fā)現(xiàn)又有一個(gè)新的被創(chuàng)建了
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
滾動(dòng)更新
對(duì)于水平伸縮和擴(kuò)展的功能,replica set和replica controller就可以完成了(自行百度),而 deployment對(duì)象通過對(duì)replicat set上進(jìn)一步封裝,實(shí)現(xiàn)了滾動(dòng)更新的能力
上一個(gè)案例中,tomcat默認(rèn)拉取的是最新版本的鏡像,現(xiàn)在發(fā)現(xiàn)有漏洞,我們要立即將降低的tomcat的版本,該怎么辦呢?
我們可以幫deployment的yaml文件執(zhí)行kubectl delete -f deployment.yaml把tomcat服務(wù)給刪除,然后重現(xiàn)編寫舊版本的tomcat就可以了。所付出的代價(jià)就是稍微停止那么一下下web服務(wù)
現(xiàn)在要做的就是修改目前deployment中tomcat的版本,就可以完成下降tomcat的版本,對(duì)于用戶來說該訪問的web服務(wù)繼續(xù)可以訪問。
如下圖所示,在執(zhí)行滾動(dòng)更新的時(shí)候,worker上的tomcat由版本下降到tomcat:7x版本的時(shí)候(下降版本指的是將之前的pod給刪除掉,然后創(chuàng)建一個(gè)新的pod),此時(shí)所有對(duì)tomcat的請(qǐng)求都會(huì)由worker2上的來負(fù)責(zé)。當(dāng)worker2上的tomcat版本下降的時(shí)候,此時(shí)的請(qǐng)求又會(huì)由worker1上已經(jīng)更新后的tomcat負(fù)責(zé)。最后兩個(gè)tomcat都完成更新。

# 對(duì)上面的版本進(jìn)行更新
[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表示的是已經(jīng)完成更新的pod的數(shù)量,在本例子中為2則完成更新
# kubectl describe deployment tomcat-deployment
RollingUpdateStrategy: 25% max unavailable, 25% max surge # 這個(gè)字段表示更新的策略
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
# 發(fā)現(xiàn)deployment是對(duì)replica set對(duì)象做的操作
# 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
# 通過對(duì)pod的終止,然后創(chuàng)建新的tomcat鏡像的pod完成了更新操作
# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
tomcat-deployment 2/2 2 2 16m
# up-to-date字段為2表示目前已經(jīng)完成更新操作