我建議你別基于k8s用寫應(yīng)用 No.178
最近一個(gè)月大蕉斷更了,主要就在做一些跟 k8s 相關(guān)的事情,就在昨天剛剛交付產(chǎn)品了一個(gè)版本,這幾周幾乎把大蕉榨干了。但是大蕉從來不是一個(gè)怕事的人,干就完了,一個(gè)當(dāng)十個(gè)用,沒什么大問題。
但是經(jīng)過了幾個(gè)月基于k8s寫應(yīng)用,我還是建議你別輕易嘗試用 k8s ,這時(shí)候就有人問了,我看你前幾個(gè)月還叫我們沒事多學(xué)學(xué) k8s 呢,為什么今天就說輕易別基于 k8s 寫應(yīng)用呢?
且聽我細(xì)細(xì)說來。
基于 Docker 定義運(yùn)行環(huán)境實(shí)在是太方便了,你可能沒法像以前一樣有一大堆的發(fā)布腳本排查發(fā)布環(huán)境的問題了。
這樣線上環(huán)境太穩(wěn)定,可能會(huì)裁剪一部分的開發(fā)運(yùn)維人員。對(duì)于一個(gè) Python 應(yīng)用來說,以前我們需要安裝 Linux,安裝Python,安裝 pip,安裝相關(guān)的依賴庫(kù)。可是對(duì)于 Docker 鏡像定義方式 Dockerfile 來說。
- FROM python:3
- RUN pip install MySQL-python
這兩行,Python 環(huán)境 和 MySQL 依賴就裝好了,已經(jīng)不需要害怕每個(gè)人的環(huán)境不一樣,不需要害怕線上環(huán)境被誰(shuí)搞壞了。運(yùn)維可能會(huì)失業(yè)。
應(yīng)用升級(jí)和回滾真的太方便了,你可能沒法像以前一樣搞一大堆的發(fā)布步驟。
加一個(gè)配置文件,換一個(gè)依賴包,升級(jí)一下linux內(nèi)核版本,還要兼容一下。搞得每次發(fā)布都能由你自己搞。有了 k8s 你已經(jīng)沒這個(gè)機(jī)會(huì)了。這樣你的價(jià)值會(huì)大大縮水。用 k8s 升級(jí)只需要這一行就夠了。
- kubectl set image deployment your-app your-container=image:tag
這樣 k8s 集群會(huì)對(duì)你的應(yīng)用進(jìn)行滾動(dòng)升級(jí),你不需要害怕升級(jí)的時(shí)候因?yàn)橥瑫r(shí)重啟的問題導(dǎo)致服務(wù)不可用,它都幫你解決了。它升級(jí)的做法是先啟動(dòng)一個(gè)容器,確認(rèn)這個(gè)容器正常服務(wù)了,再干掉原來的容器。
當(dāng)然,發(fā)布出問題也是很常見的,以前的回滾要找發(fā)布包,回滾依賴,一堆事情做。現(xiàn)在有了 k8s ,回滾也變得簡(jiǎn)單起來。
- kubectl rollout undo deployment/your-app
回滾的步驟跟升級(jí)是一樣的,會(huì)先啟動(dòng)原來鏡像版本的容器,然后再干掉現(xiàn)在版本的容器。這一波操作,會(huì)導(dǎo)致你的存在感降低,你無法在發(fā)布的時(shí)候進(jìn)行一頓瘋狂操作了,很可惜,你很可能會(huì)被優(yōu)化掉。
服務(wù)間暴露和調(diào)用真的太方便了,只能由你解決的調(diào)用 bug 可能一去不復(fù)返了。
想想這個(gè)場(chǎng)景,一個(gè)新人加入團(tuán)隊(duì),面對(duì)代碼里一堆的根據(jù) ip 調(diào)用的邏輯,這個(gè)新人能怎么辦呢?必然只能問你啊,這個(gè) ip 是什么,另外一個(gè) ip 又是什么?k8s 自帶名字服務(wù)和負(fù)載均衡,如果只是在集群內(nèi)調(diào)用,你終于不需要再用 ip + 端口的模式調(diào)用集群內(nèi)的其他服務(wù)了,無論是 RPC 還是 HTTP 調(diào)用,都需要ip + 端口吧?很遺憾 k8s 集群默認(rèn)并不會(huì)給你分配任何一個(gè)固定 ip 和端口,所有的 ip 和 端口都是動(dòng)態(tài)分配的,你已經(jīng)不能使用 ip 大法了。那么 k8s 是怎么做到的呢?
首先要明確一個(gè) k8s 的 label 機(jī)制。我們俗稱 label 名字叫 打標(biāo)簽,就是我會(huì)給我的應(yīng)用(Deployment)打上一些標(biāo)簽,比如打一個(gè)標(biāo)簽名叫 app=my-app ,這個(gè)就類似給驢的腳底打上三顆痣。然后我再定義一個(gè) Service ,不管這個(gè)應(yīng)用長(zhǎng)啥樣,也不管它在哪里,只需要找標(biāo)簽為 app=my-app 的應(yīng)用就完事了,就是說,無論你是剃光頭還是留胡子,我都不管,我就找三顆痣,找到了你就是我的寵物。
很多很多的 magic ,等你你來發(fā)現(xiàn),且聽我細(xì)細(xì)說,如果你對(duì) k8s 有興趣,留言告訴我,我考慮寫個(gè)實(shí)戰(zhàn)系列。
如果你是靠各種邪術(shù)寫魔法代碼混職場(chǎng)的,我強(qiáng)烈建議你千萬別用 k8s ,你很可能會(huì)混不下去。