网络概述

容器服务 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模式都支持通过Kubernetes原生的Network Policy进行访问控制,也都支持为Pod配置固定IP、独立的安全组与虚拟交换机。

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