如何輕松調(diào)試K8S服務(wù),很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
創(chuàng)新互聯(lián)專注于阿里地區(qū)企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城網(wǎng)站建設(shè)。阿里地區(qū)網(wǎng)站建設(shè)公司,為阿里地區(qū)等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
在Kubernetes中,服務(wù)是一個(gè)核心概念。這里將介紹如何調(diào)試K8S服務(wù),這些服務(wù)是由多個(gè)Pod組成的工作負(fù)載的抽象接口(主機(jī)+端口)。
在我們深入探索debug方法之前,我們先簡(jiǎn)單回顧一下網(wǎng)絡(luò),這是Kubernetes服務(wù)的基礎(chǔ)。
在一個(gè)pod中的容器共享相同的網(wǎng)絡(luò)空間和IP。
所有的pod都能通過(guò)IP彼此通信。
每個(gè)節(jié)點(diǎn)都能看到所有的Pod,反之亦然。
Pod可以看到所有的服務(wù)。
那么,在實(shí)踐中這些意味著什么呢?
在圖中:
位于Pod1中的容器B可以直接作為localhost尋址容器A
容器B可以通過(guò)其IP直接尋址Pod2(kubectl get pod -o wide
)。我們知道當(dāng)pod2出現(xiàn)故障時(shí)著不是一個(gè)可靠的通信渠道,并且一個(gè)新的pod可以出現(xiàn)在其位置中。但是我們無(wú)法追逐不斷變化的目標(biāo)。
接下來(lái),容器B可以通過(guò)Service x訪問(wèn)pod 2和pod 3,后者將它們的IP與負(fù)載均衡捆綁在一起;因此,在K8S上支持基于微服務(wù)的應(yīng)用程序起著至關(guān)重要的作用
盡管對(duì)Kubernetes的內(nèi)部網(wǎng)絡(luò)結(jié)構(gòu)的檢查不在本文的討論范圍內(nèi),但我稍后會(huì)發(fā)布一些參考資料以供大家進(jìn)一步研究。
對(duì)于當(dāng)下,我還是鼓勵(lì)你花費(fèi)一點(diǎn)時(shí)間在實(shí)踐中經(jīng)歷和理解Kubernetes中的網(wǎng)絡(luò)。例如,你可以啟動(dòng)一個(gè)Kubernetes測(cè)試pod并且嘗試從該pod中訪問(wèn)其他pod、節(jié)點(diǎn)和服務(wù)。此處顯示的命令將在Pod內(nèi)彈出一個(gè)Linux shell。
kubectl run -it networktest --image=alpine bin/ash --restart=Never --rm
現(xiàn)在你在Kubernetes網(wǎng)絡(luò)空間內(nèi)并且你可以隨意使用wegt
、ping
、nslookup
之類的命令進(jìn)行實(shí)驗(yàn)。例如,測(cè)試你的Kubernetes集群中先前列出的網(wǎng)絡(luò)要求,nslookup
。
現(xiàn)在讓我們回到我們的話題,troubleshooting Kubernetes服務(wù),這實(shí)際上是一種網(wǎng)絡(luò)結(jié)構(gòu)。
kubectl get svc
如果服務(wù)不存在,應(yīng)該是服務(wù)創(chuàng)建出現(xiàn)了故障,因此要去檢查你的服務(wù)定義。
請(qǐng)記住,一個(gè)內(nèi)部的Kubernetes ClusterIP服務(wù)是無(wú)法在集群外部訪問(wèn)的。因此,有兩種方法可以對(duì)其進(jìn)行測(cè)試。方法一,你可以啟動(dòng)一個(gè)測(cè)試Pod,通過(guò)SSH進(jìn)入該pod,然后嘗試像這樣訪問(wèn)你的服務(wù):
kubectl run -it testpod --image=alpine bin/ash --restart=Never --rm
在本文中我們啟動(dòng)一個(gè)alpine Docker鏡像作為pod來(lái)從其內(nèi)部測(cè)試服務(wù):
#works for http services wget: #Confirm there is a DNS entry for the service! nslookup
或者,你可以轉(zhuǎn)發(fā)到本地計(jì)算機(jī)并在本地進(jìn)行測(cè)試。
kubectl port-forward8000:8080
現(xiàn)在,你可以通過(guò)localhost:8000
訪問(wèn)服務(wù)。
Kubernetes服務(wù)會(huì)根據(jù)標(biāo)簽selector將入站流量路由到其中一個(gè)pod,流量通過(guò)其IP路由到目標(biāo)Pod。所以,請(qǐng)檢查服務(wù)是否綁定到那些pod。
kubectl describe service| grep Endpoints
執(zhí)行上述命令之后,你應(yīng)該看到與列出的工作負(fù)載相關(guān)的所有Pod的IP。如果沒(méi)有看到,請(qǐng)執(zhí)行Step4。
確保在Kubernetes服務(wù)中的selector與pod的標(biāo)簽相匹配。
kubectl get pods --show-labels kubectl describe svc
從下面的截圖的中可以看到,pod的標(biāo)簽在右邊。四個(gè)pod被標(biāo)記為app=tinywebsite
和tier=frontend
,這些標(biāo)簽與下面“described”
的服務(wù)selector相匹配。
在這四個(gè)匹配的Pod中,只有三個(gè)正在運(yùn)行,其IP在突出顯示的行中被列為服務(wù)的端點(diǎn)(endpoint)。你還可以在IP列中看到相同的IP。
最后,確保在你的pod中的代碼能夠監(jiān)聽到你為服務(wù)指定的targetPort(例如,你在上方截圖中看到的port8001)!
這十分簡(jiǎn)單,為了讓你更進(jìn)一步深入了解和研究Kubernetes的網(wǎng)絡(luò)世界,歡迎你閱讀以下文章。
在Kubernetes中部署一個(gè)應(yīng)用程序
Debug服務(wù)
Kubernetes網(wǎng)絡(luò)
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。