云容器服务为满足多种复杂场景下项目间的互相访问,提供了不同的访问方式,从而满足不同场景提供不同访问通道。
约束与限制
- 每个资源池下,创建的网络数量不能超过6000个。此处的网络服务对应kubernetes的service资源,即项目所添加的服务。
- 容器开启hostPort或hostNetwork网络模式后,若需对外提供服务,则需要给容器所在节点开启对应端口的安全组(containerPort)。
Service基本概念
Kubernetes中每一个工作负载会有一个或多个实例(Pod),每个实例(Pod)的IP地址由网络插件动态随机分配(Pod重启后IP地址会改变)。为屏蔽这些后端实例的动态变化和对多实例的负载均衡,引入了Service这个资源对象。
Service是一种资源,提供了我们访问单个或多个容器应用的能力。每个服务在其生命周期内,都拥有一个固定的IP地址和端口。每个服务对应了后台的一个或多个Pod,通过这种方式,客户端就不需要关心Pod所在的位置,方便后端进行方便的Pod扩容、缩容等操作。
用户在Kubernetes中可以部署各种容器,其中一部分是通过HTTP、HTTPS协议对外提供七层网络服务,另一部分是通过TCP、UDP协议提供四层网络服务。而Kubernetes定义的Service资源就是用来管理集群中四层网络的服务访问。
根据创建Service的type类型不同,可分成如下模式:
ClusterIP:默认类型,为服务分配集群虚拟IP,此时集群内部的pod可以通过服务名称寻址到服务的集群虚拟IP地址,集群外无效。
NodePort:在每个节点上为服务分配静态端口号,注意此端口号占用的是节点网络,此时如果在集群外部访问任何一个节点的IP地址加指定的端口号,kube-proxy会将流量转发到服务的集群虚拟IP,再由虚拟IP寻址到Pod。
ClusterIP和NodePort类型的Service,在不同云服务商或是自建集群中的行为表现通常情况下相同。而LoadBalancer类型的Service,由于使用了云服务商的负载均衡进行服务暴露,云服务商会围绕其负载均衡的能力提供不同的额外功能。例如,控制负载均衡的网络类型,后端绑定的权重调节等,详情请参见本章相关文档。
服务访问方式
支持以下类型的互联互通:
集群内访问(ClusterIP)
工作负载暴露给同一集群内其他工作负载访问的方式,可以通过“集群内部域名”访问。集群内部域名格式为“<自定义的访问方式名称>.<工作负载所在命名空间>.svc.cluster.local”,例如“nginx.default.svc.cluster.local”。详细请参见集群内访问(ClusterIP)。
节点访问(NodePort)
节点访问 ( NodePort )是指在每个节点的IP上开放一个静态端口,通过静态端口对外暴露服务。节点访问 ( NodePort )会路由到ClusterIP服务,这个ClusterIP服务会自动创建。通过请求
七层负载均衡(Ingress)
通常情况下,service 和 pod 的 IP 仅可在集群内部访问。集群外部的请求需要通过负载均衡转发到 service 在 Node 上暴露的 NodePort 上,然后再由 kube-proxy 通过边缘路由器 (edge router) 将其转发给相关的 Pod 或者丢弃,而 Ingress 就是为进入集群的请求提供路由规则的集合。
Ingress 可以给 service 提供集群外部访问的 URL、负载均衡、SSL 终止、HTTP 路由等。为了配置这些 Ingress 规则,集群管理员需要部署一个 Ingress controller,它监听 Ingress 和 service 的变化,并根据规则配置负载均衡并提供访问入口。
Ingress 的组成部分:
- Nginx:实现负载均衡到pod的集合。
- Ingress Controller:从集群api获取services对应pod的ip到nginx配置文件中。
- Ingress:为nginx创建虚拟主机。
网络策略(NetworkPolicy)
网络策略(NetworkPolicy)是一种关于pod间及pod与其他网络端点间所允许的通信规则的规范。
NetworkPolicy 资源使用标签选择pod,并定义选定pod所允许的通信规则,详细请参见网络策略(NetworkPolicy)。