kubenerters中对于服务的访问,提供了多种访问方式,以适应不同的使用场景。其中主要的访问方式有ClusterIP,NodePort以及LoadBalancer三种。
三种访问方式详细对比说明入下表所示:
访问方式 | 说明 | 优点 | 缺点 | 备注 |
---|---|---|---|---|
ClusterIP方式 | 默认类型,自动分配一个仅cluster内部可以访问的虚拟IP。可以通过ServiceIP:Port来访问该服务 | 使用简单 | 仅支持集群内部访问 | --------- |
NodePort方式 | 在ClusterIP基础上为Service在每台机器上绑定一个端口,这样就可以通过NodeIP:NodePort来访问该服务 | 支持内部和外部访问,无额外外部依赖 | 直接作为负载均衡器,性能较差。同一个集群内,服务的NodePort不可重复。 | NodePort默认端口范围为30000~32768 |
LoadBalancer方式 | 在NodePort的基础上,借助cloud provider创建一个外部的负载均衡器,并将请求转发到NodeIP:NodePort | 能更好的利用平台的负载均衡能力 | 创建时依赖于各个云平台的cloud provider,存在两次转发 | K8S 1.6中cloud provider已经独立成cloud-controller-manager |
(1) ClusterIP访问方式,适用于集群内服务间相互访问的场景,其访问的流程如下图所示:
访问的数据流向为: Pod Front>ServiceIP:Port-->kube-proxy(iptables)-->Pod Backend
1、Pod Front-->kube-proxy: 通过ServiceIP:Port访问,ServiceIP可以通过环境变量或者dns查询
2、kube-proxy-->Pod Backend 通过Iptable或者tcp端口转发到Backend服务的任意一个端口,可能在同一节点,也可能在不同节点
(2) NodePort访问方式,在无外部负载均衡器的情况下,可以通过NodePort提供外部访问的能力,其访问的流程如下图所示:
访问的数据流向为: Client-->NodeIP:NodePort>kube-proxy(iptables)-->Pod Backend
1、Client-->kube-proxy: 通过NodeIP:NodePor访问,NodeIP可以是集群中任意一个节点的IP,NodePort一般通过K8S随机分配,默认分配范围为30000---32768
2、kube-proxy-->Pod Backend: (同ClusterIP访问)
(3) 在外部存在负载均衡器的情况下,一般通过LoadBalancer的方式实现外网访问(其底层依赖于NodePort),其访问的流程如下图所示:
访问的数据流向为: Client-->VIP:VPort-->负载均衡器-->NodeIP:NodePort>kube-proxy(iptables)-->Pod Backend
1、 Client-->负载均衡器: 通过VIP:VPor访问,也可以通过负载均衡器中绑定的域名进行访问
2、负载均衡器-->kube-proxy: 负载均衡器在可用的节点中,根据均衡算法选择一个节点进行转发,转发的目的端口为NodePort
3、kube-proxy-->Pod Backend: (同ClusterIP访问)
腾讯云容器服务目前提供的服务访问方式包括: 对公网负载均衡访问,同VPC内(内网)负载均衡访问,仅集群内访问等几种方式。同时用户也可以通过创建ingress负载均衡器,先通过外部的负载均衡器将流量转发到ingress Pod上,再有ingress实现转发(目前仅支持7层转发)。
(1) 外网负载均衡访问,在创建服务时选择负载均衡访问方式为公网。客户端访问流程K8S集群中的服务流程入下图所示:
访问的数据流向为: Client-->VIP:VPort(外网IP)-->外网负载均衡器-->NodeIP:NodePort>kube-proxy(iptables)-->Pod Backend
访问的具体流程,与LoadBalancer访问方式相同,腾讯云容器服务在K8S内嵌入腾讯云的Cloud Provider。在控制台创建服务时,如果选择了公网访问,腾讯云的Cloud Provider会自动调用腾讯云的CLB(负载均衡)服务创建一个外网的LB,并与该服务绑定。
在容器服务控制台,点击服务-->选中一个服务后单击-->选中展示服务信息可以看到服务中访问有关的信息,下图是作者用来的一个例子:
其中访问相关的信息包括: 服务关联的负载均衡器,外部访问服务的方式(通过VIP:VPort),集群内范围服务的方式(通过ServiceIP:Port)等
点击展示的负载均衡器LB,跳转到负载均衡器页面,可以看到负载均衡器信息。
从负载均衡器中的展示信息可以看到,负载均衡器暴露服务端口(在服务创建时用户填写,建议与容器端口保持一致)对外提供访问,负载均衡器后端监听各个Node节点,监听端口为该K8S为该服务分配的NodePort(该端口由集群随机分配,默认范围为30000~32768)。
(2) 同VPC内(内网)负载均衡访问,在创建服务时选择负载均衡访问方式为内网。客户端访问流程K8S集群中的服务流程入下图所示:
访问的数据流向为: Client-->VIP:VPort(内网IP)-->外网负载均衡器-->NodeIP:NodePort>kube-proxy(iptables)-->Pod Backend
处理流程与通过外网负载均衡访问集群内服务相同,只是负载均衡器VIP为一个内网IP,仅支持在同一VPC内访问,不提供外网访问的能力。在控制台创建服务时,负载均衡器模式选择内网,腾讯云的Cloud Provider会自动调用腾讯云的CLB(负载均衡)服务创建一个内网的LB,并与该服务绑定。
(3) 仅集群内访问,创建服务时默认提供服务间互相访问的能力,通过服务名称和ServerIP都可以访问,但仅限于集群内部服务互访:
访问的数据流向为: Pod Front-->DNS-->Pod Front--->ServiceIP:Port-->kube-proxy(iptables)-->Pod Backend
集群内访问能力,为默认提供的能力,如果需要仅支持集群内访问则在创建服务时选择[仅支持集群内访问]选项。(在外网和内网负载均衡器访问的服务中,集群内访问能力依然支持)
安全组策略设置,一直遵循的原则是开放最小权限。例如在一个Web服务的场景中,访问流程入下图所示:
访问的数据流向为: Client-->VIP:VPort(外网IP)-->外网负载均衡器-->前端服务-->后端服务
根据安全组设置最小权限原则,安全组开放规则为:
前端服务节点开放8080端口的外网/内网入规则,开放9376端口的内网出规则
后端服务节点开放9376端口的内网入规则
在K8S集群中,由于前端服务和后端服务采用分布式部署的策略,根据资源的使用情况不同服务的POD还会出现实例的迁移。所以建议在设置容器服务安全组策略时,将集群内所有节点的安全组策略设置为一样。
同时考虑腾讯云容器服务中提供的访问方式,外网负载均衡,内网负载均衡,集群内访问,访问的数据流为 外网负载均衡数据流: Client-->VIP:VPort(外网IP)-->外网负载均衡器-->NodeIP:NodePort>kube-proxy(iptables)-->Pod Backend
内网负载均衡数据流: Client-->VIP:VPort(内网IP)-->外网负载均衡器-->NodeIP:NodePort>kube-proxy(iptables)-->Pod Backend
集群内服务互相访问: Pod Front-->DNS-->Pod Front--->ServiceIP:Port-->kube-proxy(iptables)-->Pod Backend
所以需要放通的安全组规则为:
1、放通该服务NodePort内/外网访问的入规则 (外网负载均衡,内网负载均衡)
2、放通该服务容器端口内网访问的出/入规则 (外网负载均衡,内网负载均衡,集群内访问)
3、放通DNS服务访问的53端口,UDP协议
为了简化用户在设置集群中服务访问安全组规则的复杂性,腾讯云容器服务提供了集群中服务访问的通用规则模板。用户在集群创建时,点击新建安全组,则可以自动创建。该模板规则如下:
通用规则规则为:
入规则:放通30000~32768端口,支持通过NodePort的访问 放通内网直接相互访问,支持服务直接集群内互访 放通SSH服务22端口 (Linux主机通用设置)
出规则: 放通全部端口
在创建集群或者往集群内添加主机时,建议将安全组规则设置为该模板提供的通用规则。如果有更强的安全防范需求,用户可以在该规则的基础上,做进一步的修改,以满足业务的访问需求,但最小规则应该满足集群中服务访问所需要满足的规则。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。