做者:
Ram Rai,性能、可擴展性以及軟件架構的愛好者web原文連接:
https://medium.com/better-programming/debug-your-kubernetes-service-in-5-easy-steps-1457974f024cshell
在Kubernetes中,服務是一個核心概念。在本文中,將介紹如何調試K8S服務,這些服務是由多個Pod組成的工做負載的抽象接口(主機+端口)。網絡
在咱們深刻探索debug方法以前,咱們先簡單回顧一下網絡,這是Kubernetes服務的基礎。架構
在一個pod中的容器共享相同的網絡空間和IP。app
全部的pod都能經過IP彼此通訊。負載均衡
每一個節點都能看到全部的Pod,反之亦然。frontend
Pod能夠看到全部的服務。ide
那麼,在實踐中這些意味着什麼呢?微服務
在圖中:性能
位於Pod1中的容器B能夠直接做爲localhost尋址容器A
容器B能夠經過其IP直接尋址Pod2(kubectl get pod -o wide
)。咱們知道當pod2出現故障時着不是一個可靠的通訊渠道,而且一個新的pod能夠出如今其位置中。可是咱們沒法追逐不斷變化的目標。
接下來,容器B能夠經過Service x訪問pod 2和pod 3,後者將它們的IP與負載均衡捆綁在一塊兒;所以,在K8S上支持基於微服務的應用程序起着相當重要的做用
儘管對Kubernetes的內部網絡結構的檢查不在本文的討論範圍內,但我稍後會發布一些參考資料以供你們進一步研究。
對於當下,我仍是鼓勵你花費一點時間在實踐中經歷和理解Kubernetes中的網絡。例如,你能夠啓動一個Kubernetes測試pod而且嘗試從該pod中訪問其餘pod、節點和服務。此處顯示的命令將在Pod內彈出一個Linux shell。
kubectl run -it networktest --image=alpine bin/ash --restart=Never --rm
如今你在Kubernetes網絡空間內而且你能夠隨意使用wegt
、ping
、nslookup
之類的命令進行實驗。例如,測試你的Kubernetes集羣中先前列出的網絡要求,nslookup <servicename>, ping <PodIP>
。
如今讓咱們回到咱們的話題,troubleshooting Kubernetes服務,這其實是一種網絡結構。
kubectl get svc
若是服務不存在,應該是服務建立出現了故障,所以要去檢查你的服務定義。
請記住,一個內部的Kubernetes ClusterIP服務是沒法在集羣外部訪問的。所以,有兩種方法能夠對其進行測試。方法一,你能夠啓動一個測試Pod,經過SSH進入該pod,而後嘗試像這樣訪問你的服務:
kubectl run -it testpod --image=alpine bin/ash --restart=Never --rm
在本文中咱們啓動一個alpine Docker鏡像做爲pod來從其內部測試服務:
#works for http services wget <servicename>:<httpport> #Confirm there is a DNS entry for the service! nslookup <servicename>
或者,你能夠轉發到本地計算機並在本地進行測試。
kubectl port-forward <service_name> 8000:8080
如今,你能夠經過localhost:8000
訪問服務。
Kubernetes服務會根據標籤selector將入站流量路由到其中一個pod,流量經過其IP路由到目標Pod。因此,請檢查服務是否綁定到那些pod。
kubectl describe service <service-name> | grep Endpoints
執行上述命令以後,你應該看到與列出的工做負載相關的全部Pod的IP。若是沒有看到,請執行Step4。
確保在Kubernetes服務中的selector與pod的標籤相匹配。
kubectl get pods --show-labels kubectl describe svc <service_name>
從下面的截圖的中能夠看到,pod的標籤在右邊。四個pod被標記爲app=tinywebsite
和tier=frontend
,這些標籤與下面「described」
的服務selector相匹配。
在這四個匹配的Pod中,只有三個正在運行,其IP在突出顯示的行中被列爲服務的端點(endpoint)。你還能夠在IP列中看到相同的IP。
最後,確保在你的pod中的代碼可以監聽到你爲服務指定的targetPort(例如,你在上方截圖中看到的port8001)!
這十分簡單,爲了讓你更進一步深刻了解和研究Kubernetes的網絡世界,歡迎你閱讀如下文章。