阿里云容器服务Kubernetes版ACK集成Kubernetes网络、阿里云VPC、阿里云SLB,提供稳定高性能的容器网络。本文介绍ACK集群网络及阿里云网络底层基础设施的重要概念,如容器网络CNI、Service、Ingress、提供服务发现能力的DNS等。您可以通过了解这些概念,更合理地设计应用部署模型和网络访问的方式。

容器网络CNI

图 1. 容器网络模型
网络CNI
容器化应用会在同一个节点上部署多个业务,而每个业务都需要自己的网络空间。为避免与其他业务网络冲突,需要Pod有自己独立的网络空间,而Pod中应用需要和其他网络进行通信,就需要Pod能够跟不同的网络互相访问。可见容器网络特点如下:
  • 每个Pod都拥有自己独立的网络空间和IP地址。不同Pod的应用可以监听同样的端口而不冲突。
  • Pod可以通过各自的IP地址互相访问。

    集群中Pod可以通过它独立的IP地址与其他应用互通:

    • 同一个集群中,Pod之间相互访问。
    • Pod直接访问同一个VPC下的ECS。
    • 同一个VPC下的ECS直接访问Pod。
    说明 Pod能直接访问同一个VPC下的ECS和同一个VPC下的ECS能直接访问Pod的前提是您需要正确设置安全组规则。关于如何设置安全组规则,请参见添加安全组规则

在ACK中,您可以通过两种网络模型实现上述容器网络的能力,分别是Flannel网络模式和Terway网络模式。这两种网络模式采用不同的网络模型,其特点如下:

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

Terway网络模式采用的是云原生的网络方案,直接基于阿里云的虚拟化网络中的弹性网卡资源来构建的容器网络。Pod会通过弹性网卡资源直接分配VPC中的IP地址,而不需要额外指定虚拟Pod网段。

Terway网络模式的特点是:

  • 容器和虚拟机在同一层网络,便于业务云原生化迁移。

  • 不依赖封包或者路由表,分配给容器的网络设备本身可以用来通信。

  • 集群节点规模不受路由表或者封包的FDB转发表等配额限制。

  • 不需要额外为容器规划Overlay的网段,多个集群容器之间只要设置安全组开放端口就可以互相通信。

  • 可以直接把容器挂到SLB后端,无需在节点上使用NodePort进行转发。

  • NAT网关可以对容器做SNAT,无需节点上对容器网段做SNAT:容器访问VPC内资源,所带的源IP都是容器IP,便于审计;容器访问外部网络不依赖conntrack SNAT,降低失败率。

  • Terway网络模式支持通过网络策略(NetworkPolicy)配置Pod间网络访问的规则。

    网络策略(NetworkPolicy)是一种关于Pod间及Pod与其他网络端点间所允许的通信规则的规范。NetworkPolicy资源使用标签选择Pod,并定义选定Pod所允许的通信规则。更多信息,请参见相关文档中的使用网络策略Network Policy

  • 在使用Alibaba Cloud Linux系统作为节点的操作系统时,Terway网络模式支持使用更高效的IPvlan+eBPF链路,加速容器网络性能。

Flannel网络模式中Pod的网段独立于VPC的网段。Pod网段会按照掩码均匀划分给每个集群中的节点,每个节点上的Pod会从节点上划分的网段中分配IP地址。Flannel网络基于阿里云VPC的自定义路由能力,来实现跨节点的Pod直接与VPC的互相访问。

Flannel网络模式的特点是:

  • 基于阿里云VPC的Flannel网络无封包,相对默认的Flannel VXLAN性能提升20%。

  • Pod网段是独立于VPC的虚拟网段。

  • 每个节点需要对应一个VPC的路由表条目,一个VPC下面Kubernetes节点数受限于VPC路由表的配额。关于VPC配额管理的详情,请参见相关文档中的管理配额

关于阿里云专有网络VPC网段和Kubernetes网段关系,请参见专有网络VPC网段和Kubernetes网段关系

关于如何选择合适的网络模式,请参见使用Terway网络插件

ACK常见网络能力一览表

分类 常见网络能力 网络插件 参考文档
Terway Flannel
网络配置管理 IPv4/IPv6双栈 支持 不支持
节点维度网络配置 支持 不支持 配置Terway网络下节点级别网络
Pod维度网络配置 支持 不支持 为Pod配置固定IP及独立虚拟交换机、安全组
Pod固定IP 支持 不支持 为Pod配置固定IP及独立虚拟交换机、安全组
Pod QoS 支持 不支持 为Pod配置QoS
网络策略Network Policy 支持 不支持 使用网络策略Network Policy
设置Pod安全组 支持 不支持
扩容Pod网段 支持 不支持
使用VPC的多路由表功能 支持 支持
南北向访问 Pod访问公网 支持 支持
从公网直接访问Pod 支持 不支持
使用LoadBalancer服务 支持 支持 通过使用自动创建SLB的服务公开应用
使用Ingress 支持 支持 Ingress概述

Service

由于云原生的应用,通常需要敏捷的迭代和快速的弹性,且单一容器和其相关的网络资源的生命非常短暂,所以需要固定的访问地址,以及自动负载均衡实现快速的业务弹性。ACK采用Service方式为一组容器提供固定的访问入口,并对这一组容器做负载均衡。实现原理如下:
  • 创建Service对象时,ACK会分配一个相对固定的Service IP地址。
  • 通过字段selector选择一组容器,以将这个Service IP地址和端口负载均衡到这一组容器IP和端口上。
