作者:
Ram Rai,效能、可擴充套件性以及軟體架構的愛好者原文連結:
https://medium.com/better-programming/debug-your-kubernetes-service-in-5-easy-steps-1457974f024c
在Kubernetes中,服務是一個核心概念。在本文中,將介紹如何除錯K8S服務,這些服務是由多個Pod組成的工作負載的抽象介面(主機+埠)。
在我們深入探索debug方法之前,我們先簡單回顧一下網路,這是Kubernetes服務的基礎。
-
在一個pod中的容器共享相同的網路空間和IP。
-
所有的pod都能通過IP彼此通訊。
-
每個節點都能看到所有的Pod,反之亦然。
-
Pod可以看到所有的服務。
那麼,在實踐中這些意味著什麼呢?
在圖中:
-
位於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服務,這實際上是一種網路結構。
Step1:檢查服務是否存在
kubectl get svc
如果服務不存在,應該是服務建立出現了故障,因此要去檢查你的服務定義。
Step2:測試你的服務
請記住,一個內部的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
訪問服務。
Step3:檢查服務是否target相關Pod
Kubernetes服務會根據標籤selector將入站流量路由到其中一個pod,流量通過其IP路由到目標Pod。所以,請檢查服務是否繫結到那些pod。
kubectl describe service <service-name> | grep Endpoints
執行上述命令之後,你應該看到與列出的工作負載相關的所有Pod的IP。如果沒有看到,請執行Step4。
Step4:檢查Pod標籤
確保在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。
Step5:確認服務埠與pod相匹配
最後,確保在你的pod中的程式碼能夠監聽到你為服務指定的targetPort(例如,你在上方截圖中看到的port8001)!
這十分簡單,為了讓你更進一步深入瞭解和研究Kubernetes的網路世界,歡迎你閱讀以下文章。