1.k8s中service訪問異常(chang)的(de)常(chang)見問題
1).service沒有正確匹配到后(hou)端(duan)的(de)pod標簽
(1).service匹配的(de)label標簽沒有(you)匹配上(shang)后面的(de)pod(導致訪(fang)問不到界面)
(2).service匹配的label標簽匹配到(dao)后面其他錯誤的pod(導致(zhi)訪問(wen)的(de)別的(de)界面)
2).kube-proxy服務故障導致service無法提(ti)供服務(wu)
kube-proxy是什么:
Service為(wei)一(yi)組(zu)相同(tong)的pod提供了統一的(de)入(ru)口(kou),起到負載(zai)均衡的(de)效(xiao)果。Service具(ju)有這樣的功(gong)能,真是kube-proxy的功勞,kube-proxy是(shi)一(yi)個代理,安裝在每一(yi)個k8s節點,當(dang)我們(men)暴露一個service的(de)時候,kube-proxy會(hui)在iptables中(zhong)追加一(yi)些規則,為我們實(shi)現(xian)路由與負載(zai)均衡的功能。
kube-proxy的兩(liang)種轉發(fa)規(gui)則: iptables(DNAT規則轉(zhuan)發到(dao)后臺pod)和ipvs
故障現象:
service的(de)標簽選擇器正常,pod也正常,但是訪問service的(de)ip時(shi),還是代理不到pod,就需要檢(jian)查kube-proxy組件。
解決思路:
(1).查(cha)看相應node節點kube-proxy服務是否正常。
(2).查看(kan)相應node節點上(shang)kube-proxy相(xiang)關(guan)日志,有沒有報(bao)錯,資(zi)源不足,如(ru):cpu/內(nei)存/磁盤
(3)查看相(xiang)應node節點上系統日志(zhi)中有沒(mei)有關(guan)于kube-proxy的日志報錯.
#cat /var/log/messages[kube-proxy] |grep kube-proxy或 kubectl logs pod名 |grep kube-proxy
解決方法(fa):
(1).擴容節點(dian)資(zi)源(yuan),增加服務器或者虛(xu)擬機的cpu和內(nei)存。
(2).修改kube-proxy的(de)yaml中的(de)limit資源限制(zhi),限制(zhi)可使用的cpu和(he)內存。
2.k8s中pod刪除失敗的(de)解決
故障現象:在k8s中,可能會產生很多(duo)垃圾pod,也就(jiu)是有些pod雖然是(shi)running狀(zhuang)態,可是其所調度到的k8s的node節點已經(jing)從k8s集群(qun)刪除了,但是(shi)pod還是(shi)在(zai)這(zhe)個node上,沒有被驅逐,針對這種情況就需要把pod刪除。
故障問題(ti):刪除pod時(shi)候,pod一(yi)直處于terminate狀態,很長時間無法刪(shan)除。
解決(jue)方案(an):
可以通過如下方法添加參數(shu)強制刪除pod,–force --grace-period=0, grace-period表(biao)示過渡(du)存活期,默認30s,在刪除pod之(zhi)前運行pod慢(man)慢(man)終止其上的容器進程,從而優雅(ya)退出,0表(biao)示(shi)立即終(zhong)止pod.
#kubectl delete pod pod名(ming) --force --grace-period=0
3.k8s中命名空間的強制刪除
雖然pod可(ke)以(yi)強制刪除,但(dan)是可(ke)能(neng)命名空(kong)間還是處于terminate狀態,無法(fa)刪除(chu)。
解決(jue)方法:
(1).強制(zhi)刪除命名空間
#kubectl delete ns 命名空間 --force --grace-period=0
(2).獲取namespace的(de)json文(wen)件(jian),刪(shan)除(chu)相關內容
#kubectl get ns 命名空間 -o json > /root/xx.json
#vim /root/xx.json
刪除spec下的”finalizers”:[ 和”kubernetes” 內容
調用api-server接口(kou)進行刪除:
打開(kai)一(yi)個(ge)新的終端(duan),或者(zhe)把下面的命令(ling)放到后臺執行: # kubectl proxy --port=8081
調(diao)用接口刪除:
#curl -k -H “Content-Type: application/json” -X PUT --data-binary @xx.json
127.0.0.1:8081/api/v1/namespaces/命名空間名/finalize
如果kubectl get ns 命名空間 -o json的結果(guo)中”spec”:{}中為空了,但是metadata部分(fen)還有finalizers字段,需要(yao)將里(li)面相關finalizers的內(nei)容也刪除。
#kubectl edit ns 命名空間(jian)
進去后,直接刪除相關(guan)finalizers的內容即可,保(bao)存退出后(hou),出入Terminating狀(zhuang)態的ns便沒有了(le)。
4.k8s中(zhong)跨(kua)主機(ji)連接不通(pod和pod)
1).pause容器(qi)概(gai)念:
Pause容器,又叫Infra容(rong)器(qi),Pause容器對應(ying)的鏡像屬于(yu)k8s平臺(tai)的一(yi)部分,除了(le)pause容器,每個(ge)pod還包含(han)一(yi)個(ge)或(huo)者多個(ge)緊密相關的(de)用(yong)戶(hu)業務容器。
2).pause容器的作用:
(1).pod里的多個業務(wu)容(rong)器共(gong)享pause容器(qi)的ip,共享pause容(rong)器(qi)掛載的volume,這樣簡化了(le)業務(wu)容(rong)器之(zhi)間的(de)通(tong)信問(wen)題(ti),也解決了(le)容(rong)器之(zhi)間的(de)問(wen)題(ti)件(jian)共享問(wen)題(ti)。
(2).pod中的容器共享同一(yi)個ip地址。故同一個(ge)pod中container可以做到直接通(tong)過localhost直(zhi)接通信。
3).同一(yi)個(ge)節點多個(ge)pod通信機制:
pause容(rong)器(qi)啟(qi)動之前,會為容(rong)器(qi)創建虛(xu)擬一對ethernet接口,一個保留在(zai)宿主機vethxxx(插在網橋上),一個保留在容器網絡(luo)命(ming)名空(kong)間內(nei),并重命(ming)名為eth0。兩(liang)個虛(xu)擬接口的兩(liang)端,從一端進入(ru),從另一端出來。任何pod連接到該網橋的pod都(dou)可以收(shou)發數(shu)據。
4).跨節點(dian)pod通(tong)信機制:
跨節點pod通信,相當于創建一個(ge)整個(ge)集群公用(yong)的(de) [網橋] ,然后把集群中所有的pod連接起來(lai),就(jiu)可以通信了。
5).跨主機連(lian)接不通(pod和(he)pod)的故障排查(cha)方法:
(1).排查宿主機(ji)網絡(luo)是否(fou)正常,在宿主機(ji)上(shang)ping baidu.com,或tcpdump抓(zhua)包看(kan)是否丟包.
(2).查(cha)看k8s中的網(wang)絡插件(jian)(jian)是否正常,查看網(wang)絡組件(jian)(jian)calico或flannel的日志。