kubernetes pod infra container网络原理

时间:2022-08-02 07:22:52

刚开始接触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…" hours ago Up hours k8s_nginx_nginx-55cc995fdb-27t7z_default_1ca63ddd-7ab5-11e8-be61-3440b59f0098_0
ec311fee295d <registry>/rhel7/pod-infrastructure:latest "/pod" hours ago Up hours k8s_POD_nginx-55cc995fdb-27t7z_default_1ca63ddd-7ab5-11e8-be61-3440b59f0098_0

然后看一下它们的PID:

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

再看一下这两个进程的network namespace:

# ls -l /proc//ns/net
lrwxrwxrwx opss root 6月 : /proc//ns/net -> net:[]
# ls -l /proc//ns/net
lrwxrwxrwx root root 6月 : /proc//ns/net -> net:[]

这两个进程共用一个network namespace;但这个network namespace没有创建在/var/run/netns下,所以ip命令查看不了,做个软链好了:

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

这样就能查看这个network namespace下的网络信息了:

# ip netns exec pod1 ip addr
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue state UNKNOWN
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc noqueue state UP
link/ether ::ac:0a:3f: brd ff:ff:ff:ff:ff:ff
inet 172.10.63.2/ 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技术