Kubernetes学习笔记(三十四):Docker Networking、CNI
Docker Networking

当您运行容器时,您有不同的网络选项可供选择:
-
container无法到达外部,外部也无法访问container
docker run --network none nginx -
容器链接到host,host和容器之间没有网络隔离无需接口转发,但两个进程无法同时侦听同一端口
docker run --network host nginx -
第三种网络选项是bridge,在这种情况下,会创建一个内部专用网络,Docker主机和容器将连接到该网络。
Docker在内部使用了一种类似于我们在network ns中讲的技术,即运行类型设置为bridge的IP link add 命令,ip link add docker0 type bridge。
当Docker安装在主机上时,默认情况下,会创建一个称为 bridge 的内部专用网络,可由 docker network ls 查看。但在host上由 ip link 查看,显示为 docker0。
根据ip link 查看 docker0接口状态为 DOWN,接口或网络当前已关闭。
还记得我们说过,bridge网络就像是host的接口,但它也是host内部ns或者container的交换机。根据ip addr可以查看docker0被分配的IP地址。
每当创建container时,Docker都会为其创建一个ns,运行 ip netns命令可以列出ns(需要设置)。
docker inspect ns-name可以看到与每个容器关联的ns。
docker或者说 ns 连接到 bridge 上的方式和之前说的一样。如果在docker host上运行 ip link,我们会看到接口的一端连接到本地 bridge master docker0
用 ip -n b3165c10a92b link 连接到container上,可以看到对应的接口,用 ip -n b3165c10a92b addr 查看对应IP地址
接口通常成对匹配,container偶数,bridge接口为奇数
将docker上的8080端口映射到container的80上:docker run -p 8080:80 nginx,实现原理也一样 iptables -t nat -A DOCKER --dport 80 --to-destination 172.17.0.3:80 -j DNAT,查看的命令 iptables -nvL -t nat
CNI - Container Networking Interface
VETH : virtual Ethernet devices
| Network Namespaces | docker |
|---|---|
| 1. Create Network Namespace | 1. Create Network Namespace |
| 2. Create Bridge Network/Interface | 2. Create Bridge Network/Interface |
| 3. Create VETH Pairs (Pipe, Virtual Cable) | 3. Create VETH Pairs (Pipe, Virtual Cable) |
| 4. Attach VETH to Namespace | 4. Attach VETH to Namespace |
| 5. Attach Other VETH to Bridge | 5. Attach Other VETH to Bridge |
| 6. Assign IP Address | 6. Assign IP Address |
| 7. Bring the interfaces up | 7. Bring the interfaces up |
| 8. Enable NAT - IP Masquerade | 8. Enable NAT - IP Masquerade |
统一的步骤2~8步,可以用bridge命令运行,指定将容器添加到ns:
bridge add 2e34dcf34 /var/run/netns/2e34dcf34
bridge add <container id> <namespace>
CNI (Container Networking Interface) :
- container runtime
- 容器运行时必须创建网络命名空间
- 标识容器必须连接到的网络
- 添加容器时调用网络插件(网桥)的容器运行时
- 删除容器时调用网络插件(网桥)的容器运行时
- 网络配置的JSON格式
- 插件方面
- 必须支持命令行参数ADD/DEL/CHECK
- 必须支持参数container id、network ns等
- 必须管理POD的IP地址分配
- 必须以特定格式返回结果
CNI已经附带了一组支持的插件,如bridge、vlan、ipvlan、macvlan、windows,以及IPAM插件,如DHCP、host-local,还有一些其他第三方组织提供的插件。
但Docker有一套自己的标准,称为CNM(Container Network Model),不适配CNI,所以无法运行 docker run --network=cni-bridge nginx,但这并不意味着Docker无法应用CNI,你可以创建一个没有任何网络配置的Docker容器 docker run --network=none nginx,然后手动调用bridge插件,k8s就是这么做的 bridge add 2e34dcf34 /var/run/netns/2e34dcf34
https://kubernetes.io/docs/setup/independent/install-kubeadm/#check-required-ports
查看所有支持的CNI插件:/opt/cni/bin
查看当前使用的CNI插件:ls /etc/cni/net.d/
查看kubelet的container runtime:ps -aux | grep kubelet | grep --color container-runtime
常用命令
ifconfig -a:显示所有接口,包括环回接口、集群使用的实际物理接口等
cat /etc/network/interfaces:显示所有物理接口,环回接口、物理接口
ip link:显示此系统上的所有物理链路,ip link show eth0 = ifconfig eth0
ip route show default:查看默认网关,或者 ip r
netstat -natulp | grep scheduler:-p programs,-l listening,-t tcp

浙公网安备 33010602011771号