目录

    1. Docker 的网络模型

    1.1 bridge 模式

    默认使用 bridge 模式,也可以使用 --net=bridge 指定 bridge 模式。

    bridge 模式下,容器连接到同一个虚拟网桥 docker0 上。docker0 通常会占用 172.17.0.1/16 网段。同一个网桥上的容器之间,可以通过 ip 直接通信。

    1.2 host 模式

    使用 --net=host 指定 host 模式。

    host 模式,容器与主机共享 Network Namespace。容器直接使用主机的 IP 地址,同时,可以查看主机上的所有网络设备。

    1.3 none 模式

    使用 --net=none 指定,none 模式。

    none 模式为容器分配 Network Namespace,但是不对容器进行任何网络配置。也就是说,容器没有网卡、IP、路由等网络配置。

    1.4 container 模式

    使用 --net=container:container_id/container_name 指定 container 模式。

    container 模式可以指定与另外一个已经存在的容器,共享 IP、端口等网络资源。这两个容器之间除了网络相同,其他都是隔离的,可以通过 IO 网卡进行通信。

    2. Kubernetes 的网络模型

    2.2 Kubernetes 网络的基本原则

    每个 Pod 都拥有一个独立的 IP 地址。所有的 Pod 都在一个可以直接连通的、扁平的网络空间中。

    用户不需要额外考虑如何建立 Pod 之间的连接,也不需要考虑将容器端口映射到主机端口等问题。

    所有的容器都可以在不用 NAT 的方式下与其他的容器通信;所有节点都可以在不用 NAT 的方式下与所有容器通信;容器的地址和别人看到的地址是同一个地址。

    2.1 Kubernetes 中的 IP 类型

    Kubernetes 中的 IP 有三种:

    • Pod IP

    IP per Pod,每个 Pod 启动时,会自动创建一个镜像为 gcr.io/google_containers/pause 的容器,容器内部与外部的通信经由此容器代理,该容器的 IP 就是 Pod IP 。

    • Cluster IP

    Cluster IP 并不与实际网卡或虚拟设备绑定,而是 Iptables 规则。例如,Service Cluster IP 就是由 kube-proxy 使用 Iptables 规则重定向到其本地端口,再负载均衡到后端 Pod 上。

    • 外部 IP

    上面的 IP 都是用于内部通信,对于外部服务,需要暴露一个外部可以访问的 IP,通常是代理节点的物理 IP 地址。这里同样需要借助 kube-proxy 和 Iptables 将流量转发到后端 Pod 上。

    3. Kubernetes 中的网络场景

    3.1 同一个 Pod 内的容器

    Pod 内的容器共享同一个网络空间,容器之间的通信可以用 localhost 地址 + 容器端口实现。

    3.2 同一个 Node 内的容器

    docker0 是同一个 Node 中 Pod 的路由。Pod 的地址网段相同,可以进行直接通信。

    3.3 不同 Node 内的容器

    不同 Node 间容器通信,通过将 Pod 的 IP 和所在的 Node 的 IP 关联起来实现。

    Node 之间的通信,通过其网卡转发实现。要求对整个集群的 Pod-IP 分配需要进行规划,Pod 的 IP 地址不能冲突。

    4. 两种网络模型: CNI,CNM

    CNM 与 Docker 绑定紧密。CNI 兼容其他容器技术(例如,rkt)及上层编排系统(Kubernetes 、Mesos),社区更活跃。

    4.1 CNI

    CNI 是 CoreOS 和 Google 公司主导制定的网络模型。这个模型定义了两个组件,容器管理、网络插件。它们之间通过 Json 格式通信,实现容器的网络功能。插件实现具体功能。

    4.2 CNM

    CNM 是 Docker 公司主导的网络模型,Libnetwork 是 CNM 规范的实现,Libnetwork 提供了 Docker 守护程序和网络驱动程序之间的接口。网络控制器负责将驱动程序与网络配对。每个驱动程序负责管理其拥有的网络,包括提供给该网络的服务。每个网络有一个驱动程序,多个驱动程序可以与连接到多个网络的容器同时使用。

    4.3 CNI 插件

    • Flannel

    Flannel 是 CoreOS 开发的项目。相较于其他插件,Flannel 更容易安装和配置。Flannel 使用 Overlay 创建网络。

    • Calico

    Calico 的功能更加全面,不仅提供主机与 Pod 之间的网络连接,还涉及网络安全和管理。

    Calico 使用 BGP 路由协议在主机之间路由数据包,性能更好。除此,Calico 还提供了强大的网络策略配置,允许用户自由配置转发规则。

    • Canal

    Canal 试图将 Flannel 提供的网络层与 Calico 的网络策略功能集成在一起。

    5. 参考