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 删除。

编辑于

我来说两句

2 条评论
登录 后参与评论

相关文章

来自专栏温安适的blog

基于zookeeper+leveldb的activemq集群

3664
来自专栏python3

清理Linux内存

因为LINUX的内核机制,一般情况下不需要特意去释放已经使用的cache。这些cache起来的内容可以增加文件以及的读写速度。

721
来自专栏后端技术探索

[干货实战]为最佳性能调优nginx

通常来说,一个优化良好的 Nginx Linux 服务器可以达到 500,000 – 600,000 次/秒 的请求处理性能,然而我的 Nginx 服务器可以稳...

612
来自专栏铭毅天下

干货 | Elasticsearch集群黄色原因的终极探秘

绿色——最健康的状态,代表所有的主分片和副本分片都可用; 黄色——所有的主分片可用,但是部分副本分片不可用; 红色——部分主分片不可用。(此时执行查询部分数...

390
来自专栏Laoqi's Linux运维专列

Nginx+Tomcat实现Web服务器的负载均衡

4336
来自专栏bboysoul

使用树莓派正确上网

我的寝室里有很多设备都需要正确上网,如果我一个一个去配置寝室里的机器让他们正确上网,这太麻烦了,要写ip写加密方式写....所以有没有一个方便的方式来让我正确的...

633
来自专栏java 成神之路

window 查找 java 进程中占用cpu比较高的线程

3309
来自专栏DeveWork

WordPress登陆不了后台的原因及解决方法(登陆界面不断返回)

应该说,这是一个常见的现象。这种现象具体为:在后台登陆界面输入账号密码后,点击进入却无任何反应及提示。更换浏览器也是一样。 出现如上问题,请检查一下,你的电脑是...

22211
来自专栏搜云库

CentOs7.3 搭建 Redis-4.0.1 Cluster 集群服务

CentOs7.3 搭建 Redis-4.0.1 Cluster 集群服务 Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key...

46310
来自专栏从零开始的linux

tomcat redis nginx session共享

使用Nginx作为Tomcat的负载平衡器,Tomcat的会话Session数据存储在Redis,能够实现零宕机的7x24效果。因为将会话存储在Redis中,因...

3583

扫码关注云+社区