kubernetes集群网络

1 kubernetes网络模型

Kubernetes 要求所有的网络插件实现必须满足如下要求:

    一个Pod一个IP
    所有的 Pod 可以与任何其他 Pod 直接通信,无需使用 NAT 映射
    所有节点可以与所有 Pod 直接通信,无需使用 NAT 映射
    Pod 内部获取到的 IP 地址与其他 Pod 或节点与其通信时的 IP 地址是同一个。

2 Docker容器网络模型

网络的命名空间:Linux在网络栈中引入网络命名空间,将独立的网络协议栈隔离到不同的命令空间中,彼此间无法通信;Docker利用这一特性,实现不同容器间的网络隔离。

Veth设备对:Veth设备对的引入是为了实现在不同网络命名空间的通信。

Iptables/Netfilter:Docker使用Netfilter实现容器网络转发。

网桥:网桥是一个二层网络设备,通过网桥可以将Linux支持的不同的端口连接起来,并实现类似交换机那样的多对多的通信。

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

Docker容器网络示意图如下:
kubernetes集群网络

3 Pod网络

问题:Pod是K8S最小调度单元,一个Pod由一个容器或多个容器组成,当多个容器时,怎么都用这一个Pod IP?

实现:k8s会在每个Pod里先启动一个infra container小容器,然后让其他的容器连接进来这个网络命名空间,然后其他容器看到的网络试图就完全一样了。即网络设备、IP地址、Mac地址等。这就是解决网络共享的一种解法。在Pod的IP地址就是infra container的IP地址。
kubernetes集群网络
在 Kubernetes中,每一个Pod都有一个真实的IP地址,并且每一个Pod都可以使用此IP地址与其他 Pod通信。
Pod之间通信会有两种情况:
    两个Pod在同一个Node上
    两个Pod在不同Node上

两个Pod在同一个Node上
同节点Pod之间通信道理与Docker网络一样的,如下图

kubernetes集群网络
1.对 Pod1 来说,eth0 通过虚拟以太网设备(veth0)连接到 root namespace;
2.网桥 cbr0 中为 veth0 配置了一个网段。一旦数据包到达网桥,网桥使用ARP 协议解析出其正确的目标网段 veth1;
3.网桥 cbr0 将数据包发送到 veth1;
4.数据包到达 veth1 时,被直接转发到 Pod2 的 network namespace 中的 eth0 网络设备。

两个Pod在不同Node上
K8S网络模型要求Pod IP在整个网络中都可访问,这种需求是由第三方网络组件实现。

kubernetes集群网络

4 CNI(容器网络接口)

CNI(Container Network Interface,容器网络接口):是一个容器网络规范,Kubernetes网络采用的就是这个CNI规范,CNI实现依赖两种插件,一种CNI Plugin是负责容器连接到主机,另一种是IPAM负责配置容器网络命名空间的网络。

CNI插件默认路径:
# ls /opt/cni/bin/
地址:https://github.com/containernetworking/cni

当你在宿主机上部署Flanneld后,flanneld 启动后会在每台宿主机上生成它对应的CNI 配置文件(它其实是一个 ConfigMap),从而告诉Kubernetes,这个集群要使用 Flannel 作为容器网络方案。

CNI配置文件路径:
/etc/cni/net.d/10-flannel.conflist

当 kubelet 组件需要创建 Pod 的时候,先调用dockershim它先创建一个 Infra 容器。然后调用 CNI 插件为 Infra 容器配置网络。

这两个路径在kubelet启动参数中定义:
 --network-plugin=cni \
 --cni-conf-dir=/etc/cni/net.d \
 --cni-bin-dir=/opt/cni/bin

5 Kubernetes网络组件之Flannel

Flannel是CoreOS维护的一个网络组件,Flannel为每个Pod提供全局唯一的IP,Flannel使用ETCD来存储Pod子网与Node IP之间的关系。flanneld守护进程在每台主机上运行,并负责维护ETCD信息和路由数据包。

5.1 Flannel工作模式及原理

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin
avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: