预备知识

1. K8S 上 Service 类型

  • ClusterIP

通过集群的内部 IP 暴露服务,选择该值,服务只能够在集群内部可以访问,这也是默认的 ServiceType。

  • NodePort

通过每个 Node 上的 IP 和静态端口(NodePort)暴露服务。 NodePort 服务会路由到 ClusterIP 服务,这个 ClusterIP 服务会自动创建。 通过请求 :,可以从集群的外部访问一个 NodePort 服务。

  • LoadBalancer

使用云提供商的负载局衡器,可以向外部暴露服务。 外部的负载均衡器可以路由到 NodePort 服务和 ClusterIP 服务。

  • ExternalName

通过返回 CNAME 和它的值,可以将服务映射到 externalName 字段的内容(例如, foo.bar.example.com)。 没有任何类型代理被创建。本文暂不讨论这种类型。

参考文档:https://cloud.tencent.com/document/product/457/45487

平台相关基础知识

腾讯云容器服务(Tencent Kubernetes Engine ,TKE)基于原生 Kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,完全兼容原生 Kubernetes API ,同时扩展了腾讯云的云硬盘、负载均衡等 kubernetes 插件,为容器化的应用提供高效部署、资源调度、服务发现和动态伸缩等一系列完整功能,解决用户开发、测试及运维过程的环境一致性问题,提高了大规模容器集群管理的便捷性,帮助用户降低成本,提高效率。

2. TKE 上四层网络流量暴露方式

TKE 上默认使用 service-controller 来管理 CLB 上四层监听器和规则。这种方式, CLB 后端绑定每个节点的 NodePort,CLB 接收外界流量,转发到其中一个节点的 NodePort 上,再通过 Kubernetes 内部的负载均衡,使用 iptables 或 ipvs 转发到 Pod。

请求细节过程:

  • 请求流量进入负载均衡
  • 请求被负载均衡转发到某一个节点的 NodePort
  • KubeProxy 将来自 NodePort 的流量进行 NAT 转发,目的地址是随机的一个 Pod
  • 请求进入容器网络,并根据 Pod 地址转发到对应节点
  • 请求来到 Pod 所属节点,转发到 Pod

实现结果如下图:

参考文档:https://cloud.tencent.com/document/product/457/45487

3. TKE 上七层网络流量暴露方式

TKE 上默认使用 l7-lb-controller 作为 Ingress 控制器,它会管理 CLB 上七层监听器和规则。实现原理和请求细节同四层实现,但是在 CLB 层面会根据域名和 URL 来转发到不同的后端 service,同时可以进行 SSL 卸载。

实现细节:

使用 TKE 默认自带的 Ingress,会为每个 Ingress 资源创建一个 CLB 以及 80,443 的 7 层监听器规则(HTTP/HTTPS),并为 Ingress 每个 location 绑定对应 TKE 各个节点某个相同的 NodePort 作为 rs (每个 location 对应一个 Service,每个 Service 都通过各个节点的某个相同 NodePort 暴露流量),CLB 根据请求匹配 location 转发到相应的 rs (即 NodePort),流量到了 NodePort 后会再经过 K8S 的 iptables 或 ipvs 转发给对应的后端 Pod。

实现结果如下图:

4. TKE 上的 VPC-CNI

TKE 通常用的 Global Router 网络模式(网桥方案),还有一种是 VPC-CNI(弹性网卡方案)。VPC-CNI 是 TKE 上一种新的网络模式,为每个 Pod 分配一个 ENI 弹性网卡的 EIP,Pod 间直接通过弹性网卡通信。可以理解为:给每个 Pod 分配了一个内网 IP。

优点:每个 Pod 都可以有内网 IP

缺点:需要分配一个单独的空闲子网

参考文档:https://cloud.tencent.com/document/product/457/41636

5. TKE 上 CLB 直通 Pod

TKE 的 CLB 默认绑定的都是 node 的 IP 和端口,在使用了 VPC-CNI 给 Pod 提供独立内网 IP 之后,CLB 可以直接绑定 Pod。

