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 条评论
登录 后参与评论

相关文章

来自专栏Linyb极客之路

微服务架构:spring cloud简介

1.什么是微服务(Microservice) 微服务英文名称Microservice,Microservice架构模式就是将整个Web应用组织为一系列小的We...

3688
来自专栏杨建荣的学习笔记

自动化平台中维度设计的一点思考

今天整理了一下关于平台中的维度设计,之前总是感觉有些零乱,总是没有找到一些关联关系。 整理了一个初版内容,后续会继续完善。 自动化平台的维度设计 元数据维度设...

3616
来自专栏流柯技术学院

Tomcat性能调优方案

一、操作系统调优  对于操作系统优化来说,是尽可能的增大可使用的内存容量、提高CPU的频率,保证文件系统的读写速率等。经过压力测试验证,在并发连接很多的情况下,...

742
来自专栏Java进阶

详解zookeeper的配置文件

41810
来自专栏魏琼东

基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET平台开发指南 - 实现业务

业务分层         依据行业经验来看,分层是解决复杂问题的简单方法,通过分层,可以把一个复杂问题分解为不同层次应用的小问题,解决各层小问题的难度小于总的问...

17710
来自专栏架构师之路

微信为啥不丢“离线消息”?

需求缘起 当发送方用户A发送消息给接收方用户B时,如果用户B在线,之前的文章《微信为啥不丢“在线消息”?》聊过,可以通过应用层的确认,发送方的超时重传,接收方...

3846
来自专栏祝威廉

猛犸系统

10.猛犸也支持通过分布式Shell引擎支持传统的服务器模式。并且资源模型和传统的服务器模式同时并存,解决各自擅长的问题

622
来自专栏Java技术分享

dubbo 到底是用来干嘛的?

一个一个回答吧。 1. 负载均衡:对外提供一个公共地址,请求过来时通过轮询、随机等,路由到不同server。目的是分摊压力。    失效备援:发现一台serve...

20610
来自专栏岑玉海

Spark作业调度

  Spark在standalone模式下,默认是使用FIFO的模式,我们可以使用spark.cores.max 来设置它的最大核心数,使用spark.exec...

3857
来自专栏JAVA烂猪皮

Zookeeper的简介和应用场景

Zookeeper是一个分布式协调服务;就是为用户的分布式应用程序提供协调服务 A、zookeeper是为别的分布式程序服务的 B、Zookeeper本身就...

861

扫码关注云+社区