Kubenerters中多种服务访问方式以及相应的安全组设置在腾讯云的落地实践

一、kubenerters服务的三种访问方式介绍

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访问)

二、kubenerters服务访问在腾讯云容器中的使用情况

腾讯云容器服务目前提供的服务访问方式包括: 对公网负载均衡访问,同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主机通用设置)

出规则: 放通全部端口

在创建集群或者往集群内添加主机时,建议将安全组规则设置为该模板提供的通用规则。如果有更强的安全防范需求,用户可以在该规则的基础上,做进一步的修改,以满足业务的访问需求,但最小规则应该满足集群中服务访问所需要满足的规则。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

Mix 10 上的asp.net mvc 2的相关Session

Beyond File | New Company: From Cheesy Sample to Social Platform Scott Hansel...

2787
来自专栏杨龙飞前端

scrollto 到指定位置

2964
来自专栏pangguoming

Spring Boot集成JasperReports生成PDF文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲...

1.4K7
来自专栏张善友的专栏

Miguel de Icaza 细说 Mix 07大会上的Silverlight和DLR

Mono之父Miguel de Icaza 详细报道微软Mix 07大会上的Silverlight和DLR ,上面还谈到了Mono and Silverligh...

3007
来自专栏大内老A

The .NET of Tomorrow

Ed Charbeneau(http://developer.telerik.com/featured/the-net-of-tomorrow/) Exciti...

39110
来自专栏Ceph对象存储方案

Luminous版本PG 分布调优

Luminous版本开始新增的balancer模块在PG分布优化方面效果非常明显,操作也非常简便,强烈推荐各位在集群上线之前进行这一操作,能够极大的提升整个集群...

3675
来自专栏一个爱瞎折腾的程序猿

sqlserver使用存储过程跟踪SQL

USE [master] GO /****** Object: StoredProcedure [dbo].[sp_perfworkload_trace_s...

2910
来自专栏我和未来有约会

Kit 3D 更新

Kit3D is a 3D graphics engine written for Microsoft Silverlight. Kit3D was inita...

2936
来自专栏张善友的专栏

LINQ via C# 系列文章

LINQ via C# Recently I am giving a series of talk on LINQ. the name “LINQ via C...

3015
来自专栏张善友的专栏

Silverlight + Model-View-ViewModel (MVVM)

     早在2005年,John Gossman写了一篇关于Model-View-ViewModel模式的博文,这种模式被他所在的微软的项目组用来创建Expr...

3308

扫码关注云+社区