深入解讀 Kubernetes 如何實現(xiàn)Service (一)

準備

首先創(chuàng)建redis deployment, 副本數(shù)為3捡遍,同時創(chuàng)建一個Cluster Service

cat << EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name:  redis-deploy-demo
  namespace: default
  labels:
    app:  redis-deploy-demo
spec:
  selector:
    matchLabels:
      app: redis-deploy-demo
  replicas: 3
  template:
    metadata:
      labels:
        app:  redis-deploy-demo
    spec:
      containers:
      - name:  redis-deploy-demo
        image:  redis:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort:  6379
          name:  redis
      restartPolicy: Always
---

apiVersion: v1
kind: Service
metadata:
  name: redis-demo-svc
  namespace: default
spec:
  selector:
    app: redis-deploy-demo
  type: ClusterIP
  ports:
  - name: redis-demo-svc
    protocol: TCP
    port: 6379
    targetPort: 6379
---
EOF

我的CNI的環(huán)境為flannel奕塑,其中

  • host 地址為:192.168.205.10
  • Pod CIDR網(wǎng)段為 172.16.0.0/16
  • Service CIDR網(wǎng)段為:10.68.0.0/16

查看Pod創(chuàng)建情況

# watch kubectl get pods -o wide
Every 2.0s: kubectl get pod -o wide                                                                                                                                                 k8s1: Thu Nov 26 09:27:55 2020

NAME                                READY   STATUS    RESTARTS   AGE     IP            NODE             NOMINATED NODE   READINESS GATES
redis-deploy-demo-7d6cf8d7b-8g8h4   1/1     Running   0          2m59s   172.16.0.10   192.168.205.10   <none>           <none>
redis-deploy-demo-7d6cf8d7b-ldw6p   1/1     Running   0          2m59s   172.16.0.11   192.168.205.10   <none>           <none>
redis-deploy-demo-7d6cf8d7b-txbx2   1/1     Running   0          2m59s   172.16.0.12   192.168.205.10   <none>           <none>

查看service創(chuàng)建情況

?  ~ kubectl get svc -o wide
NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE     SELECTOR
kubernetes                  ClusterIP   10.68.0.1       <none>        443/TCP    32h     <none>
redis-demo-svc              ClusterIP   10.68.87.193    <none>        6379/TCP   5m16s   app=redis-deploy-demo

探秘iptables

本節(jié)僅關(guān)注Service和endpoints如何生成iptables的,因此只關(guān)注KUBE-SERVICES這個Chain运准。

kube-proxy啟動時會創(chuàng)建 KUBE-SERVICES 這個Chain溜宽,該Chain創(chuàng)建到多個Chain中:

  • Chain:FORWARD,Table:filter
  • Chain:OUTPUT烈涮,Table:filter
  • Chain:INPUT,Table:filter
  • Chain:OUTPUT窖剑,Table:nat
  • Chain:PREROUTING坚洽,Table:nat

查看filter table的KUBE-SERVICE Chain

?  ~ iptables -L -n -t filter
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
KUBE-SERVICES  all  --  0.0.0.0/0            0.0.0.0/0            ctstate NEW /* kubernetes service portals */

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
KUBE-SERVICES  all  --  0.0.0.0/0            0.0.0.0/0            ctstate NEW /* kubernetes service portals */

查看nat table的KUBE-SERVICE Chain

?  ~ iptables -L -n -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
KUBE-SERVICES  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service portals */

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
KUBE-SERVICES  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service portals */

如何設置Service的iptables

Kubernetes中 Service的流量進入KUBE-SERVICES
KUBE-SERVICES鏈根據(jù)目標IP:Port匹配并跳轉(zhuǎn)到相應的 KUBE-SVC-*
KUBE-SVC-*鏈相當于一個負載均衡器,它會將數(shù)據(jù)包平均分發(fā)到KUBE-SEP-鏈西土。
每個KUBE-SVC-鏈后面的KUBE-SEP-鏈都和Service的后端Pod數(shù)量一樣讶舰;
KUBE-SEP-鏈通過DNAT將連接的目的地址和端口從Service的IP:port替換為后端Pod的IP:port,從而將流量轉(zhuǎn)發(fā)到相應的Pod

