腾讯云容器服务 TKE 标准集群 - Ingress 使用 TkeServiceConfig 配置 CLB
文档简介:
TkeServiceConfig:
TkeServiceConfig 是腾讯云容器服务 TKE 提供的自定义资源 CRD,通过 TkeServiceConfig 能够帮助您更灵活的进行 Ingress 管理负载均衡的各种配置。
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:指定后端协议。
后端协议是指 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: extensions/v1beta1kind: 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:serviceName: jetty-serviceservicePort: 80path: /health- host: "sample.tencent.com"http:paths:- backend:serviceName: jetty-serviceservicePort: 443path: /tls:- 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 # 指定后端协议为 HTTPhealthCheck:enable: false- protocol: HTTPSport: 443defaultServer: "sample.tencent.com" # 默认域名keepaliveEnable: 1 # 监听器开启长连接(非keepalive白名单用户,请勿声明该字段)domains:- domain: "sample.tencent.com"rules:- url: "/"forwardType: HTTPS # 指定后端协议为 HTTPSsession: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 代表健康。若希望多种返回码都可代表健康,则将相应的值相加。
scheduler: WRR
该示例包含以下配置:
该 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