原文地址:https://kubernetes.io/docs/tutorials/kubernetes-basics/deploy-intro/
目標(biāo)
- 學(xué)習(xí)應(yīng)用部署
- 使用kubectl在kubernetes上部署第一個(gè)應(yīng)用
Kubernetes部署
一旦有了一個(gè)運(yùn)行中Kubernetes集群澄成,你可以在上面部署你的容器化后的應(yīng)用。為此倚喂,你需要?jiǎng)?chuàng)建一個(gè)k8s Deployment配置項(xiàng)斋泄。Deployment指明Kubernetes如何去創(chuàng)建和升級(jí)應(yīng)用的實(shí)例杯瞻。一旦創(chuàng)建了一個(gè)Deployment,kuberneters主線程調(diào)度涉及到的應(yīng)用實(shí)例到集群中的獨(dú)立Nodes炫掐。
一旦應(yīng)用實(shí)例創(chuàng)建了魁莉,一個(gè)Kubernetes Deployment Controller會(huì)持續(xù)管理這些實(shí)例。如果Node托管的實(shí)例掛掉了或者被被刪除了募胃,Deployment controller會(huì)取代它旗唁。這是k8s的一個(gè)自我修復(fù)機(jī)制來解決機(jī)器故障或者維護(hù)問題。
在一個(gè)前-編排(orchestration)世界痹束,安裝腳本經(jīng)常用來啟動(dòng)應(yīng)用逆皮,但是他們不允許從故障的機(jī)器中恢復(fù)回來,也就是沒有自我恢復(fù)機(jī)制参袱。通過既創(chuàng)建應(yīng)用實(shí)例又讓它們跨節(jié)點(diǎn)運(yùn)行电谣,Kubernetes部署提供了一個(gè)完全不同的應(yīng)用部署的方式。
總結(jié):
- Deployments
- Kubectl
一個(gè)Deployment負(fù)責(zé)創(chuàng)建和升級(jí)應(yīng)用實(shí)例抹蚀。
在Kubernetes上部署你的第一個(gè)app
你可以通過使用命令行接口Kubectl創(chuàng)建和管理一個(gè)Deployment.Kubectl使用Kubernetes API與集群進(jìn)行交互盲再。在這個(gè)單元里方庭,你將學(xué)習(xí)最常用的Kubectl用來創(chuàng)建Deployments從而在Kubernetes集群上運(yùn)行你的應(yīng)用的命令行。
當(dāng)你創(chuàng)建了一個(gè)Deployment,你需要為應(yīng)用程序指定容器圖像和你想運(yùn)行的副本的個(gè)數(shù)放闺。通過升級(jí)Deployment你能夠改變那個(gè)信息;集訓(xùn)的單元5和6將討論如何scale和升級(jí)你的Deployments.
為了部署應(yīng)用到Kubernetes上谷饿,應(yīng)用需要被打包成一種被支持的容器格式未荒。
對(duì)于我們的第一次部署,我們將部署Node.js應(yīng)用到Docker容器上接箫。源代碼和Dockerfile在Kubernetes集訓(xùn)的Github respository上攒读。
現(xiàn)在你知道Deployments是什么了,讓我們進(jìn)入在線教程并且部署你的第一個(gè)app吧辛友!
kubectl basics基礎(chǔ)
kubectl命名的格式是:kubectl + 動(dòng)作 + 資源
動(dòng)作包括create,describe等薄扁,資源則包括node,container剪返。可以在命令后加上--help查看額外的信息邓梅。例如脱盲,kubectl get nodes --help。
檢查kubectl版本:kubectl version
Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.0", GitCommit:"925c127ec6b946659ad0fd596fa959be43f0cc05", GitTreeState:"clean", BuildDate:"2017-12-15T21:07:38Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"", Minor:"", GitVersion:"v1.9.0", GitCommit:"925c127ec6b946659ad0fd596fa959be43f0cc05", GitTreeState:"clean", BuildDate:"2018-01-26T19:04:38Z", GoVersion:"go1.9.1", Compiler:"gc", Platform:"linux/amd64"}
查看集群中的節(jié)點(diǎn)數(shù):kubectl get nodes
NAME STATUS ROLES AGE VERSION
host01 Ready <none> 5m v1.9.0
k8s將基于可用的節(jié)點(diǎn)資源來選擇應(yīng)用的部署位置日缨。
部署我們的app
讓我們使用kubectl run
命令來運(yùn)行我們第一個(gè)應(yīng)用钱反。run
命令創(chuàng)建了一個(gè)新的部署。我們需要提供:部署名字和應(yīng)用的圖像位置(包括在Docker hub外的完整的的repository網(wǎng)址)匣距。我們想在某個(gè)特定端口運(yùn)行應(yīng)用的話面哥,需要加上--port
參數(shù)。
kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --port=8080
deployment "kubernetes-bootcamp" created
太棒了墨礁,你通過創(chuàng)建了一個(gè)部署成功部署了我們的第一個(gè)應(yīng)用程序幢竹。
上面的命令包含了以下的事情:
- 搜索一個(gè)可用節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)可以運(yùn)行應(yīng)用實(shí)例
- 調(diào)度應(yīng)用到那個(gè)節(jié)點(diǎn)
- 配置集群在必要時(shí)重新調(diào)度實(shí)例到新的節(jié)點(diǎn)
列舉Deployments:kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 1 1 1 1 5m
應(yīng)用實(shí)例運(yùn)行在你的節(jié)點(diǎn)Docker容器中恩静。
查看我們的應(yīng)用
在Kubernetes內(nèi)部運(yùn)行的Pods運(yùn)行在一個(gè)私有的焕毫,獨(dú)立的網(wǎng)絡(luò)。默認(rèn)情況下驶乾,同一個(gè)k8s集群下的其他pod和service之間是可見的邑飒,但是在網(wǎng)絡(luò)外是不可見的。當(dāng)我們使用kubectl级乐,我們通過API端點(diǎn)與我們的應(yīng)用程序進(jìn)行通信疙咸。
我們將在第四單元涵蓋在k8s集群外如何暴露應(yīng)用的其他選項(xiàng)。
kubectl命名能創(chuàng)建一個(gè)代理风科,這個(gè)代理可以在我們的集群范圍內(nèi)的撒轮,私有的網(wǎng)絡(luò)空間內(nèi)轉(zhuǎn)發(fā)通信。代理可以通過CTRL+C的方式終止贼穆,而且在運(yùn)行時(shí)不會(huì)有任何輸出题山。
我們將開啟第二個(gè)終端窗口去運(yùn)行代理。
kubectl proxy
我們現(xiàn)在有了一個(gè)主機(jī)與k8s集群之間的連接故痊。代理可以直接從這些終端獲取到API的權(quán)限顶瞳。
通過代理端口,你能看到所有的主機(jī)API愕秫,從http://localhost:8001可以看到所有慨菱。例如,我們能直接通過curl命令通過API查詢版本戴甩。
curl http://localhost:8001/version
stdout:
{
"major": "",
"minor": "",
"gitVersion": "v1.9.0",
"gitCommit": "925c127ec6b946659ad0fd596fa959be43f0cc05",
"gitTreeState": "clean",
"buildDate": "2018-01-26T19:04:38Z",
"goVersion": "go1.9.1",
"compiler": "gc",
"platform": "linux/amd64"
}
API服務(wù)器可以自動(dòng)為每個(gè)pod創(chuàng)建一個(gè)尾端點(diǎn)符喝,基于pod名字,這通過代理同樣是可行的等恐。
首先我們需要獲取到Pod的名字洲劣,然后將其存儲(chǔ)到環(huán)境變量POD_NAME中备蚓。
export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
echo Name of the Pod: $POD_NAME
stdout:
Name of the Pod: kubernetes-bootcamp-5dbf48f7d4-s5xwx
現(xiàn)在我們可以通過運(yùn)行在那個(gè)POD的應(yīng)用程序創(chuàng)建一個(gè)HTTP請(qǐng)求了课蔬。
curl http://localhost:8001/api/v1/proxy/namespace/default/pods/$POD_NAME
stdout:
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5dbf48f7d4-s5xwx | v=1
這個(gè)url是Pod的API的路由囱稽。
注意:檢查終端的頂部。代理運(yùn)行在一個(gè)新的tab上二跋,而且最近的命令還在源tab上執(zhí)行战惊。代理仍然運(yùn)行在第二個(gè)tab,而且這也允許我們的curl命令能夠運(yùn)行在localhost:8001.
期待和大家交流扎即,共同進(jìn)步吞获,歡迎大家加入我創(chuàng)建的與前端開發(fā)密切相關(guān)的技術(shù)討論小組:
- SegmentFault技術(shù)圈:ES新規(guī)范語法糖
- SegmentFault專欄:趁你還年輕,做個(gè)優(yōu)秀的前端工程師
- 知乎專欄:趁你還年輕谚鄙,做個(gè)優(yōu)秀的前端工程師
- Github博客: 趁你還年輕233的個(gè)人博客
- 前端開發(fā)QQ群:660634678
微信公眾號(hào): 人獸鬼 / excellent_developers
努力成為優(yōu)秀前端工程師各拷!