TkeServiceConfig
TkeServiceConfig 是腾讯云容器服务 TKE 提供的自定义资源 CRD,通过 TkeServiceConfig 能够帮助您更灵活的进行 Ingress 管理负载均衡的各种配置。
使用场景
Ingress YAML 的语义无法定义的负载均衡参数和功能,可以通过 TkeServiceConfig 来配置。
配置说明
使用 TkeServiceConfig 能够帮您快速进行负载均衡器的配置。通过 Ingress 注解 ingress.cloud.tencent.com/tke-service-config:<config-name>,您可以指定目标配置应用到 Ingress 中。
注意:
TkeServiceConfig 资源需要和 Ingress 处于同一命名空间。
TkeServiceConfig 不会帮您配置并修改协议、端口、域名以及转发路径,您需要在配置中描述协议、端口、域名还有转发路径以便指定配置下发的转发规则。
每个七层的监听器下可有多个域名,每个域名下可有多个转发路径。因此,在一个
TkeServiceConfig
中可以声明多组域名、转发规则配置,目前主要针对负载均衡的健康检查以及对后端访问提供配置。通过指定协议和端口,配置能够被准确地下发到对应监听器:
spec.loadBalancer.l7Listeners.protocol
:七层协议spec.loadBalancer.l7Listeners.port
:监听端口通过指定协议、端口、域名以及访问路径,可以配置转发规则级别的配置。例如,后端健康检查、负载均衡方式。
spec.loadBalancer.l7Listeners.protocol
:七层协议spec.loadBalancer.l7Listeners.port
:监听端口spec.loadBalancer.l7Listeners.domains[].domain
:域名spec.loadBalancer.l7Listeners.domains[].rules[].url
:转发路径spec.loadBalancer.l7listeners.protocol.domain.rules.url.forwardType
:指定后端协议,支持 HTTP/HTTPS/GRPC。后端协议是指 CLB 与后端服务之间的协议:后端协议选择 HTTP 时,后端服务需部署 HTTP 服务。后端协议选中 HTTPS 时,后端服务需部署 HTTPS 服务,HTTPS 服务的加解密会让后端服务消耗更多资源。更多请查看 CLB 配置 HTTPS 监听器。
说明:
当您的域名配置为默认值,即公网或内网 VIP 时,可以通过 domain 填空值的方式进行配置。
Ingress 与 TkeServiceConfig 关联行为
1. 创建 Ingress 时,设置 ingress.cloud.tencent.com/tke-service-config-auto: "true"; ,将自动创建 <IngressName>-auto-ingress-config。您也可以通过 ingress.cloud.tencent.com/tke-service-config:<config-name> 直接指定您自行创建的 TkeServiceConfig。两个注解不可同时使用。
2. 您为 Service\\Ingress 使用的自定义配置,名称不能以
-auto-service-config
与 -auto-ingress-config
为后缀。3. 其中自动创建的 TkeServiceConfig 存在以下同步行为:
更新 Ingress 资源时,新增若干7层转发规则,如果该转发规则没有对应的 TkeServiceConfig 配置片段。Ingress-Controller 将主动添加 TkeServiceConfig 对应片段。
删除若干7层转发规则时,Ingress-Controller 组件将主动删除 TkeServiceConfig 对应片段。
删除 Ingress 资源时,联级删除该 TkeServiceConfig。
用户修改 Ingress 默认的 TkeServiceConfig,TkeServiceConfig 内容同样会被应用到负载均衡。
4. 您也可以参考下列 TkeServiceConfig 完整配置参考,自行创建需要的 CLB 配置,Service 通过注解 ingress.cloud.tencent.com/tke-service-config:<config-name> 引用该配置。
5. 其中您手动创建的 TkeServiceConfig 存在以下同步行为:
当用户在 Ingress 中使用配置注解时,负载均衡将会即刻进行设置同步。
当用户在 Ingress 中删除配置注解时,负载均衡将会保持不变。
修改 TkeServiceConfig 配置时,引用该配置的 Ingress 的负载均衡将会根据新的 TkeServiceConfig 进行设置同步。
当 Ingress 的监听器没有找到对应配置时,该监听器将不会进行修改。
Ingress 的监听器找到对应配置时,若配置中没有声明的属性,该监听器将不会进行修改。
示例
Deployment 示例:jetty-deployment.yaml
apiVersion: apps/v1kind: Deploymentmetadata:labels:app: jettyname: jetty-deploymentnamespace: defaultspec:progressDeadlineSeconds: 600replicas: 3revisionHistoryLimit: 10selector:matchLabels:app: jettystrategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:creationTimestamp: nulllabels:app: jettyspec:containers:- image: jetty:9.4.27-jre11imagePullPolicy: IfNotPresentname: jettyports:- containerPort: 80protocol: TCP- containerPort: 443protocol: TCPresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilednsPolicy: ClusterFirstrestartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}terminationGracePeriodSeconds: 30
Service 示例:jetty-service.yaml
apiVersion: v1kind: Servicemetadata:name: jetty-servicenamespace: defaultspec:ports:- name: tcp-80-80port: 80protocol: TCPtargetPort: 80- name: tcp-443-443port: 443protocol: TCPtargetPort: 443selector:app: jettytype: NodePort
该示例包含以下配置:
Service 的 NodePort 类型,声明了两个 TCP 服务。一个在80端口,一个在443端口。
Ingress:jetty-ingress.yaml
apiVersion: networking.k8s.io/v1kind: Ingressmetadata:annotations:kubernetes.io/ingress.rule-mix: "true"kubernetes.io/ingress.http-rules: '[{"path":"/health","backend":{"serviceName":"jetty-service","servicePort":"80"}}]'kubernetes.io/ingress.https-rules: '[{"path":"/","backend":{"serviceName":"jetty-service","servicePort":"443","host":"sample.tencent.com"}}]'ingress.cloud.tencent.com/tke-service-config: jetty-ingress-config# 指定已有的 tke-service-config# ingress.cloud.tencent.com/tke-service-config-auto: "true"# 自动创建 tke-service-configname: jetty-ingressnamespace: defaultspec:rules:- http:paths:- backend:service:name: jetty-serviceport:number: 80path: /healthpathType: ImplementationSpecific- host: "sample.tencent.com"http:paths:- backend:service:name: jetty-serviceport:number: 80path: /pathType: ImplementationSpecifictls:- secretName: jetty-cert-secret
该示例包含以下配置:
使用了混合协议,使用默认域名(公网 IP)暴露了一个 HTTP 服务,使用
sample.tencent.com
域名暴露了一个 HTTPS 服务。HTTP 服务的转发路径是
/health
,HTTPS 服务的转发路径是/
。使用了
jetty-ingress-config
负载均衡配置。TkeServiceConfig 示例:jetty-ingress-config.yaml
apiVersion: cloud.tencent.com/v1alpha1kind: TkeServiceConfigmetadata:name: jetty-ingress-confignamespace: defaultspec:loadBalancer:l7Listeners:- protocol: HTTPport: 80domains:- domain: "" # domain为空表示使用VIP作为域名rules:- url: "/health"forwardType: HTTP # 指定后端协议为 HTTP,目前支持 HTTP/HTTPS/GRPC。healthCheck:enable: false- protocol: HTTPSport: 443defaultServer: "sample.tencent.com" # 默认域名keepaliveEnable: 1 # 监听器开启长连接(非keepalive白名单用户,请勿声明该字段)domains:- domain: "sample.tencent.com"http2: true # 启用 HTTP 2.0rules:- url: "/"forwardType: HTTPS # 指定后端协议为 HTTPS,目前支持 HTTP/HTTPS/GRPC。session:enable: truesessionExpireTime: 3600healthCheck:enable: trueintervalTime: 10 # intervalTime 要大于 timeout,否则会出错timeout: 5 # timeout 要小于 intervalTime,否则会出错healthNum: 2unHealthNum: 2httpCheckPath: "/checkHealth"httpCheckDomain: "sample.tencent.com" #注意:健康检查必须使用固定域名进行探测,如果您在.spec.loadBalancer.l7Listeners.protocol.domains.domain 里填写的是泛域名,一定要使用 httpCheckDomain 字段明确具体需要健康检查的域名,否则泛域名不支持健康检查。httpCheckMethod: HEADhttpCode: 31 # 可选值:1~31,默认 31。 1 表示探测后返回值 1xx 代表健康,2 表示返回 2xx 代表健康,4 表示返回 3xx 代表健康,8 表示返回 4xx 代表健康,16 表示返回 5xx 代表健康。若希望多种返回码都可代表健康,则将相应的值相加。sourceIpType: 0 # 可选值:0或1,设定健康检查源ip。0 表示负载均衡VIP,1 表示 100.64.0.0/10 网段ip。对于域名化clb默认值为1且只能为1,对于非域名化的clb默认值不一定,可在clb控制台配置页面看能否看到VIP探测方式,如能看到默认值为0,否则为1,更多详情查看 https://cloud.tencent.com/document/product/214/86666。checkType: "HTTP" # 可选值:HTTP 或 TCP,默认 HTTP。2024.06之后新建的集群支持改字段,存量集群如有需要可提工单升级后台组件来支持。scheduler: WRR # 可选值:WRR、LEAST_CONN、IP_HASH
该示例包含以下配置:
该 TkeServiceConfig 名称为
jetty-ingress-config
。且在七层监听器配置中,声明了两段配置:1. 80端口的 HTTP 监听器将会被配置,其中包含域名配置,是默认域名对应负载均衡的 VIP。
/health
路径下的健康检查被关闭了。2. 443端口的 HTTPS 监听器将会被配置。其中包含域名配置,域名是
sample.tencent.com
。该域名下仅描述了一个转发路径为/
的转发规则配置,其中配置包含以下内容:打开健康检查,健康检查间隔调整为10s,健康阈值2次,不健康阈值2次。通过 HEAD 请求进行健康检查,检查路径为
/checkHealth
,检查域名为 sample.tencent.com
。打开会话保持功能,会话保持的超时时间设置为3600s。
转发策略配置为:按权重轮询。
kubectl 配置命令
$ kubectl apply -f jetty-deployment.yaml$ kubectl apply -f jetty-service.yaml$ kubectl apply -f jetty-ingress.yaml$ kubectl apply -f jetty-ingress-config.yaml$ 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# 获取TkeServiceConfig配置列表$ kubectl get tkeserviceconfigs.cloud.tencent.comNAME AGEjetty-ingress-config 52s# 更新修改TkeServiceConfig配置$ kubectl edit tkeserviceconfigs.cloud.tencent.com jetty-ingress-configtkeserviceconfigs.cloud.tencent.com/jetty-ingress-config edited