容器服务 Service

TkeServiceConfig 是腾讯云容器服务提供的自定义资源 CRD, 通过 TkeServiceConfig 能够帮助你更灵活的配置 LoadBalancer 类型的 Service ,及管理其中负载均衡的各种配置。

相关产品
容器服务 产品页,含版本规格、价格与购买入口。

一、使用场景

Service YAML 的语义无法定义的负载均衡的参数和功能,可以通过 TkeServiceConfig 进行配置。

二、配置说明

使用 TkeServiceConfig 能够帮你快速进行负载均衡器的配置。通过 Service 注解 service.cloud.tencent.com/tke-service-config:<config-name>,你可以指定目标配置并应用到 Service 中。

注意:TkeServiceConfig 资源需要与 Service 处于同一命名空间。

TkeServiceConfig 并不会帮你直接配置并修改协议和端口,你需要在配置中描述协议和端口以便指定配置下发的监听器。在一个 TkeServiceConfig 中可以声明多组监听器配置,目前主要针对负载均衡的健康检查以及对后端访问提供配置。
通过指定协议和端口,配置能够被准确的下发到对应监听器:

·spec.loadBalancer.l4Listeners.protocol:四层协议

·spec.loadBalancer.l4Listeners.port:监听端口

三、Service 与 TkeServiceConfig 关联行为

1. 创建 LoadBalancer 模式 Service 时,设置注解 service.cloud.tencent.com/tke-service-config-auto: "true",将自动创建 <ServiceName>-auto-service-config。你也可以通过 service.cloud.tencent.com/tke-service-config:<config-name> 直接指定你自行创建的 TkeServiceConfig。两个注解不可同时使用,且手动指定的<config-name>不能以 -auto-service-config 与 -auto-ingress-config 为后缀。

2. 其中自动创建的 TkeServiceConfig 存在以下同步行为:

·用户修改 Service 默认的 TkeServiceConfig,TkeServiceConfig 内容同样会被应用到负载均衡(手动创建的 TkeServiceConfig 也遵循此行为)。

·更新 Service 资源时,新增若干四层监听器时,如果该监听器或转发规则没有对应的 TkeServiceConfig 配置片段。Service-Controller 将主动添加 TkeServiceConfig 对应片段。

·删除若干四层监听器时,Service-controller 组件将主动删除 TkeServiceConfig 对应片段。

·删除 Service 资源时,级联删除该 TkeServiceConfig。

3. 你也可以参考下列 TkeServiceConfig 完整配置参考自行创建需要的 CLB 配置,Service 通过注解:service.cloud.tencent.com/tke-service-config:<config-name> 引用该配置。

4. 其中你手动创建的 TkeServiceConfig 存在以下同步行为:

·当用户在 Service 中添加配置注解时,负载均衡将会立即进行设置同步。

·当用户在 Service 中删除配置注解时,负载均衡将会保持不变。

·修改 TkeServiceConfig 配置时,引用该配置 Service 的负载均衡将会根据新的 TkeServiceConfig 进行设置同步。

·Service 的监听器未找到对应配置时,该监听器将不会进行修改。

·Service 的监听器找到对应配置时,若配置中没有声明的属性,该监听器将不会进行修改。

四、完整配置参考

