容器服务 TKE 上服务暴露的几种方式

预备知识

1. K8S 上 Service 类型

  • ClusterIP

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

  • Nod~ + L ( W C k y _ePort

通过每个 Node 上的 IP 和静态@ Z } 3 X端口(NodePort)暴露服务。 NodePort 服务N o Q / ~ B I会路由到 ClusterIP 服务,这个 Clusg + - `terIP 服务会自动创建。 通过请求 <NodeIP>:<NodePo[ ? E 5 J ? Ort>,可以从集群的外部访问一个 NodePort 服务。

  • LoadBalancer

使用云提供商的负载局衡器,可以向外部暴露服务。 外部的负载均衡器可以路由到 NodePort 服务和 ClusterIPx n W ] A 8 0 服务。

  • Externs t S B # [ PalName

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

C - B + { e ]考文档:https://clou; ; 6 L K ~ zd.tencent.com/document/product/457/45487

平台相关基础知识

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

2. TKc ] * WE 上四层网络流量暴露方式

TKE 上默认使用 service-controller 来 R v E i @管理 CLB 上四层监听器和规则。这种方式, CLB 后端绑定每个节点的D # + S g B } NodePort,CLB 接收外界流量,转发到其中一个节点的 NodePort 上,再通过 Kuberne` ( - ) 1 N [ Otes 内部的负载均衡,使用 iptabl! b [ A S P X a Fes 或 ipvs 转发到 Pod。

容器服务 TKE 上服务暴露的几种方式

容器服务 TKE 上服务暴露的几种方式

请求细节过程e u 0 B 7 Q t

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

实现结果如下图:

容器服务 TKE 上服务暴露的几种方式

参考文档:https://cloud.tencent.com/d5 q {ocument/product/457/45487

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

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

实现细节:

使用 TKE 默认自带的 Ingr@ C ~ { S * !ess,会为: 5 O Z ! # [ !每个^ 1 m a f T Ingress 资源创建一个 CLB 以及 8= q =0,9 a ! D 0 w Y )443 的 7 层监听器规则(HTTP/HTTPS),并为 In^ g t L !gress 每个 location 绑定V 9 ;对应 TKE 各个节点某个相同的 NodePort 作为 rs (每个 locationX I B 2 1 对应一个 Service,每个 Service 都通过各个节点的某个相同 NodePort 暴露流D B | t L O 0量),CLB 根据请求匹配 location 转发到相应的 rs (即 NodePort),流量到E 5 m O 2 ; f (了 NodePort 后会再经过 K8SX x I v 的 iptables 或 ipvs 转发B V )给对应的后端 Pod。

实现结果如下图:

容器服务 TKE 上服务暴露的几种方式

4. TKE 上的 VPC-CNIB 6 g m = N q

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

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

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

参考文档:https://cloud.tencent.com/document/proN R u s / o F $ %duct/457/41636

容器服务 TKE 上服务暴露的几种方式

5. T2 N * T [ *KE 上 CLB 直通 Pod

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

请求细节过程:

  • q N n ~ @ P求流量进入负载均衡
  • 请求被负载均衡+ o S Q转发到某一个 Pod 的 ENI 弹性网卡

参考文档:https://clou` h vd.tm / F 6 / [ _ ]encent.com/document/product/457/41897

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

容器服务 TKE 上服务暴露的几种方式

容器服务 TKE 上服务暴露的几种方式

实现结果如下x O a U B V # ;图,注意图中的 ENI 弹性网卡和 Pod 的实际端口80

容器服务 TKE 上服务暴露的几种方式

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

先创建 CLB

在 service 的 ann0 } potan Z 8 Zti0 J Dons 添加:

service.kubernetes.io/tke-Z X { ^ & 4 h `existed-lbid: lb-6swtxxxx

参考文档:hg - X [ttps://cloud.tencent.com/document/product/457/45491

7. TKE 使用内网b @ I &负载 k y N [ v ; t均衡器

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

U w w , 1 n = x可以通过以下方式动态创建:

在 service 的 annotations 添加:

service.kubernetes.io/qcloud-loadbalancer-internal-subnetid: subnet-xxxxxx # valc L e 7 N = Uue 替换~ ; U为集群所在 vpc 的其中一个{ F 9 F c Z子网 id 

8. TKE 部署 Nginx Ingress

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

参考文档:https://clQ a H S eoud.tencent.com/document/product/457/47293

实际业务场景的最佳实践

1. 对集群内暴露流量

【优先】四层协议:

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

七层协议:

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

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

2. 对集群外暴露流量

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

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

service.kubernetes.io/I 7 ttke-existed-lbid: lb-6swtxxxx

同时 CLB 开启“启用默认放通”,CLB 和 CV_ h b z Z G 3 } #M 之间默认放通,则不用根据 NodePort 调整 CVM 上的安全组,如下图:

容器服务 TKE 上服务暴露的几种方式

【优先】七层协议:

  • 【推荐】 TKE 自带 Ingress(3. TK% f M I T W CE 上七层网络流r k D量暴露方式)
  • 【可选】 自行部署Nginx Ingress(8. TKE 部署 Nginx Ingress)

    四层协议:

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

    使用Istio:

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