有奖捉虫:云通信与企业服务文档专题,速来> HOT
文档中心 > 容器服务 > TKE 标准集群指南 > Service 管理 > 使用 LoadBalancer 直连 Pod 模式 Service

操作场景

原生 LoadBalancer 模式 Service 可自动创建负载均衡 CLB,并通过集群的 Nodeport 转发至集群内,再通过 iptable 或 ipvs 进行二次转发。该模式下的 Service 能满足大部分使用场景 ,但在以下场景中更推荐使用直连 Pod 模式 Service
有获取来源 IP 需求时(非直连模式必须另外开启 Local 转发)。
要求具备更高转发性能时(非直连模式下 CLB 和 Service 本身存在两层 CLB,性能有一定损失)。
需使用完整的健康检查和会话保持到 Pod 层级时(非直连模式下 CLB 和 Service 本身存在两层 CLB,健康检查及会话保持功能较难配置)。
说明
若您的集群是 Serverless 集群,则默认为直连 Pod 模式,您无需任何操作。
当前 GlobalRouter 和 VPC-CNI 容器网络模式均支持直连 Pod 模式,您可以在 集群列表 中单击集群 ID 进入集群详情页面,在集群的“基本信息”页面中查看当前集群使用的网络插件。

容器网络模式为 VPC-CNI

使用限制

集群 Kubernetes 版本需要高于 1.12。
集群网络模式必须开启 VPC-CNI 弹性网卡模式。
直连模式 Service 使用的工作负载需使用 VPC-CNI 弹性网卡模式。
默认 CLB 的后端数量会有限制,具体限制数量与 CLB 所在地域有关,默认限制通常是100或200个,如果您绑定的工作负载的副本数超过,可通过 在线咨询 提升负载均衡 CLB 的配额。
满足 CLB 本身绑定弹性网卡的功能限制,详情请参见 绑定弹性网卡
开启直连 Pod 模式的工作负载更新时,将会根据 CLB 的健康检查状态进行滚动更新,会对更新速度造成一定影响。
不支持 HostNetwork 类型的工作负载。
注意:
从 NodePort 接入方案迁移至直连时,需要注意以下事项:
确认弹性网卡工作负载的安全组配置,确认出入流量放通。
确认来源 IP 的变化对业务没有影响。(直连避免了 FullNAT 转发,来源 IP 不再是节点 IP,而是请求来源 IP)。
确认工作负载当前没有处于滚动更新中的状态。
如果出现数据面访问的不预期,请及时参考操作步骤进行回滚。

操作步骤

控制台操作指引
YAML 操作指引
2. 参考 控制台创建 Service 步骤,进入新建 Service 页面,根据实际需求设置 Service 参数。 其中,部分关键参数信息需进行如下设置,如下图所示:


服务访问方式:选择为公网LB访问内网LB访问
网络模式:勾选采用负载均衡直连Pod模式。(取消勾选则为默认的 NodePort 接入方式)
Workload绑定:选择引用Workload
3. 单击创建 Service,完成创建。
直连 Pod 模式 Service 的 YAML 配置与普通 Service YAML 配置相同,示例中的 annotation 即代表是否开启直连 Pod 模式。
kind: Service
apiVersion: v1
metadata:
annotations:
service.cloud.tencent.com/direct-access: "true" ##开启直连 Pod 模式(删除注解或"false",为关闭直连)
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
type: LoadBalancer

annotation 扩展

负载均衡 CLB 的相关配置可参见 TkeServiceConfig 介绍。其中相关 annotation 配置如下:
service.cloud.tencent.com/tke-service-config: [tke-service-configName]

注意事项

如何保证滚动更新时的可用性保证

Kubernetes 官方提供的一个特性 ReadinessGate,主要是用来控制 Pod 的状态,集群版本需高于1.12。默认情况下,Pod 有以下 Condition:PodScheduled、Initialized、ContainersReady,当这几个状态都 Ready 的时候,Pod Ready 的 Condition 就通过了。但是在云原生场景下,Pod 的状态可能需要参考其他状态。ReadinessGate 提供了这样一个机制,允许为 Pod 的状态判断添加一个栅栏,由第三方来进行判断与控制。这样 Pod 的状态就和第三方关联起来了。

直连模式滚动更新的变化

当用户开始为应用做滚动更新的时候,Kubernetes 会根据更新策略进行滚动更新。但其判断一批 Pod 启动的标识仅包括 Pod 自身的状态,并不会考虑该 Pod 在负载均衡上是否配置健康检查且通过。如在接入层组件高负载时,不能及时对此类 Pod 进行及时调度,则滚动更新成功的 Pod 可能并没有正在对外提供服务,从而导致服务的中断。 为了关联滚动更新和负载均衡的后端状态,TKE 接入层组件引入了 Kubernetes 1.12中引入的新特性 ReadinessGate。TKE 接入层组件仅在确认后端绑定成功并且健康检查通过时,通过配置 ReadinessGate的状态来使 Pod 达到 Ready 的状态,从而推动整个工作负载的滚动更新。
注意:
ReadinessGate 仅负责流量就绪检查,和Endpoints的职责是不一样的,所以 Pod 启动就绪之后的健康状态不会在 ReadinessGate Status 中体现。

