kubernetes pod infra container網絡原理


剛開始接觸kubernetes時,對kubelet的--pod-infra-container-image參數非常不能理解,不理解為什么我的業務應用需要依賴一個第三方的容器;

上文入門級kubernetes安裝流程中簡單提了一句,啟動pod后的兩個容器會有相同的網絡地址,這樣,多個容器可以綁定為一個pod進行管理;

本文展開來說一下這里的網絡原理;其實就是一層窗戶紙,捅破了就明白了;

 

在node上,看一下上文啟動的兩個container:

# docker ps
CONTAINER ID        IMAGE                                           COMMAND                  CREATED             STATUS              PORTS               NAMES
3e5e69a69950        <registry>/nginx/nginx                       "nginx -g 'daemon of…"   23 hours ago        Up 23 hours                             k8s_nginx_nginx-55cc995fdb-27t7z_default_1ca63ddd-7ab5-11e8-be61-3440b59f0098_0
ec311fee295d        <registry>/rhel7/pod-infrastructure:latest   "/pod"                   23 hours ago        Up 23 hours                             k8s_POD_nginx-55cc995fdb-27t7z_default_1ca63ddd-7ab5-11e8-be61-3440b59f0098_0

然后看一下它們的PID:

# docker inspect ec311fee295d|grep '\<Pid\>'
            "Pid": 26252,
# docker inspect 3e5e69a69950|grep '\<Pid\>'
            "Pid": 26349,

再看一下這兩個進程的network namespace:

# ls -l /proc/26252/ns/net
lrwxrwxrwx 1 opss root 0 6月  28 17:24 /proc/26252/ns/net -> net:[4026532927]
# ls -l /proc/26349/ns/net
lrwxrwxrwx 1 root root 0 6月  29 16:06 /proc/26349/ns/net -> net:[4026532927]

這兩個進程共用一個network namespace;但這個network namespace沒有創建在/var/run/netns下,所以ip命令查看不了,做個軟鏈好了:

# mkdir -p /var/run/netns
# ln -s /proc/26349/ns/net /var/run/netns/pod1
# ip netns 
pod1

這樣就能查看這個network namespace下的網絡信息了:

# ip netns exec pod1 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
315: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP 
    link/ether 02:42:ac:0a:3f:02 brd ff:ff:ff:ff:ff:ff
    inet 172.10.63.2/24 brd 172.10.63.255 scope global eth0
       valid_lft forever preferred_lft forever

這就是在兩個容器里看到的相同的網絡信息;

 

現在也啟動一個容器,用container網絡模式加入到已有的network namespace;

# docker run -d --rm --net="container:ec311fee295d" xxxxxx

這樣啟動一個xxxxxx容器,加入到已有的網絡,然后按同樣的辦法查看/proc/<pid>/ns/net,會發現這個容器使用的ns與前兩個相同;進入容器查看網絡信息,ip地址也與前兩個相同;

 

參考:深入解析Docker背后的namespace技術


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM