docker网络基础

网络的命名空间

linux在网络栈中引入网络命名空间,从而支持网络协议栈的多个实例。这些独立的协议栈被隔离到不同的命名空间。
Linux在网络栈中引入网络命名空间,将独立的网络协议栈隔离到不同的命令空间中,彼此间无法通信;docker利用这一特性,实现不容器间的网络隔离。

Veth设备对

Veth设备对可以在不同的网络命名空间之间进行通信,直连两个网络命名空间。
veth设备可以在不同网络命名空间之间转移的设备。

网桥

将多个不同网络连接起来并实现多个网络中主机的相互通信。
网桥是二层的虚拟网络设备,把多个网络接口“连接”起来,使得网口之间的报文能够互相转发。实现类似交换机的多对多通信。
docker0网桥的IP地址作为默认网关。

Iptables/Netfilter

自定义的数据包处理过程。
linux网络协议栈中有一组回调函数挂接点,在这些挂接点挂接的钩子函数可以在linux网络栈处理数据包的过程中对数据包进行操作。
Netfilter是在内核模式下,执行挂接的规则;Iptables是在用户模式下,协助维护内核中Netfilter的规则表。通过二者共同实现linux网络协议栈的数据包处理机制。

================= 上层协议处理=================
^ ||
||
INPUT OUTPUT
|| ||
路由 ======== > FORWARD ======== > ||
|| ||
PREROUTING POSTROUTING
================= 接口设备 =================

路由

路由功能由IP层的路由表来实现。
Linux系统包含一个完整的路由功能,当IP层在处理数据发送或转发的时候,会使用路由表来决定发往哪里

在Kubernetes网络中存在两种IP(Pod IP和Service Cluster IP),Pod IP 地址是实际存在于某个网卡(可以是虚拟设备)上的,Service Cluster IP它是一个虚拟IP

是由kube-proxy使用Iptables/ipvs规则重新定向到其本地端口,再均衡到后端Pod的。

docker的网络实现

docker支持四种网络模式:host、container、none、bridge。
k8s只使用bridge模式。在bridge模式下,docker daemon在首次启动时会创建虚拟网桥docker0。然后按照RPC1918的模型,在私有网络空间中给网桥分配一个子网。后面由docker创建出来的容器,都会创建一个虚拟的以太网设备(Veth设备对),其中一端关联到网桥上,另一端使用Linux的网络命名空间技术,映射到容器内的eth0设备,然后从网桥的地址段内给eth0接口分配一个IP地址。

你可能感兴趣的:(docker网络基础)