在集群中使用 ReadinessGate

Kubernetes 集群提供了服务注册的机制,只需要将您的服务以 MutatingWebhookConfigurations 资源的形式注册至集群即可。集群会在 Pod 创建的时候按照配置的回调路径进行通知,此时可对 Pod 进行创建前的操作,即给 Pod 加上 ReadinessGate。需注意此回调过程必须是 HTTPS,即需要在 MutatingWebhookConfigurations 中配置签发请求的 CA,并在服务端配置该 CA 签发的证书。

ReadinessGate 机制的灾难恢复

用户集群中的服务注册或证书有可能被用户删除,虽然这些系统组件资源不应该被用户修改或破坏。在用户对集群的探索或是误操作下,这类问题会不可避免的出现。因此接入层组件在启动时会检查以上资源的完整性,在完整性受到破坏时会重建以上资源,加强系统的鲁棒性。详情可参见 Kubernetes Pods ReadinessGate 特性

容器网络模式为 GlobalRouter

使用限制

单个工作负载仅能运行在一种网络模式下,您可选择弹性网卡直连或 GlobalRoute 直连。
仅支持带宽上移账号,如若当前账户是传统账号类型(带宽非上移),可参见 账户类型升级说明
默认 CLB 的后端数量会有限制,具体限制数量与 CLB 所在地域有关,默认限制通常是100或200个,如果您绑定的工作负载的副本数超过数量限制,可通过 在线咨询 提升负载均衡 CLB 的配额。
使用 CLB 直连 Pod,需注意网络链路受云服务器的安全组限制,确认安全组配置是否放开对应的协议和端口,需要开启 CVM 上工作负载对应的端口
开启直连后,默认将启用 ReadinessGate 就绪检查,将会在 Pod 滚动更新时检查来自负载均衡的流量是否正常,需要为业务方配置正确的健康检查配置,详情可参见 TkeServiceConfig 介绍

步骤1: 开启直连配置

对于 GlobalRouter 集群,需要先开启“集群”维度的直连能力,再开启 “service” 维度的直连开关。
在 kube-system/tke-service-controller-config ConfigMap 中新增 GlobalRouteDirectAccess: "true" 以开启 GlobalRoute 直连能力。
控制台操作指引
YAML 操作指引
1. 登录 容器服务控制台,在左侧导航栏中选择集群
2. 在集群列表中,单击目标集群 ID,进入集群详情页。
3. 配置管理 > ConfigMap 页面,命名空间选择 kube-system,搜索 tke-service-controller-config,单击更新配置。如下图所示:

image.png


4. 更新配置页面,选择手动增加,变量名填写为GlobalRouteDirectAccess,变量值填写为true(注意没有引号)。如下图所示:



5. 单击更新 ConfigMap
1. 登录 容器服务控制台,在左侧导航栏中选择集群。
2. 在集群列表中,单击目标集群 ID,进入集群详情页。
3. 在配置管理 > ConfigMap 页面,单击tke-service-controller-config右侧的编辑 yaml。或通过命令行执行kubectl edit -n kube-system cm tke-service-controller-config进入 yaml 编辑模式。
4. data下新增行GlobalRouteDirectAccess: "true"(注意缩进2个控制),保存即可。如下图所示:

image.png



步骤2: Service 或 Ingress 中开启直连模式

2.1 Service 开启直连模式

您可以通过以下方式开启 Service 的直连模式:
方式1:
1. 登录 容器服务控制台,在左侧导航栏中选择集群。
2. 在集群列表中,单击目标集群 ID,进入集群详情页。
3. 服务与路由 > Service 页面,单击待配置的 Service 右侧的编辑 yaml
方式2:
通过命令行工具使用 kubectl edit service -n <命名空间> <service名> 进入编辑模式。
示例:
在 metadata.annotations 中新增以下注解:service.cloud.tencent.com/direct-access: "true",表示开启 Service 的直连模式。如果未添加该注解或注解值为 "false",则表示关闭直连模式。
直连 Pod 模式 Service 的其他 YAML 配置与普通 Service YAML 配置相同。
kind: Service
apiVersion: v1
metadata:
annotations:
service.cloud.tencent.com/direct-access: "true" ##开启直连 Pod 模式
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
type: LoadBalancer
Annotation 扩展:
有关负载均衡 CLB 的配置,请参见 TkeServiceConfig 介绍。其中相关 Annotation 配置如下:
service.cloud.tencent.com/tke-service-config: [tke-service-configName]

2.2 Ingress 开启直连模式

对于 Ingress 需要使用ingress.cloud.tencent.com/direct-access: "true"注解来开启直连模式。
除了注解名称不同外,其余步骤与 开启 Service 的直连模式 相同。