apiVersion: cloud.tencent.com/v1alpha1kind: TkeServiceConfigmetadata: name: sample # 配置的名称 namespace: default # 配置的命名空间spec: loadBalancer: l4Listeners: # 四层规则配置,适用于Service的监听器配置。 – protocol: TCP # 协议端口锚定Service的四层规则。必填,枚举值:TCP|UDP|TCP_SSL|QUIC。 port: 80 # 必填,可选值:1~65535。 listenerName: custom-name # 自定义监听器名称,选填。(确认组件版本 >= 2.11.0) snatEnable: false # SNAT 开关,选填。需要 CLB 开白名单。开启SNAT,后端Pod看到的源IP为CLB的VIP(虚拟IP),不透传客户端源IP。(确认组件版本 >= 2.11.0) deregisterTargetRst: true # 选填,布尔值。双向 RST 开关,建议非直连类型 Service 启用,非直连 Service 的连接会经过 NodePort 中转,不启用双向 RST 可能导致下线集群节点后造成业务中断。 session: # 会话保持相关配置。选填 enable: true # 是否开启会话保持。必填,布尔值 sessionExpireTime: 100 # 会话保持的时间。选填,默认值:30,可选值:30~3600,单位:秒。 healthCheck: # 健康检查相关配置。选填 enable: true # 是否开启健康检查。必填,布尔值 checkType: "HTTP" # 健康检查类型。选填,枚举值:TCP|HTTP|CUSTOM(仅适用于TCP/UDP监听器,其中UDP监听器只支持CUSTOM;如果使用自定义健康检查功能,则必传)。 checkPort: 80 # 健康检查端口,选填。默认为后端服务的端口,除非你希望指定特定端口,否则建议留空。(仅适用于TCP/UDP监听器)。 intervalTime: 10 # 健康检查探测间隔时间。选填,默认值:5,可选值:5~300,单位:秒。 healthNum: 2 # 健康阈值,表示当连续探测几次健康则表示该转发正常。选填,默认值:3,可选值:2~10,单位:次。 unHealthNum: 3 # 不健康阈值,表示当连续探测几次健康则表示该转发异常。选填,默认值:3,可选值:2~10,单位:次。 timeout: 5 # 健康检查的响应超时时间,响应超时时间要小于检查间隔时间。选填,默认值:2,可选值:2~60,单位:秒。 httpCode: 31 # 健康检查状态码,选填,默认值:31,可选值:1~31。仅适用于HTTP/HTTPS转发规则、TCP监听器的HTTP健康检查方式。 1 表示探测后返回值 1xx 代表健康,2 表示返回 2xx 代表健康,4 表示返回 3xx 代表健康,8 表示返回 4xx 代表健康,16 表示返回 5xx 代表健康。若希望多种返回码都可代表健康,则将相应的值相加。 httpCheckPath: "/" # 健康检查路径,选填。仅适用于HTTP/HTTPS转发规则、TCP监听器的HTTP健康检查方式。 httpCheckDomain: "example.com" # 健康检查域名,选填,不能为空值。默认为七层规则域名(仅适用于HTTP/HTTPS转发规则、TCP监听器的HTTP健康检查方式)。 httpCheckMethod: "HEAD" # 健康检查方法(仅适用于HTTP/HTTPS转发规则、TCP监听器的HTTP健康检查方式),默认值:HEAD,可选值HEAD或GET。 httpVersion: "HTTP/1.1" # 自定义探测相关参数。健康检查协议CheckType的值取HTTP时,必传此字段,代表后端服务的HTTP版本:HTTP/1.0、HTTP/1.1;(仅适用于TCP监听器)。 sourceIpType: 0 # 健康检查探测来源。0(VIP为源IP) 1(100.64为源IP)。对于域名化clb默认值为1且只能为1,对于非域名化的clb默认值不一定,可在clb控制台配置页面看能否看到VIP探测方式,如能看到默认值为0,否则为1,更多详情查看 https://cloud.tencent.com/document/product/214/86666 scheduler: WRR # 请求转发方式配置。WRR、LEAST_CONN 分别表示按权重轮询、最小连接数。选填,枚举值:WRR|LEAST_CONN。 proxyProtocol: enable: false # 启用 ProxyProtocol,默认关闭。 idleConnectTimeout: 900 # 空闲连接超时时间,选填,可选值:10~1980。仅适用于 TCP/UDP 监听器。(确认组件版本 >= 2.12.0)

五、Deployment 示例:jetty-deployment.yaml