Service网络支持以下多种模式分别对接不同来源和类型的客户端的访问:
  • ClusterIP
    ClusterIP类型的Service用于集群内部的应用间访问,如果您的应用需要暴露到集群内部提供服务,需使用ClusterIP类型的Service暴露。
    说明 创建Service时默认的Service类型为ClusterIP。
  • NodePort
    NodePort类型的Service将集群中部署的应用向外暴露,通过集群节点上的一个固定端口暴露出去,这样在集群外部就可以通过节点IP和这个固定端口来访问。
  • LoadBalancer
    LoadBalancer类型的Service同样是将集群内部部署的应用向外暴露,不过它是通过阿里云的负载均衡进行暴露的,相对于NodePort方式,有更高的可用性和性能。关于如何通过LoadBalancer类型Service暴露应用,请参见通过使用已有SLB的服务公开应用通过使用自动创建SLB的服务公开应用
  • Headless Service
    Headless Service类型的Service是在Service属性中指定clusterIP字段为None类型。采用Headless Service类型后,Service将没有固定的虚拟IP地址,客户端访问Service的域名时会通过DNS返回所有的后端Pod实例的IP地址,客户端需要采用DNS负载均衡来实现对后端的负载均衡。
  • ExternalName
    ExternalName类型的Service将集群外部的域名映射到集群内部的Service上,例如将外部的数据库域名映射到集群内部的Service名,那么就能在集群内部通过Service名直接访问。

关于Service的负载均衡配置需要注意内容,请参见Service的负载均衡配置注意事项

Ingress

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

图 2. Ingress和Service关系
Ingress和Service关系图

示例

常见的前后端分离的架构方式中,前后端的访问地址分别使用不同的访问路径。对应这种场景,可以采用Ingress,根据7层的访问路径负载到不同的应用实例上。示例图

服务发现DNS

ACK使用DNS来实现应用的服务发现能力,例如客户端应用可以通过Service的服务名解析出它的ClusterIP访问、可以通过StatefulSet的Pod名解析出Pod的IP地址。采用DNS服务发现的能力让集群中应用间的调用与IP地址和部署环境相解耦。

集群的Coredns会将Service名自动转换成对应的Service的IP地址,来实现不同部署环境中同样的访问入口。关于集群DNS组件的使用和调优详细信息,请参见DNS原理和配置说明dns

网络底层基础设施

  • VPC

    阿里云专有网络VPC(Virtual Private Cloud)是基于阿里云创建的自定义私有网络,不同的专有网络之间彻底逻辑隔离。您可以在专有网络内创建和管理云产品实例,例如云服务器、云数据库RDS版和负载均衡等。

    每个VPC都由一个路由器、至少一个私网网段和至少一个交换机组成。vpc
    • 私网网段

      在创建专有网络和交换机时,您需要以CIDR地址块的形式指定专有网络使用的私网网段。

      您可以使用下表中标准的私网网段及其子网作为VPC的私网网段,也可以使用自定义地址段作为VPC的私网网段。更多信息,请参见网络规划

      网段 说明
      192.168.0.0/16 可用私网IP数量(不包括系统保留地址):65,532
      172.16.0.0/12 可用私网IP数量(不包括系统保留地址):1,048,572
      10.0.0.0/8 可用私网IP数量(不包括系统保留地址):16,777,212
      自定义地址段 除100.64.0.0/10、224.0.0.0/4、127.0.0.0/8、169.254.0.0/16及其子网外的自定义地址段
    • 路由器

      路由器(vRouter)是专有网络的枢纽。作为专有网络中重要的功能组件,它可以连接专有网络内的各个交换机,同时也是连接专有网络和其他网络的网关设备。每个专有网络创建成功后,系统会自动创建一个路由器。每个路由器关联一张路由表。

      更多信息,请参见路由表概述

    • 交换机

      交换机(vSwitch)是组成专有网络的基础网络设备,用来连接不同的云资源。创建专有网络后,您可以通过创建交换机为专有网络划分一个或多个子网。同一专有网络内的不同交换机之间内网互通。您可以将应用部署在不同可用区的交换机内,提高应用的可用性。

      更多信息,请参见交换机

  • SLB

    阿里云负载均衡SLB(Server Load Balancer)通过设置虚拟服务地址,将添加的ECS实例虚拟成一个高性能、高可用的应用服务池,并根据转发规则,将来自客户端的请求分发给云服务器池中的ECS实例。

    负载均衡默认检查云服务器池中的ECS实例的健康状态,自动隔离异常状态的ECS实例,消除了单台ECS实例的单点故障,提高了应用的整体服务能力。此外,负载均衡还具备抗DDoS攻击的能力,增强了应用服务的防护能力。

    负载均衡由以下三个部分组成:
    • 负载均衡实例

      一个负载均衡实例是一个运行的负载均衡服务,用来接收流量并将其分配给后端服务器。要使用负载均衡服务,您必须创建一个负载均衡实例,并至少添加一个监听和两台ECS实例。

    • 监听

      监听用来检查客户端请求并将请求转发给后端服务器。监听也会对后端服务器进行健康检查。

    • 后端服务器

      一组接收前端请求的ECS实例。您可以单独添加ECS实例到服务器池,也可以通过虚拟服务器组或主备服务器组来批量添加和管理。