容器服务 TKE 上服务暴露的几种方式
预备知识
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 上服务暴露的几种方式的更多相关文章
- Linux上删除大量文件几种方式对比
目录 Linux上删除大量文件几种方式对比 1. rm删除:因为文件数量太多,rm无法删除(报错) 2. find查找删除:-exec 3. find查找删除:xargs 4. find调用-dele ...
- 转载:删除github上文件夹的两种方式
http://www.jianshu.com/p/286be61bb9b8 删除github上文件夹的两种方式(解决已经加入ignore的文件夹无法从远程仓库删除的问题) 如果此文件夹已被加入git追 ...
- 手把手教你在容器服务 TKE 上使用 LB 直通 Pod
什么是 LB 直通 Pod ? Kubernetes 官方提供了 NodePort 类型的 Service,即给所有节点开一个相同端口用于暴露这个 Service,大多云上 LoadBalancer ...
- iManager微服务自定义上传数据的两种方法
背景 当数据量大时,通过浏览器上传可能速度较慢,可以使用以下两种方式进行数据导入. 方法一 1.访问k8s主页(31234端口) 找到所创建的微服务的命名空间(例如icloud-native-xxx) ...
- 解决dubbo注册zookepper服务IP乱入问题的三种方式
最近做一个项目引入了dubbo+zookepper的分布式服务治理框架.在应用的发布的时候出现一个怪问题.zookepper服务是起在开发服务器192.168.23.180上.本机起应用服务提供者注册 ...
- 在CentOS下的docker容器中部署spring boot应用的两种方式
我们通常在 windows 环境下开发 Java,而通常是部署在Linux的服务器中,而CentOS通常是大多数企业的首选,基于Docker的虚拟化容器技术,多数Java应用选择这种方式部署服务.本文 ...
- Springboot以Tomcat为容器实现http重定向到https的两种方式
1 简介 本文将介绍在Springboot中如何通过代码实现Http到Https的重定向,本文仅讲解Tomcat作为容器的情况,其它容器将在以后一一道来. 建议阅读之前的相关文章: (1) Sprin ...
- Android - 页面返回上一页面的三种方式
今年刚刚跳槽到了新公司,也开始转型做Android,由此开始Android的学习历程. 最近在解很多UI的bug,在解bug过程中,总结了在UI的实现过程中,页面返回上一页面的几种实现方式. 一. 自 ...
- WebApi服务Uri加密及验证的两种方式
最近的一个项目要求服务端与UI层分离,业务层以WebApi方式向外提供所有业务服务,服务在数据保密性方面提出了要求,主要包括: 1:客户端认证: 2:服务请求超时(默认5分钟): 3:服务Get请求的 ...
随机推荐
- java 多态一
一 多态的概述 现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学 生也是人,即出现两种形态. Java作为面向对象的语言,同样可以描述一个事物的多种形态.如Studen ...
- Homekit_人体感应器
前置需求: 苹果手机一台 Homekit人体感应一台 USB供电线一根 这款产品内置人体红外感应器,使用圆环设计,增大了其接触面积,使感应变得更加灵敏,重量轻,方便将其粘贴到墙上,同时支持二次开发,如 ...
- kafka-clients 1.0 内部响应接口文档
AddOffsetsToTxnResponse version:0 name type defaultValue docString throttle_time_ms INT32 0 Duration ...
- 设计模式:装饰者模式介绍及代码示例 && JDK里关于装饰者模式的应用
0.背景 来看一个项目需求:咖啡订购项目. 咖啡种类有很多:美式.摩卡.意大利浓咖啡: 咖啡加料:牛奶.豆浆.可可. 要求是,扩展新的咖啡种类的时候,能够方便维护,不同种类的咖啡需要快速计算多少钱,客 ...
- 几种定时任务(Timer、TimerTask、ScheduledFuture)的退出—结合真实案例【JAVA】
工作中常常会有定时任务的开发需求,特别是移动端.最近笔者正好有所涉及,鉴于此,结合开发中的案例说明一下几种定时任务的退出. 需求说明:定时更新正在生成的文件大小和状态[进行中.失败.完成],如果文件生 ...
- 利用C#实现OPC-UA服务端
前言 最近接手了一个项目,做一个 OPC-UA 服务端?刚听到这个消息我是一脸懵,发自灵魂的三问“OPC-UA是什么?”.“要怎么做?”.“有什么用?”.我之前都是做互联网相关的东西,这种物联网的还真 ...
- DFS【搜索1】
DFS模板 void dfs(int depth)//depth表示当前的层数(或深度) { if(depth>n)//到达叶子节点,该路已走到尽头 return; for(int i=;i&l ...
- 介绍 golang json数据的处理
原文链接:https://blog.csdn.net/weixin_43223076/article/details/83550229 demo1: package main import ( &qu ...
- 使用disk-image-builder(DIB)制作Ironic 裸金属镜像
export DIB_DEV_USER_USERNAME=centos export DIB_DEV_USER_PASSWORD= export DIB_DEV_USER_PWDLESS_SUDO=Y ...
- 解析WAV音频文件----》生成WAV音频文件头
前言:请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i WAV音频文件介绍: WAV文件是在PC机平台上很常见的.最经典的多媒体音频文件,最早于1991年8月出现在Windows3.1操作系统 ...