容器网络CNI
容器化应用会在同一个节点上部署多个业务,而每个业务都需要自己的网络空间。为避免与其他业务网络冲突,
需要Pod有自己独立的网络空间,而Pod中应用需要和其他网络进行通信,就需要Pod能够跟不同的网络互相访问。可见容器网络特点如下:
- 每个Pod都拥有自己独立的网络空间和IP地址。不同Pod的应用可以监听同样的端口而不冲突。
Pod可以通过各自的IP地址互相访问。 - 集群中Pod可以通过它独立的IP地址与其他应用互通:
- 同一个集群中,Pod之间相互访问。
- Pod直接访问同一个VPC下的边缘虚拟机。
- 同一个VPC下的边缘虚拟机直接访问Pod。
Flannel网络模式
Flannel网络模式中Pod的网段独立于VPC的网段。Pod网段会按照掩码均匀划分给每个集群中的节点,每个节点上的Pod会从节点上划分的网段中分配IP地址。
Flannel网络模式的特点是:
- 支持VXLAN模式。
- Pod网段是独立于VPC的虚拟网段。
Service
由于云原生的应用,通常需要敏捷的迭代和快速的弹性, 且单一容器和其相关的网络资源的生命周期非常短暂,所以需要固定的访问地址,
以及自动负载均衡实现快速的业务弹性。ECK采用Service方式为一组容器提供固定的访问入口,并对这一组容器进行负载均衡。实现原理如下:
创建Service对象时,ECK会分配一个相对固定的Service IP地址。
通过字段selector选择一组容器,以将这个Service的IP地址和端口负载均衡到这一组容器IP和端口上。
- ClusterIP
- ClusterIP类型的Service用于集群内部的应用间访问,如果您的应用需要暴露到集群内部提供服务,需使用ClusterIP类型的Service进行暴露。
说明 创建Service时默认的Service类型为ClusterIP。
- NodePort
- NodePort类型的Service将集群中部署的应用向外暴露,通过集群节点上的一个固定端口暴露出去,这样在集群外部就可以通过节点IP和这个固定端口来访问。
- LoadBalancer
- LoadBalancer类型的Service同样是将集群内部部署的应用向外暴露,不过它是通过智能边缘云的负载均衡进行暴露的,相对于NodePort方式,有更高的可用性和性能。
- Headless Service
- Headless Service类型的Service是在Service属性中指定clusterIP字段为None类型。采用Headless Service类型后,Service将没有固定的虚拟IP地址,客户端访问Service的域名时会通过DNS返回所有的后端Pod实例的IP地址,客户端需要采用DNS负载均衡来实现对后端的负载均衡。
- ExternalName
- ExternalName类型的Service将集群外部的域名映射到集群内部的Service上,例如将外部的数据库域名映射到集群内部的Service名,那么就能在集群内部通过Service名直接访问。
Ingress
在ECK集群中,与Service的4层负载均衡不同,Ingress是集群内Service对外暴露7层的访问接入点。
您可以通过Ingress资源来配置不同的7层的转发规则,例如通过域名或者访问路径来路由到不同的Service上,从而达到7层的负载均衡作用。
服务发现DNS
ECK使用DNS来实现应用的服务发现能力,例如客户端应用可以通过Service的服务名解析出它的ClusterIP访问,可以通过StatefulSet的Pod名解析出Pod的IP地址。采用DNS服务发现的能力让集群中应用间的调用与IP地址和部署环境解耦。
集群的Coredns会将Service名自动转换成对应的Service的IP地址,来实现不同部署环境中相同的访问入口。