ASP.NET Core on K8S深入学习(3)Deployment
上一篇《部署過程解析與安裝Dashboard》中我們了解K8S的部署過程,這一篇我們來了解一下K8S為我們提供的幾種應(yīng)用運(yùn)行方式:Deployment、DaemonSet與Job,它們是Kubernetes最重要的核心功能提供者。考慮到篇幅和更新速度,我將其分為兩篇文章,本篇會主要介紹Deployment,主要參考自CloudMan《每天5分鐘玩轉(zhuǎn)Kubernetes》,也推薦大家購買閱讀。
01
—
創(chuàng)建資源的兩種方式對比
K8S支持兩種創(chuàng)建資源的方式,分別是?使用kubectl命令直接創(chuàng)建?與?通過配置文件+kubectl apply創(chuàng)建,下面以上一篇中的ASP.NET Core示例來分別介紹下這兩種方式。
1.1 Kubectl命令直接創(chuàng)建
第一種是通過kubectl命令直接創(chuàng)建:
kubectl run k8s-demo-deployment --image=edisonsaonian/k8s-demo:latest --replicas=2 --namespace=aspnetcore這樣我們就部署了一個具有2個副本的k8s-demo(一個ASP.NET Core API示例)。
1.2 YAML配置文件創(chuàng)建
第二種是通過配置文件+kubectl apply(kubectl create也可以)創(chuàng)建:
apiVersion: apps/v1 kind: Deployment metadata: name: k8s-demo-deployment namespace: aspnetcore spec: replicas: 2 template: spec: containers: - name: k8s-demo image: edisonsaonian/k8s-demo ports: - containerPort: 80不過,上面的配置文件可能并不能直接運(yùn)行,因為默認(rèn)情況下K8S還有一些必填項的驗證,完整你可以參考下面這段配置。更多yaml文件的語法基礎(chǔ),可以參考這一篇文章:https://www.kubernetes.org.cn/1414.html
apiVersion: apps/v1 kind: Deployment metadata: name: k8s-demo-deployment namespace: aspnetcore spec: replicas: 2 selector: matchLabels: app: aspnetcore_webapi template: metadata: labels: app: aspnetcore_webapi spec: containers: - name: k8s-demo image: edisonsaonian/k8s-demo ports: - containerPort: 80如上所示,我們將資源的屬性都寫在了一個yaml格式的配置文件中,有了這個配置文件,我們只需要執(zhí)行一句:
kubectl apply -f k8s-demo-deployment.yaml1.3 相關(guān)補(bǔ)充
如果要刪除deployment,也只需要執(zhí)行一句:
kubectl delete deployment k8s-demo-deployment或者是下面這一句:
kubectl delete -f k8s-demo-deployment.yaml執(zhí)行之后,K8S會自動幫我們刪除相關(guān)Deployment、ReplicaSet(副本集)以及Pod。
可以看出,直接通過kubectl創(chuàng)建會比較省力和快捷,但是它無法做到很好的管理,不適合正式的、規(guī)模化的部署,因此我們一般會更加傾向于采用配置文件的方式,但是使用配置文件要求我們熟悉yaml的語法,如果存在類似制表符之類的特殊字符都是無法成功執(zhí)行的。
02
—
Deployment必知必會
2.1 Deployment類型應(yīng)用運(yùn)行
這里我們?nèi)砸陨厦嫣岬降膋8s-demo示例項目為例,通過下面這個配置文件來創(chuàng)建資源:
通過下面的命令創(chuàng)建資源:
kubectl apply -f k8s-demo-deployment.yaml下面我們來看看K8S到底為我們做了些什么工作:
(1)查看k8s-demo-deployment狀態(tài)
kubectl get deployment k8s-demo-deployment -n aspnetcore
? 可以看到,對于我們的這個deployment,生成了2個副本且正常運(yùn)行。
如果想要獲得更加相信的信息,可以使用下面這句:
kubectl describe deployment k8s-demo-deployment -n aspnetcore從deployment的日志中,可以看到如下圖所示的信息:
? 可以看到,K8S的Deployment-Controller為k8s-demo創(chuàng)建了一個ReplicaSet名叫k8s-demo-deployment-54d5c97fb7,后面的Pod就是由這個ReplicaSet來管理的。
(2)查看ReplicaSet的狀態(tài)
kubectl describe replicaset -n aspnetcore會得到以下兩個圖所示的信息:
? 從上圖可以看出,這個ReplicaSet是由Deployment k8s-demo-deployment 創(chuàng)建的。
? 從上圖中的日志(Events代表日志)可以看出,兩個副本Pod是由ReplicaSet-Controller創(chuàng)建的,且創(chuàng)建成功。
(3)查看Pod的狀態(tài)
kubectl describe pod -n aspnetcore同樣,也會得到如下圖所示的兩個信息:
? 可以看出,此Pod是由ReplicaSet k8s-demo-deployment-54d5c97fb7創(chuàng)建的。下圖的日志記錄了Pod的啟動過程:
? 從日志中可以看到Pod的啟動過程,如果啟動過程中發(fā)生了異常(比如拉取鏡像失敗),都可以通過輸出的錯誤信息查看原因。
下圖是整個Deployment的部署過程,即kubectl→Deployment→ReplicaSet→Pod,也可以看出對象的命名方式的規(guī)則:
2.2 伸縮Scale
所謂伸縮,是指在線實時增加或減少Pod的副本數(shù)量。在剛剛的部署中,我們在配置文件中定義的是2個副本,如下圖所示:
? 可以看到,兩個副本分別位于k8s-node1 和 k8s-node2上面。一般默認(rèn)情況下,K8S不會將Pod調(diào)度到Master節(jié)點(diǎn)上,雖然Master節(jié)點(diǎn)也是可以作為Node節(jié)點(diǎn)曬用的。
這時,如果我們想要擴(kuò)展副本數(shù)量從2到3,只需要修改配置文件:
apiVersion: apps/v1 kind: Deployment metadata: name: k8s-demo-deployment namespace: aspnetcore spec: replicas: 3 ......然后再次apply:
kubectl apply -f k8s-demo-deployment.yaml最終結(jié)果如下圖所示:
同理,如果想縮小副本數(shù)量,也是如上所述的步驟,不再贅述。
2.3 故障轉(zhuǎn)移FailOver
所謂K8S中的故障轉(zhuǎn)移(FailOver),就是當(dāng)某個Node節(jié)點(diǎn)失效或宕機(jī)時,會將該Node上所運(yùn)行的所有Pod轉(zhuǎn)移到其他健康的Node節(jié)點(diǎn)上繼續(xù)運(yùn)行。
這里繼續(xù)上例,我們有兩個Pod都運(yùn)行在k8s-node2上,那么我們這里模擬k8s-node2故障,強(qiáng)制關(guān)閉該節(jié)點(diǎn):
halt -h
等待一段時間后(放心,不會很快),當(dāng)K8S檢測到k8s-node2不可用,會將k8s-node2上的Pod最終標(biāo)記為Terminating狀態(tài),并在k8s-node1上新建兩個Pod,維持副本總數(shù)量為3。
當(dāng)然,也可以從Dashboard中直觀的看到:
當(dāng)k8s-node2恢復(fù)后,Terminating的Pod會自動被刪除,不過已經(jīng)運(yùn)行在k8s-node1的Pod是不會重新調(diào)度回k8s-node2的。
2.4 善用label控制Pod位置
默認(rèn)情況下,K8S的Scheduler會均衡調(diào)度Pod到所有可用的Node節(jié)點(diǎn),但是有些時候希望將指定的Pod部署到指定的Node節(jié)點(diǎn)。例如,一個I/O密集型的Pod可以盡量部署在配置了SSD的Node節(jié)點(diǎn),又或者一個需要GPU的Pod可以盡量部署在配置了GPU的Node節(jié)點(diǎn)上。
不用擔(dān)心,K8S為我們提供了label來實現(xiàn)這個功能,label是一個key/value對,可以靈活設(shè)置各種自定義的屬性。比如,我們這里假設(shè)我們的k8s-demo示例項目是一個I/O密集型的API,還假設(shè)k8s-node1是一個配置了SSD的Node節(jié)點(diǎn):
kubectl label node k8s-node1 disktype=ssd kubectl get node --show-labels顯示結(jié)果如下:可以看到,現(xiàn)在k8s-node多了一個label => disktype=ssd
接下來,我們就可以在配置文件中為要部署的應(yīng)用指定label了:
apiVersion: apps/v1 kind: Deployment metadata: name: k8s-demo-deployment namespace: aspnetcore spec: replicas: 3 selector: matchLabels: app: aspnetcore_webapi template: metadata: labels: app: aspnetcore_webapi spec: containers: - name: k8s-demo image: edisonsaonian/k8s-demo ports: - containerPort: 80 nodeSelector: disktype: ssd? 然后,再次apply創(chuàng)建資源:
kubectl apply -f k8s-demo-deployment.yaml驗證一下,所有的k8s-demo的Pod全都調(diào)度到了k8s-node1上面,符合預(yù)期:
? 如果k8s-node1不再是配置SSD了,那么我們就可以為其刪掉這個label了:
kubectl label node k8s-node1 disktype-注意,這里的 - 就代表刪除,而且此時Pod不會重新部署,除非你刪除配置文件中的配置然后再次apply。
03
—
小結(jié)
本文介紹了K8S中創(chuàng)建資源的兩種方式及對比,然后重點(diǎn)介紹了一下Deployment這個Controller,把玩了Deployment類型的應(yīng)用運(yùn)行、伸縮、故障轉(zhuǎn)移以及使用label來控制Pod的位置。運(yùn)行應(yīng)用是K8S最核心的功能,下一篇會繼續(xù)研究DaemonSet和Job這兩個Controller的應(yīng)用方式和場景。當(dāng)然,筆者也還是初學(xué),有很多不足之處,也請多包涵。對于催更的童鞋,請耐心等待。
參考資料:
(1)CloudMan,《每天5分鐘玩轉(zhuǎn)Kubernetes》
(2)李振良,《一天入門Kubernets教程》
(3)馬哥(馬永亮),《Kubernetes快速入門》
恰童鞋騷年,風(fēng)華不再正茂,仍想揮斥方遒
點(diǎn)個在看少個bug??
總結(jié)
以上是生活随笔為你收集整理的ASP.NET Core on K8S深入学习(3)Deployment的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 史上最能“拜客户教”的公司,是如何做到持
- 下一篇: asp.net ajax控件工具集 Au