请求细节过程:

  • 请求流量进入负载均衡
  • 请求被负载均衡转发到某一个 Pod 的 ENI 弹性网卡

参考文档:https://cloud.tencent.com/document/product/457/41897

参考文档:https://mp.weixin.qq.com/s/fJtlm5Qjm2BfzekC4RegCQ

实现结果如下图,注意图中的 ENI 弹性网卡和 Pod 的实际端口80:

6. TKE 使用已有负载均衡器

先创建 CLB

在 service 的 annotations 添加:

service.kubernetes.io/tke-existed-lbid: lb-6swtxxxx

参考文档:https://cloud.tencent.com/document/product/457/45491

7. TKE 使用内网负载均衡器

可以通过指定使用已有内网负载均衡器实现。

也可以通过以下方式动态创建:

在 service 的 annotations 添加:

service.kubernetes.io/qcloud-loadbalancer-internal-subnetid: subnet-xxxxxx # value 替换为集群所在 vpc 的其中一个子网 id

8. TKE 部署 Nginx Ingress

当 TKE 的默认 Ingress 实现(CLB 的7层规则)无法满足业务需求时,可以额外部署 Nginx Ingress(一般都用不上)

参考文档:https://cloud.tencent.com/document/product/457/47293

实际业务场景的最佳实践

1. 对集群内暴露流量

【优先】四层协议:

  • 【推荐】使用 ClusterIP 类型的 Service,并通过集群内域名访问
  • 【可选】使用公网 CLB 的四层规则
  • 【不推荐】使用内网 CLB 的四层规则

七层协议:

  • 【推荐】使用 ClusterIP 类型的 Service,并通过集群内域名访问,降级为四层协议
  • 【可选】使用公网 CLB 的七层规则
  • 【不推荐】使用内网 CLB 的七层规则

在集群内使用内网 CLB 需要注意回环问题,故不推荐集群内使用内网 CLB。

2. 对集群外暴露流量

建议生产环境均使用已有 CLB,即先手动创建 CLB,再在相关 Service 或 Ingress 指定 CLB 的 id。

TKE 默认控制器在 Service 使用如下配置:

service.kubernetes.io/tke-existed-lbid: lb-6swtxxxx

同时 CLB 开启“启用默认放通”,CLB 和 CVM 之间默认放通,则不用根据 NodePort 调整 CVM 上的安全组,如下图:

【优先】七层协议:

  • 【推荐】 TKE 自带 Ingress(3. TKE 上七层网络流量暴露方式)
  • 【可选】 自行部署Nginx Ingress(8. TKE 部署 Nginx Ingress)

四层协议:

  • 【推荐】TKE 自带 LoadBalancer(2. TKE 上四层网络流量暴露方式)

使用Istio:

Istio 有点类似于 Nginx Ingress,都是先 CLB 四层监听器转发到 NodePort,再通过 istio-ingressgateway 这个 service 定义的规则,转发到 istio-ingressgateway-xx 这个 Pod,再转发到集群内其他 Istio Sidecar。

【腾讯云原生】云说新品、云研新术、云游新活、云赏资讯,扫码关注同名公众号,及时获取更多干货!!

