一、Docker网络基础

在讨论Kubernetes网络之前,我们先看一下Docker网络。

下图展示了Docker网络在整个Docker生态技术栈中的位置:

kubernetes使用feign kubernetes endpoint_kubernetes使用feign


docker容器网络模型CNM(Container Network Model):

kubernetes使用feign kubernetes endpoint_calico_02

  • 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使用feign kubernetes endpoint_kubernetes使用feign_03

二、Kubernetes网络

kubernetes网络需要解决下面4个问题:

  • 集群内
  1. 同一个Pod中的container之间的通信
  2. Pod和Pod之间的通信
  3. Pod和Service之间的通信
  • 集群外
  1. 外部应用与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这些类型的后端机制进行转发。

kubernetes使用feign kubernetes endpoint_Pod_04


在实践中,flannel一般配合calico一起使用,flannel用来配置网络,而calico负责网络策略。

2.2.2 Calico

本文仅介绍Calico作为网络策略提供商,而不介绍Calico作为网络配置提供商。

网络策略定义了某一组Pod与另外一组Pod或者其他网络端点通信的规则。

calico创建和管理一个扁平的三层网络(不需要overlay),每个容器会分配一个可路由的IP,由于通信时不需要解包和封包,网络性能损耗小,易于排查,且易于水平扩展。并且calico基于iptables还提供了丰富而灵活的网络策略。

calico架构图:

kubernetes使用feign kubernetes endpoint_calico_05


kubernetes提供了NetworkPolicy资源用于配置网络策略,其支持namespace级别的网络隔离,注意使用NetworkPolicy需要特定的网络解决方案,比如calico就是一个很好的解决方案。

在使用NetworkPolicy之前,kubernetes默认所有的pod都是可以互通的。

NetworkPolicy提供网络策略示意图:

kubernetes使用feign kubernetes endpoint_kubernetes使用feign_06


NetworkPolicy资源通过podSelector,egress,ingress等字段来配置kubernetes的网络策略。