一、Docker网络基础
在讨论Kubernetes网络之前,我们先看一下Docker网络。
下图展示了Docker网络在整个Docker生态技术栈中的位置:
docker容器网络模型CNM(Container Network Model):
-
Network Sandbox:一个容器内部的网络栈(管理容器的网卡、路由表以及DNS设置等)。
-
Endpoint:一个endpoint将Sandbox链接到network上,一个endpoint可以通过veth pair/open vswitch internal port等方式实现,一个endpoint只能属于一个network,也只能属于一个sandbox。
-
Network:一个network由一组可以相互通信的endpoints组成。一个network可以由linux bridge,vlan或其他方式实现,一个network中可以包含多个endpoint。
Docker网络实现: -
单机网络模式:bridge、host、joined、none
-
多级网络模式:overlay、macvlan、network plugins。
默认情况下,Docker使用bridge网络模式,bridge网络驱动的示意图如下:
二、Kubernetes网络
kubernetes网络需要解决下面4个问题:
- 集群内
- 同一个Pod中的container之间的通信
- Pod和Pod之间的通信
- Pod和Service之间的通信
- 集群外
- 外部应用与Service之间的通信
2.1. 同一个Pod中容器之间的通信
Kubernetes创建Pod时,首先会创建一个称为pause的基础架构容器,为Pod指派一个唯一的IP地址,然后以pause的网络命名空间为基础,创建同一个Pod内的其他容器(–network={container})。因此同一个Pod内的所有容器就会共享同一个网络命名空间,所以在同一个Pod内的容器可以直接由localhost进行通信。
2.2. 不同Pod中容器之间的通信
Kubernetes通过flannel、calico等网络插件解决Pod间的通信问题。本文主要介绍flannel和calico网络插件。
2.2.1 Flannel
flannel会为宿主机预先分配一个子网,并为Pod分配IP地址,并且使用Kubernetes的etcd来存储网络配置相关信息,数据包则通过VxLAN(+Directrouting)、UDP、host-gw这些类型的后端机制进行转发。
在实践中,flannel一般配合calico一起使用,flannel用来配置网络,而calico负责网络策略。
2.2.2 Calico
本文仅介绍Calico作为网络策略提供商,而不介绍Calico作为网络配置提供商。
网络策略定义了某一组Pod与另外一组Pod或者其他网络端点通信的规则。
calico创建和管理一个扁平的三层网络(不需要overlay),每个容器会分配一个可路由的IP,由于通信时不需要解包和封包,网络性能损耗小,易于排查,且易于水平扩展。并且calico基于iptables还提供了丰富而灵活的网络策略。
calico架构图:
kubernetes提供了NetworkPolicy资源用于配置网络策略,其支持namespace级别的网络隔离,注意使用NetworkPolicy需要特定的网络解决方案,比如calico就是一个很好的解决方案。
在使用NetworkPolicy之前,kubernetes默认所有的pod都是可以互通的。
NetworkPolicy提供网络策略示意图:
NetworkPolicy资源通过podSelector,egress,ingress等字段来配置kubernetes的网络策略。
2.2.3 Pod与service/外部应用于Service通信
可以参考我之前的博客<Kubernetes之服务发现ingress & ingress controller>和<Kubernetes之服务发现Service>