?  ~ iptables -L -n -t nat | grep redis-demo-svc
KUBE-MARK-MASQ  tcp  -- !172.16.0.0/16        10.68.87.193         /* default/redis-demo-svc:redis-demo-svc cluster IP */ tcp dpt:6379
KUBE-SVC-VE7MVEEUKDB7C47U  tcp  --  0.0.0.0/0            10.68.87.193         /* default/redis-demo-svc:redis-demo-svc cluster IP */ tcp dpt:6379
?  ~ iptables -S -t nat | grep KUBE-SVC-VE7MVEEUKDB7C47U
-N KUBE-SVC-VE7MVEEUKDB7C47U
-A KUBE-SERVICES -d 10.68.87.193/32 -p tcp -m comment --comment "default/redis-demo-svc:redis-demo-svc cluster IP" -m tcp --dport 6379 -j KUBE-SVC-VE7MVEEUKDB7C47U
-A KUBE-SVC-VE7MVEEUKDB7C47U -m comment --comment "default/redis-demo-svc:redis-demo-svc" -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-FICB4PLPMKAVYTRH
-A KUBE-SVC-VE7MVEEUKDB7C47U -m comment --comment "default/redis-demo-svc:redis-demo-svc" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-H4Y7KXPHOKLDT3V2
-A KUBE-SVC-VE7MVEEUKDB7C47U -m comment --comment "default/redis-demo-svc:redis-demo-svc" -j KUBE-SEP-DMEF5W3N2PX5ARY5

對于Service的流量路徑需了,首先進入的是KUBE-SERVICES
其中 -A KUBE-SERVICES -d 10.68.87.193/32 -p tcp -m comment --comment "default/redis-demo-svc:redis-demo-svc cluster IP" -m tcp --dport 6379 -j KUBE-SVC-VE7MVEEUKDB7C47U 表示對于目的地址為 10.68.87.193/32 跳昼,目的端口為 6379 的流量JUMP到 KUBE-SVC-VE7MVEEUKDB7C47U

KUBE-SVC-VE7MVEEUKDB7C47U 鏈設置為

-A KUBE-SVC-VE7MVEEUKDB7C47U -m comment --comment "default/redis-demo-svc:redis-demo-svc" -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-FICB4PLPMKAVYTRH
-A KUBE-SVC-VE7MVEEUKDB7C47U -m comment --comment "default/redis-demo-svc:redis-demo-svc" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-H4Y7KXPHOKLDT3V2
-A KUBE-SVC-VE7MVEEUKDB7C47U -m comment --comment "default/redis-demo-svc:redis-demo-svc" -j KUBE-SEP-DMEF5W3N2PX5ARY5

未完待續(xù)......

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市肋乍,隨后出現(xiàn)的幾起案子鹅颊,更是在濱河造成了極大的恐慌,老刑警劉巖墓造,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挪略,死亡現(xiàn)場離奇詭異,居然都是意外死亡滔岳,警方通過查閱死者的電腦和手機杠娱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谱煤,“玉大人摊求,你說我怎么就攤上這事×趵耄” “怎么了室叉?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵睹栖,是天一觀的道長。 經(jīng)常有香客問我茧痕,道長野来,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任踪旷,我火速辦了婚禮曼氛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘令野。我一直安慰自己舀患,他們只是感情好,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布气破。 她就那樣靜靜地躺著聊浅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪现使。 梳的紋絲不亂的頭發(fā)上低匙,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音碳锈,去河邊找鬼努咐。 笑死,一個胖子當著我的面吹牛殴胧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播佩迟,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼团滥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了报强?” 一聲冷哼從身側(cè)響起灸姊,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎秉溉,沒想到半個月后力惯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡召嘶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年父晶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弄跌。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡甲喝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铛只,到底是詐尸還是另有隱情埠胖,我是刑警寧澤糠溜,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站直撤,受9級特大地震影響非竿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谋竖,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一红柱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧圈盔,春花似錦豹芯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至众眨,卻和暖如春握牧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背娩梨。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工沿腰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人狈定。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓颂龙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親纽什。 傳聞我的和親對象是個殘疾皇子措嵌,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359