网络概述

容器服务 Kubernetes 版 ACK(Container Service for Kubernetes)将Kubernetes网络设计应用到了阿里云的资源上,提供了稳定高性能的容器网络。本文介绍ACK中容器网络的重要概念,例如容器网络插件CNI、Service、Ingress、提供服务发现能力的DNS等。您可以通过了解这些概念,更合理地设计应用部署模型和网络访问的方式。

容器网络插件(CNI Plugin)

image

Kubernetes本身并未实现容器间的网络互联能力,但是它通过容器网络接口(CNI)对容器间的网络做出了标准化的定义:

  • Pod在容器网络中的状态随着Pod生命周期而变化。例如,Pod创建后需要加入网络,销毁后需要退出网络。

  • Pod在容器网络中拥有唯一的IP地址,以便于识别身份。

  • Pod可以与集群内的端点与集群外的端点互相访问。

容器网络插件(CNI Plugins)负责容器网络的具体实现。容器网络插件决定了Pod IP地址分配的机制、是否使用Overlay网络、集群内流量的转发链路、对Pod的访问控制机制等容器网络特性。目前已经有很多知名的开源容器网络插件,如Calico、Flannel、Cilium等。

容器服务 Kubernetes 版支持两种容器网络插件:Terway与Flannel。这两种插件拥有不同的特性,请参照下方的介绍以及Terway与Flannel的对比文档,在创建集群前完成容器网络插件的选型。

重要

集群创建完成后,不支持Terway与Flannel之间的变更切换。

Terway容器网络插件

Terway网络插件是阿里云自研的容器网络插件。在容器服务 Kubernetes 版中作为节点的ECS实例使用ENI(弹性网卡)进行网络通信,Terway将节点的ENI分配给Pod,为Pod提供了网络互联能力。因此,在使用Terway时,Pod直接接入VPC网络。由于不需要使用VXLAN等隧道技术封装报文,Terway模式网络具有较高的通信性能。Terway适用于大规模集群以及对网络性能和访问控制能力有较高需求的场景。

在创建集群并安装Terway网络插件时,可以为Terway配置不同的工作模式。这些工作模式的区别主要在以下三个维度:

  • Pod IP地址分配:Terway拥有两种IP地址分配模式:独占ENI模式与共享ENI模式。独占ENI模式中,Pod独占节点的ENI,拥有极致的网络性能;而共享ENI模式中,Pod共享节点的ENI,拥有更高的部署密度。

  • 网络加速能力:共享ENI模式支持DataPathv2加速模式。选择加速模式后,Terway会采取不同于共享ENI常规模式的流量转发链路,实现更快的网络通信。

  • 访问控制能力:共享ENI模式与独占ENI模式都支持为Pod配置固定IP、独立的安全组与虚拟交换机,独占ENI模式支持通过Kubernetes原生的Network Policy进行访问控制。

Flannel容器网络插件

Flannel是一个经典的开源容器网络插件,它使用VXLAN等虚拟化网络技术为Pod构建了一个Overlay网络。Flannel的配置简单、易于使用,但是网络性能会受到NAT损失的影响,访问控制能力相较于Terway也更弱,并且集群的节点数量上限较低。Flannel适用于节点数量不超过1000的小规模集群,以及对网络性能和访问控制能力需求较低,希望快速搭建、使用集群的场景。

重要

关于Terway和Flannel插件的详细能力对比,请参见Terway与Flannel的对比

服务(Service)

由于云原生应用通常需要敏捷的迭代和快速的弹性,Pod在Kubernetes中被认为是临时性的、随时可替换的资源。当Pod被销毁、替换时,与其相关的网络资源也会发生变化,因此需要为Pod提供固定的访问方式。Kubernetes采用Service方式为一组拥有相同功能的容器提供固定的访问入口,并对这一组容器进行负载均衡。实现原理如下:

  • 通过Selector关联一组容器,以将这个Service的IP地址和端口负载均衡到这一组容器IP和端口上。

  • 在Pod发生变化时,Service会自动更新后端的转发规则,以保证通过Service能访问到最新的Pod。

ACK集群中的Service目前支持ClusterIP、NodePort、LoadBalancer、Headless Service、ExternalName模式,适用于集群内访问、集群外访问、公网访问等场景,详细信息请参见Service快速入门

路由(Ingress)

在ACK集群中,与Service的4层负载均衡不同,Ingress是集群内Service对外暴露7层的访问接入点,用于为集群中的多个Service提供统一的入口。您可以通过Ingress资源来配置不同的7层的转发规则,例如通过域名或者访问路径来路由到不同的Service上,从而达到7层的负载均衡作用。更多信息,请参见Ingress概述

image

服务发现DNS

ACK使用DNS来实现应用的服务发现能力,例如客户端应用可以通过Service的服务名解析出它的ClusterIP访问,再通过Service访问后端Pod。采用DNS服务发现的能力让集群中应用间的调用与IP地址和部署环境解耦。关于集群DNS组件的详细信息,请参见DNS概述

image