用户指南

文档中心 > 容器服务 > 用户指南 > Ingress 管理 > Ingress 使用 TKEServiceConfig 配置 CLB

Ingress 使用 TKEServiceConfig 配置 CLB

最近更新时间:2020-06-24 17:39:42

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:转发路径
说明:

当您的域名配置为默认值,即公网或内网 VIP 时,可以通过 domain 填空值的方式进行配置。

TkeServiceConfig 的同步行为

  • 当用户在 Ingress 中使用配置注解时,负载均衡将会即刻进行设置同步。
  • 当用户在 Ingress 中删除配置注解时,负载均衡将会保持不变。
  • 修改 TkeServiceConfig 配置时,引用该配置的 Ingress 的负载均衡将会根据新的 TkeServiceConfig 进行设置同步。
  • 当 Ingress 的监听器没有找到对应配置时,该监听器将不会进行修改。
  • Ingress 的监听器找到对应配置时,若配置中没有声明的属性,该监听器将不会进行修改。

示例

Deployment 示例:jetty-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: jetty
  name: jetty-deployment
  namespace: default
spec:
  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: v1
kind: Service
metadata:
  name: jetty-service
  namespace: default
spec:
  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: NodePort

该示例包含以下配置:
Service 的 NodePort 类型,声明了两个 TCP 服务。一个在80端口,一个在443端口。

Ingress:jetty-ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  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
  name: jetty-ingress
  namespace: default
spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: jetty-service
          servicePort: 80
        path: /health
  - host: "sample.tencent.com"
    http:
      paths:
      - backend:
          serviceName: jetty-service
          servicePort: 443
        path: /
  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/v1alpha1
kind: TkeServiceConfig
metadata:
  name: jetty-ingress-config
  namespace: default
spec:
  loadBalancer:
    l7Listeners:
    - protocol: HTTP
      port: 80
      domains:
      - domain: ""
        rules:
        - url: "/health"
          healthCheck:
            enabled: false
    - protocol: HTTPS
      port: 443
      domains:
      - domain: "sample.tencent.com"
        rules:
        - url: "/"
          session:
            enabled: true
            sessionExpireTime: 3600
          healthCheck:
            enabled: true
            intervalTime: 10
            healthNum: 2
            unHealthNum: 2
            httpCheckPath: "/checkHealth"
            httpCheckDomain: "sample.tencent.com"
            httpCheckMethod: HEAD
          scheduler: 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。
    • 转发策略配置为:根据源 IP 哈希。

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 pods
NAME                                READY   STATUS    RESTARTS   AGE
jetty-deployment-8694c44b4c-cxscn   1/1     Running   0          8m8s
jetty-deployment-8694c44b4c-mk285   1/1     Running   0          8m8s
jetty-deployment-8694c44b4c-rjrtm   1/1     Running   0          8m8s

# 获取TkeServiceConfig配置列表
 kubectl get tkeserviceconfigs.cloud.tencent.com
NAME                   AGE
jetty-ingress-config   52s

# 更新修改TkeServiceConfig配置
 kubectl edit tkeserviceconfigs.cloud.tencent.com jetty-ingress-config
tkeserviceconfigs.cloud.tencent.com/jetty-ingress-config edited
目录