容器服务 TKE 上服务暴露的几种方式的更多相关文章

  1. Linux上删除大量文件几种方式对比

    目录 Linux上删除大量文件几种方式对比 1. rm删除:因为文件数量太多,rm无法删除(报错) 2. find查找删除:-exec 3. find查找删除:xargs 4. find调用-dele ...

  2. 转载:删除github上文件夹的两种方式

    http://www.jianshu.com/p/286be61bb9b8 删除github上文件夹的两种方式(解决已经加入ignore的文件夹无法从远程仓库删除的问题) 如果此文件夹已被加入git追 ...

  3. 手把手教你在容器服务 TKE 上使用 LB 直通 Pod

    什么是 LB 直通 Pod ? Kubernetes 官方提供了 NodePort 类型的 Service,即给所有节点开一个相同端口用于暴露这个 Service,大多云上 LoadBalancer ...

  4. iManager微服务自定义上传数据的两种方法

    背景 当数据量大时,通过浏览器上传可能速度较慢,可以使用以下两种方式进行数据导入. 方法一 1.访问k8s主页(31234端口) 找到所创建的微服务的命名空间(例如icloud-native-xxx) ...

  5. 解决dubbo注册zookepper服务IP乱入问题的三种方式

    最近做一个项目引入了dubbo+zookepper的分布式服务治理框架.在应用的发布的时候出现一个怪问题.zookepper服务是起在开发服务器192.168.23.180上.本机起应用服务提供者注册 ...

  6. 在CentOS下的docker容器中部署spring boot应用的两种方式

    我们通常在 windows 环境下开发 Java,而通常是部署在Linux的服务器中,而CentOS通常是大多数企业的首选,基于Docker的虚拟化容器技术,多数Java应用选择这种方式部署服务.本文 ...

  7. Springboot以Tomcat为容器实现http重定向到https的两种方式

    1 简介 本文将介绍在Springboot中如何通过代码实现Http到Https的重定向,本文仅讲解Tomcat作为容器的情况,其它容器将在以后一一道来. 建议阅读之前的相关文章: (1) Sprin ...

  8. Android - 页面返回上一页面的三种方式

    今年刚刚跳槽到了新公司,也开始转型做Android,由此开始Android的学习历程. 最近在解很多UI的bug,在解bug过程中,总结了在UI的实现过程中,页面返回上一页面的几种实现方式. 一. 自 ...

  9. WebApi服务Uri加密及验证的两种方式

    最近的一个项目要求服务端与UI层分离,业务层以WebApi方式向外提供所有业务服务,服务在数据保密性方面提出了要求,主要包括: 1:客户端认证: 2:服务请求超时(默认5分钟): 3:服务Get请求的 ...

随机推荐

  1. java Hibernate 用法

    Hibernate 用法总结: import java.io.Serializable; import java.sql.SQLException; import java.util.Collecti ...

  2. leetcode刷题笔记-3. 无重复字符的最长子串(java实现)

    题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "ab ...

  3. 2020-04-09:TCP的四次挥手中为什么要有TIME_WAIT状态?

    TIME_WAIT状态存在有两个原因.<1>可靠终止TCP连接.如果最后一个ACK报文因为网络原因被丢弃,此时server因为没有收到ACK而超时重传FIN报文,处于TIME_WAIT状态 ...

  4. HTTP PUT/POST/PATCH的区别

    幂等 idempotent 幂等操作的特定就是其任意多次执行所产生的影响与一次执行的影响相同 POST POST 用来创建一个新的数据 POST 不是幂等的, 意味着多次操作的结果是不同的, 多次操作 ...

  5. sql 语句(精品)

    GROUP BY: select avg(latency),projectName,data_trunc('hour'm\,_time_) as hour group by projectName,h ...

  6. 解决用anaconda安装scrapy后,在使用scrapy时报错

    python版本为3.7 因为用anaconda安装scrapy非常方便,会自动下载所依赖的包, 所以就使用anaconda安装scrapy, 非常舒服,安装很成功 conda install scr ...

  7. oracle语法查某个字段为空

    select * from t_address_express_mapping t where t.start_house_number is null;

  8. js、jQuery、ajax面试题

    1.javascript的typeof返回哪些数据类型. 答案:string,boolean,number,undefined,function,object 2.例举3种强制类型转换和2种隐式类型转 ...

  9. 本blog的地图

    欢迎 CTRL+F收索 / CTRL+D    持续更新 C++: C++快速排序 C++归并排序 高精度 CSS: CSS实现ps基础操作 PYTHON: python爬虫教程,一篇就够了 其他推荐 ...

  10. Jmeter 常用函数(26)- 详解 __chooseRandom

    如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.html 作用 从指定的范围里面取值 语法格式 ${_ ...