apiVersion: apps/v1kind: Deploymentmetadata: labels: app: jetty name: jetty-deployment namespace: defaultspec: progressDeadlineSeconds: 600 replicas: 3 revisionHistoryLimit: 10 selector: matchLabels: app: jetty strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate template: metadata: creationTimestamp: null labels: app: jetty spec: containers: – image: jetty:9.4.27-jre11 imagePullPolicy: IfNotPresent name: jetty ports: – containerPort: 80 protocol: TCP – containerPort: 443 protocol: TCP resources: {} terminationMessagePath: /dev/termination-log terminationMessagePolicy: File dnsPolicy: ClusterFirst restartPolicy: Always schedulerName: default-scheduler securityContext: {} terminationGracePeriodSeconds: 30

六、Service 示例:jetty-service.yaml

apiVersion: v1kind: Servicemetadata: annotations: service.cloud.tencent.com/tke-service-config: jetty-service-config # 指定已有的 tke-service-config # service.cloud.tencent.com/tke-service-config-auto: "true" # 自动创建 tke-service-config name: jetty-service namespace: defaultspec: ports: – name: tcp-80-80 port: 80 protocol: TCP targetPort: 80 – name: tcp-443-443 port: 443 protocol: TCP targetPort: 443 selector: app: jetty type: LoadBalancer

该示例中包含以下配置:

·Service 为公网 LoadBalancer 类型。声明了两个 TCP 服务,一个在80端口,一个在443端口。

·使用了 jetty-service-config 负载均衡配置。

七、TkeServiceConfig 示例:jetty-service-config.yaml

apiVersion: cloud.tencent.com/v1alpha1kind: TkeServiceConfigmetadata: name: jetty-service-config namespace: defaultspec: loadBalancer: l4Listeners: – protocol: TCP port: 80 deregisterTargetRst: true healthCheck: enable: false – protocol: TCP port: 443 session: enable: true sessionExpireTime: 3600 healthCheck: enable: true intervalTime: 10 healthNum: 2 unHealthNum: 2 timeout: 5 scheduler: WRR

该示例中包含以下配置:
名称为 jetty-service-config。且在四层监听器配置中,声明了以下两段配置:

1. 80端口的 TCP 监听器将会被配置。关闭健康检查。

2. 443端口的 TCP 监听器将会被配置。

·打开健康检查,健康检查间隔调整为10s,健康阈值2次,不健康阈值2次,超时5s。

·打开会话保持功能,会话保持的超时时间设置为3600s。

·转发策略配置为:按权重轮询。

八、kubectl 配置命令

1. 参照 连接集群 指引,使用命令行工具 kubectl 从本地客户端机器连接到 TKE 集群。

2. 配置 YAML 文件,你可以参照前文给出的示例,编写声明资源的 YAML 文件。

3. 部署资源配置文件。

# 部署资源配置文件$ kubectl apply -f jetty-deployment.yaml$ kubectl apply -f jetty-service.yaml$ kubectl apply -f jetty-service-config.yaml

4. 查看 Pod 和 Service 的运行情况。

# 查看 Pod 运行情况$ kubectl get podsNAME READY STATUS RESTARTS AGEjetty-deployment-8694c44b4c-cxscn 1/1 Running 0 8m8sjetty-deployment-8694c44b4c-mk285 1/1 Running 0 8m8sjetty-deployment-8694c44b4c-rjrtm 1/1 Running 0 8m8s# 查看 Service 运行情况$ kubectl get service jetty-serviceNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEjetty LoadBalancer 10.127.255.209 150.158.220.237 80:31338/TCP,443:32373/TCP 2m47s

5. 获取 TkeServiceConfig 配置列表。

# 获取TkeServiceConfig配置列表$ kubectl get tkeserviceconfigs.cloud.tencent.comNAME AGEjetty-service-config 52s

6. 更新或修改 TkeServiceConfig 配置。

# 更新修改TkeServiceConfig配置$ kubectl edit tkeserviceconfigs.cloud.tencent.com jetty-service-configtkeserviceconfig.cloud.tencent.com/jetty-service-config edited

赞 (0)
上一篇 4天前
下一篇 4天前