作者:
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的網路世界,歡迎你閱讀以下文章,
-
在Kubernetes中部署一個應用程式
-
Debug服務
-
Kubernetes網路
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/5322.html
標籤:其他
