解決k8s無法通過svc訪問其他節(jié)點pod的問題

問題描述

有兩個(或多個)運行在不同節(jié)點上的pod基括,通過一個svc提供服務(wù),如下:

root@master1:~# kubectl get pod -o wide
NAME          READY   STATUS    RESTARTS   AGE   IP            NODE
kubia-nwjcc   1/1     Running   0          33m   10.244.1.27   worker1
kubia-zcpbb   1/1     Running   0          33m   10.244.2.11   worker2

root@master1:~# kubectl get svc kubia
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
kubia        ClusterIP   10.98.41.49   <none>        80/TCP    34m

當透過其他pod訪問該svc時(使用命令k exec kubia-nwjcc -- curl http://10.98.41.49)年堆,出現(xiàn)了只能訪問到和自己同處于一個節(jié)點的pod的問題,訪問到其他節(jié)點上的pod時會出現(xiàn)command terminated with exit code 7的問題盏浇,如下:

正常訪問到相同節(jié)點的pod

root@master1:~# kubectl exec kubia-nwjcc -- curl http://10.98.41.49
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    23    0    23    0     0   8543      0 --:--:-- --:--:-- --:--:-- 11500
You've hit kubia-nwjcc

無法訪問其他節(jié)點的pod

root@master1:~# kubectl exec kubia-nwjcc -- curl http://10.98.41.49   
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
curl: (7) Failed to connect to 10.98.41.49 port 80: No route to host
command terminated with exit code 7

本問題隨機發(fā)生变丧,如下:

root@master1:~# kubectl exec kubia-nwjcc -- curl http://10.98.41.49   
You've hit kubia-nwjcc
root@master1:~# kubectl exec kubia-nwjcc -- curl http://10.98.41.49  
command terminated with exit code 7
root@master1:~# kubectl exec kubia-nwjcc -- curl http://10.98.41.49  
command terminated with exit code 7
root@master1:~# kubectl exec kubia-nwjcc -- curl http://10.98.41.49   
You've hit kubia-nwjcc

問題原因

原因是因為,我是用的VirtualBox虛擬化出了兩臺 ubuntu 主機搭建的 k8s 绢掰,詳見 virtualbox 虛擬機組網(wǎng) 痒蓬。在組網(wǎng)的過程中,我采用了雙網(wǎng)卡方案滴劲,網(wǎng)卡1使用NAT地址轉(zhuǎn)換用來訪問互聯(lián)網(wǎng)攻晒,網(wǎng)卡2使用Host-only來實現(xiàn)虛擬機互相訪問flannel默認使用了網(wǎng)卡1的 ip 地址哑芹,而網(wǎng)卡1的NAT地址轉(zhuǎn)換是無法訪問其他虛擬機的,從而導(dǎo)致的問題的產(chǎn)生捕透。

解決方案

因為是flannel使用的默認網(wǎng)卡1導(dǎo)致了這個問題的產(chǎn)生聪姿,所以我們需要使用--iface參數(shù)手動指定它使用網(wǎng)卡2來進行通信碴萧,這就需要修改flannel的配置文件,執(zhí)行如下命令即可進行修改:

sudo kubectl edit daemonset kube-flannel-ds-amd64 -n kube-system

如果你執(zhí)行后出現(xiàn)了Error from server (NotFound): daemonsets.extensions "kube-flannel-ds-amd64" not found的問題末购,按照下列步驟找到其配置文件名稱:

查找flannel配置文件名

首先輸入kubectl get po -n kube-system破喻,然后找到正在運行的flannelpod。

root@master1:~# k get po -n kube-system
NAME                              READY   STATUS    RESTARTS   AGE
coredns-bccdc95cf-69zrw           1/1     Running   1          2d1h
coredns-bccdc95cf-77bg4           1/1     Running   1          2d1h
etcd-master1                      1/1     Running   6          2d1h
kube-apiserver-master1            1/1     Running   6          2d1h
kube-controller-manager-master1   1/1     Running   2          2d1h
# 下面這四個都可以
kube-flannel-ds-amd64-8c2lc       1/1     Running   4          2d1h 
kube-flannel-ds-amd64-dflsl       1/1     Running   9          23h
kube-flannel-ds-amd64-hgp55       1/1     Running   1          2d1h
kube-flannel-ds-amd64-jb79v       1/1     Running   33         26h
kube-proxy-2lz7f                  1/1     Running   0          23h
kube-proxy-hqsdn                  1/1     Running   4          2d1h
kube-proxy-rh92r                  1/1     Running   1          2d1h
kube-proxy-tv4mt                  1/1     Running   0          26h
kube-scheduler-master1            1/1     Running   2          2d1h

然后使用flannel的 pod 名來查看其配置yaml盟榴。使用命令kubectl get po -n kube-system kube-flannel-ds-amd64-8c2lc -o yaml曹质,注意修改其中的 pod 名稱。在輸出的內(nèi)容開頭可以找到ownerReferences字段擎场,其下的name屬性就是要找的配置文件名羽德。如下:

root@master1:~# kubectl get po -n kube-system kube-flannel-ds-amd64-8c2lc -o yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2019-07-01T07:53:25Z"
  generateName: kube-flannel-ds-amd64-
  labels:
    app: flannel
    controller-revision-hash: 7c75959b75
    pod-template-generation: "1"
    tier: node
  name: kube-flannel-ds-amd64-8c2lc
  namespace: kube-system
  ownerReferences:
  - apiVersion: apps/v1
    blockOwnerDeletion: true
    controller: true
    kind: DaemonSet
    name: kube-flannel-ds-amd64
    uid: df09fb4c-5390-4498-b539-74cb5d90f66d
  resourceVersion: "126940"
  selfLink: /api/v1/namespaces/kube-system/pods/kube-flannel-ds-amd64-8c2lc
  uid: 31d11bc6-b8f3-492a-9f92-abac1d330663

將找到的配置文件名填入sudo kubectl edit daemonset <配置文件名> -n kube-system并執(zhí)行即可打開配置文件。

修改配置文件迅办,指定目標網(wǎng)卡

在打開的配置文件中找到spec.template.spec.containers[0].args字段宅静,如下:

...
spec:
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: flannel
      tier: node
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: flannel
        tier: node
    spec:
      containers:
      # 看這里
      - args:
        - --ip-masq
        - --kube-subnet-mgr
        command:
        - /opt/bin/flanneld
        env:
...

這個字段表示了flannel啟動時都要附加那些參數(shù),我們要手動添加參數(shù)--iface=網(wǎng)卡名來進行指定站欺,如下:

- args:
  - --ip-masq
  - --kube-subnet-mgr
  - --iface=enp0s8

這里的enp0s8是我的網(wǎng)卡名姨夹,你可以通過ifconfig來找到自己的網(wǎng)卡名。

修改完成之后輸入:wq保存退出矾策。命令行會提示:

daemonset.extensions/kube-flannel-ds-amd64 edited

這就說明保存成功了磷账。然后就要重啟所有已經(jīng)存在的flannel。使用kubectl delete pod -n kube-system <pod名1> <pod名2> ...把所有的flannel刪除即可贾虽。k8s 會自動按照你修改好的yaml配置重建flannel逃糟。

root@master1:~# kubectl delete pod -n kube-system \
kube-flannel-ds-amd64-8c2lc \
kube-flannel-ds-amd64-dflsl \
kube-flannel-ds-amd64-hgp55 \
kube-flannel-ds-amd64-jb79v 

pod "kube-flannel-ds-amd64-8c2lc" deleted
pod "kube-flannel-ds-amd64-dflsl" deleted
pod "kube-flannel-ds-amd64-hgp55" deleted
pod "kube-flannel-ds-amd64-jb79v" deleted

然后再次kubectl get pod -n kube-system | grep flannel就發(fā)現(xiàn)所有flannel都已經(jīng)重啟成功了:

root@master1:~# kubectl get pod -n kube-system | grep flannel
kube-flannel-ds-amd64-2d6tb       1/1     Running   0          89s
kube-flannel-ds-amd64-kp5xs       1/1     Running   0          86s
kube-flannel-ds-amd64-l9728       1/1     Running   0          92s
kube-flannel-ds-amd64-r87qc       1/1     Running   0          91s

然后再隨便找個pod試一下就可以看到問題解決了:

root@master1:~# k exec kubia-d7kjl -- curl -s http://10.103.214.110  
You've hit kubia-d7kjl
root@master1:~# k exec kubia-d7kjl -- curl -s http://10.103.214.110
You've hit kubia-d7kjl
root@master1:~# k exec kubia-d7kjl -- curl -s http://10.103.214.110
You've hit kubia-kdjgf
root@master1:~# k exec kubia-d7kjl -- curl -s http://10.103.214.110
You've hit kubia-d7kjl

問題發(fā)現(xiàn)

這里記錄一下問題的發(fā)現(xiàn)經(jīng)過,希望對大家有所幫助榄鉴。當我一開始遇到這個問題的時候還以為是svc的問題履磨,但是在查看了對應(yīng)svcendpoint之后,并沒有發(fā)現(xiàn)有什么顯式的問題出現(xiàn)庆尘,如下剃诅,可以看到svc正確的識別到了已存在的兩個pod

root@master1:~# kubectl get ep kubia 
NAME    ENDPOINTS                         AGE
kubia   10.244.1.5:8080,10.244.3.4:8080   8h

什么是endpoint?

endpoint可以簡單理解成路由導(dǎo)向的終點,因為 svc 是將許多個動態(tài)的 ip 映射成一個靜態(tài)的 ip驶忌。那么就可以把這些動態(tài)的 pod ip 稱為 svc 的endpoint矛辕。

繼續(xù)說,因為在測試過程中向 svc 發(fā)了很多請求付魔,也可以察覺到其實 svc 已經(jīng)隨機的將你的請求分發(fā)到了不同的 pod聊品,只是目標 pod 不在當前節(jié)點的時候就會返回exit code 7。然后嘗試一下繞過 svc 直接請求 pod几苍,首先新建出來一個 pod翻屈,然后使用kubectl get po -o wide查看 pod ip。

root@master1:~# kubectl get po -o wide
NAME          READY   STATUS    RESTARTS   AGE   IP           NODE      NOMINATED NODE   READINESS GATES
kubia-d7kjl   1/1     Running   0          8h    10.244.1.5   worker1   <none>           <none>
kubia-kdjgf   1/1     Running   0          9h    10.244.3.4   worker2   <none>           <none>
kubia-kn45c   1/1     Running   0          13s   10.244.1.6   worker1   <none>           <none>

可以看到 k8s 把新的 pod 放在了worker1上妻坝,所以我們就拿這個新的 pod 去直接訪問其他兩個 pod伸眶。這里不能在主機上直接 ping pod ip惊窖,因為 pod 都是開放在虛擬網(wǎng)絡(luò)10.244.x.x上的,在主機上訪問不到

訪問相同節(jié)點上的 pod

root@master1:~# k exec -it kubia-d7kjl -- ping 10.244.1.6     
PING 10.244.1.6 (10.244.1.6): 56 data bytes
64 bytes from 10.244.1.6: icmp_seq=0 ttl=64 time=0.377 ms
64 bytes from 10.244.1.6: icmp_seq=1 ttl=64 time=0.114 ms
...

訪問不同節(jié)點上的 pod

root@master1:~# k exec -it kubia-d7kjl -- ping 10.244.3.4
PING 10.244.3.4 (10.244.3.4): 56 data bytes
# 沒反應(yīng)了
# 死一般寂靜

這么看的話其實問題不在svc上厘贼,而是兩個節(jié)點之間的網(wǎng)絡(luò)聯(lián)通出現(xiàn)了問題界酒。而10.244.x.x虛擬網(wǎng)段是通過flannel搭建的,所以問題自然就是出在它上嘴秸。在翻閱了官方文檔后可以發(fā)現(xiàn)毁欣,官方明確指出了在vagrant類型的虛擬機上運行時要注意默認網(wǎng)卡的問題,再結(jié)合自己的網(wǎng)絡(luò)情況岳掐,問題就已經(jīng)很明確了了凭疮。

官方文檔截圖

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市岩四,隨后出現(xiàn)的幾起案子哭尝,更是在濱河造成了極大的恐慌,老刑警劉巖剖煌,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件材鹦,死亡現(xiàn)場離奇詭異,居然都是意外死亡耕姊,警方通過查閱死者的電腦和手機桶唐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茉兰,“玉大人尤泽,你說我怎么就攤上這事」媪常” “怎么了坯约?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長莫鸭。 經(jīng)常有香客問我闹丐,道長,這世上最難降的妖魔是什么被因? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任卿拴,我火速辦了婚禮,結(jié)果婚禮上梨与,老公的妹妹穿的比我還像新娘堕花。我一直安慰自己,他們只是感情好粥鞋,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布缘挽。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪壕曼。 梳的紋絲不亂的頭發(fā)上杠袱,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機與錄音窝稿,去河邊找鬼。 笑死凿掂,一個胖子當著我的面吹牛伴榔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播庄萎,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼踪少,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了糠涛?” 一聲冷哼從身側(cè)響起援奢,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎忍捡,沒想到半個月后集漾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡砸脊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年具篇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凌埂。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡驱显,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瞳抓,到底是詐尸還是另有隱情埃疫,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布孩哑,位于F島的核電站栓霜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏臭笆。R本人自食惡果不足惜叙淌,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望愁铺。 院中可真熱鬧鹰霍,春花似錦、人聲如沸茵乱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓶竭。三九已至督勺,卻和暖如春渠羞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背智哀。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工次询, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瓷叫。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓屯吊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親摹菠。 傳聞我的和親對象是個殘疾皇子盒卸,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345