k8s Deployment 升級(jí)應(yīng)用1
上一次我們分享到,如何去升級(jí)一個(gè) pod 的新的版本,相信在理論上,大家都知道可以如何做了,那么我們來進(jìn)行實(shí)踐一下,看看都會(huì)遇到哪些問題,以及操作起來是否便捷,感興趣的可以一起來體驗(yàn)一波
本來是可以使用 rolling-update 的方式
使用 rolling-update 的方式,其實(shí)對(duì)于 k8s 來說已經(jīng)是過時(shí)了的,但是我們還是要來了解和嘗試一下rolling-update 的方式 ,在這里我們先說一下為啥他會(huì)被淘汰
因?yàn)槭褂?rolling-update 的方式其實(shí)是會(huì)直接修改我們創(chuàng)建出來的對(duì)象的,這回導(dǎo)致直接更新 pod 和 RS 的標(biāo)簽,這種做法還是不太好,而且現(xiàn)在最新的 k8s 也不支持了
對(duì)于先刪除舊的,然后創(chuàng)建新的,這個(gè)方式比較簡(jiǎn)單,就是使用 RS 的擴(kuò)容和縮容拉實(shí)現(xiàn),之前的分享的事件案例中就有所涉及,我們可以再來溫習(xí)一遍
我們可以使用這兩種方式
RS 擴(kuò)縮容的方式
deployment
RS 擴(kuò)縮容的方式
創(chuàng)建必備基本環(huán)境
寫一個(gè)應(yīng)用程序,可以標(biāo)識(shí)版本
app.js
const?http?=?require('http');
const?os?=?require('os');
console.log("xmt?kubia?server?starting...");
var?handler?=?function(request,?response){
????console.log("received?request?from?"?+?request.connection.remoteAddress);
????response.writeHead(200);
????response.end("you've?hit?xmt?web??"?+?os.hostname()?+?"version?is?v1"??"\n");
};
var?www?=?http.createServer(handler);
www.listen(8080);
自己可以繼續(xù)復(fù)用之前的一個(gè)小應(yīng)用,簡(jiǎn)單的 http 請(qǐng)求,訪問應(yīng)用的 8080 端口后,應(yīng)用會(huì)給客戶端 pod 的 名字和 版本號(hào) v1
做一個(gè)鏡像
Dockerfile
FROM?node:7
ADD?app.js?/app.js
ENTRYPOINT?["node",?"app.js"]
我們將上述的小應(yīng)用加入到 Dockerfile 中,直接運(yùn)行即可
docker?build?-t?xiaomotong888/newkubia:v1
docker?push?xiaomotong888/newkubia:v1
寫 yaml ,創(chuàng)建 RS,Service,Pod
mynewkubia.yaml
apiVersion:?v1
kind:?Service
metadata:
??name:?newkubia-service
spec:
??type:?NodePort
??selector:
????app:?newkubia
??ports:
??-?port:?80
????targetPort:?8080
---
apiVersion:?apps/v1
kind:?ReplicaSet
metadata:
??name:?newkubia-rs
spec:
??replicas:?3
??selector:
????matchLabels:
??????app:?newkubia
??template:
????metadata:
??????labels:
????????app:?newkubia
????spec:
??????containers:
??????-?name:?newkubia
????????image:?xiaomotong888/newkubia:v1
????????ports:
????????-?containerPort:?8080
創(chuàng)建一個(gè) SVC 和 RS,可以放在同一個(gè) yaml 文件中一起部署,我們只需要用 ---
隔開即可
使用 kubectl create -f ?mynewkubia.yaml
即可創(chuàng)建出 RS ,SVC 和 POD
此處的 SVC 本來是想模擬 LoadBalancer 的,但是我使用的是 minikube ,沒有辦法使用 LoadBalancer,不過我可以使用 NodePort 的類型

我們可以進(jìn)入任意一個(gè) pod ,是用 curl 命令訪問 服務(wù)的地址(svc),我們可以看到如下效果

能夠看到訪問此時(shí)的服務(wù)打印出來的消息是 v1 版本的,沒有毛病
開始創(chuàng)建一個(gè)新的 RS2,將流量切換到新的 Pod 中
這個(gè)時(shí)候,我們來創(chuàng)建另外一個(gè) RS2,然后通過修改標(biāo)簽的方式,來將 Service 的流量切換到新的 pod 中
具體的 yaml 內(nèi)容 和上述的 RS yaml 內(nèi)容一致,我們只需要將對(duì)應(yīng)的地方修改為 newkubia-rs-2 ?即可,不要和之前創(chuàng)建的 ?RS 沖突了,標(biāo)簽也要一起修改
kubectl create
對(duì)應(yīng)的 yaml 文件之后 ,我們?cè)谶M(jìn)入到 對(duì)應(yīng)的 SVC 修改 標(biāo)簽

這個(gè)時(shí)候我們?cè)賮聿榭匆幌铝髁渴欠裾娴臅?huì)去切換到 pod v2 版本上
我們?nèi)匀豢梢允褂猛瑯拥姆绞?,找到任意一個(gè) pod ,進(jìn)入到容器,通過 curl 命令訪問 svc 的地址,查看日志給我們輸出的是什么效果

通過查看效果響應(yīng)的是 v2 版本的,我們可以知道,Service 的流量確實(shí)且到了新的 pod , 對(duì)應(yīng)這個(gè)請(qǐng)求的路徑是這個(gè)樣子的:

這個(gè)圖,我們?cè)诜窒?Service 的時(shí)候,也有體現(xiàn)。
今天就到這里,學(xué)習(xí)所得,若有偏差,還請(qǐng)斧正
歡迎點(diǎn)贊,關(guān)注,收藏
朋友們,你的支持和鼓勵(lì),是我堅(jiān)持分享,提高質(zhì)量的動(dòng)力

好了,本次就到這里
技術(shù)是開放的,我們的心態(tài),更應(yīng)是開放的。擁抱變化,向陽而生,努力向前行。
我是阿兵云原生,歡迎點(diǎn)贊關(guān)注收藏,下次見~