Bota5ky

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

posted @ 2022-09-14 21:45  Bota5ky  阅读(169)  评论(0)    收藏  举报