更新时间:2024-08-17 GMT+08:00

为负载均衡类型的Service配置TLS

TLS协议适用于需要超高性能和大规模TLS卸载的场景。您可以为Service配置TLS协议,转发来自客户端加密的TCP协议请求。

Service配置TLS协议依赖ELB能力,使用该功能前请确认当前区域是否支持使用TLS协议。

前提条件

  • 已创建Kubernetes集群,且集群版本满足以下要求:
    • v1.23集群:v1.23.14-r0及以上版本
    • v1.25集群:v1.25.9-r0及以上版本
    • v1.27集群:v1.27.6-r0及以上版本
    • v1.28集群:v1.28.4-r0及以上版本
    • 其他更高版本的集群
  • 如果您需要通过命令行创建,需要使用kubectl连接到集群,详情请参见通过kubectl连接集群

约束与限制

使用TLS协议时,不支持同时配置会话保持。

通过控制台创建

  1. 登录CCE控制台,单击集群名称进入集群。
  2. 在左侧导航栏中选择“服务”,在右上角单击“创建服务”
  3. 设置Service参数。本示例中仅列举使用TLS的必选参数,其余参数可根据需求参考创建LoadBalancer类型Service进行设置。

    • Service名称:自定义服务名称,可与工作负载名称保持一致。
    • 访问类型:选择“负载均衡”
    • 选择器:添加标签,Service根据标签选择Pod,填写后单击“确认添加”。也可以引用已有工作负载的标签,单击“引用负载标签”,在弹出的窗口中选择负载,然后单击“确定”
    • 负载均衡器:选择弹性负载均衡的类型、创建方式。
      • 类型:本例中仅支持选择“独享型”,且需选择“网络型(TCP/UDP/TLS)”“网络型(TCP/UDP/TLS)&应用型(HTTP/HTTPS)”,否则监听器端口将无法启用TLS。
      • 创建方式:本文中以选择已有ELB为例进行说明,关于自动创建的配置参数请参见表1
    • 端口配置:
      • 协议:请选择TCP协议,选择UDP协议将无法使用TLS。
      • 服务端口:Service使用的端口,端口范围为1-65535。
      • 容器端口:工作负载程序实际监听的端口,需用户确定。例如nginx默认使用80端口。
      • 监听器前端协议:本例中Service需选择TLS协议。当选择独享型负载均衡器类型时,需包含“网络型(TCP/UDP/TLS)”方可支持配置TLS协议。
    • 监听器配置:
      • SSL解析方式:当监听器端口启用HTTPS/TLS时可选择SSL解析方式。v1.23.14-r0、v1.25.9-r0、v1.27.6-r0、v1.28.4-r0及以上版本的集群支持。
        • 单向认证:仅进行服务器端认证。如需认证客户端身份,请选择双向认证。
        • 双向认证:双向认证需要负载均衡实例与访问用户互相提供身份认证,从而允许通过认证的用户访问负载均衡实例,后端服务器无需额外配置双向认证。
      • CA证书:SSL解析方式选择“双向认证”时需要添加CA证书,用于认证客户端身份。CA证书又称客户端CA公钥证书,用于验证客户端证书的签发者;在开启双向认证功能时,只有当客户端能够出具指定CA签发的证书时,连接才能成功。
      • 服务器证书:选择一个服务器证书。如果当前无可选证书,需前往弹性负载均衡控制台进行创建,详情请参见创建证书
      • ProxyProtocol:支持通过ProxyProtocol协议携带客户端真实IP到后端服务器。

        请确保后端服务器具有解析ProxyProtocol协议的能力,否则可能导致业务中断,请谨慎开启。

      • 安全策略:当监听器端口启用TLS时,支持选择可用的安全策略。v1.23.14-r0、v1.25.9-r0、v1.27.6-r0、v1.28.4-r0及以上版本的集群支持。
      • 后端协议:当监听器端口启用TLS时,支持使用TCP或TLS协议对接后端服务,默认为TCP。v1.23.14-r0、v1.25.9-r0、v1.27.6-r0、v1.28.4-r0及以上版本的集群支持。
    图1 配置TLS

  4. 单击“确定”,创建Service。

通过kubectl命令行创建

以关联已有ELB为例,Service使用TLS的YAML文件配置如下:
apiVersion: v1
kind: Service
metadata:
  name: test-tls
  labels:
    app: nginx
  namespace: default
  annotations:
    kubernetes.io/elb.class: performance                                        # ELB类型,TLS监听器仅支持performance,即独享型ELB
    kubernetes.io/elb.id: 35cb350b-23e6-4551-ac77-10d5298f5204                  # 已有ELB的ID
    kubernetes.io/elb.protocol-port: tls:443                                    # 需要开启TLS的端口
    kubernetes.io/elb.cert-id: 98e91cb03dea418582a438a212b461d5                 # TLS的服务器证书
    kubernetes.io/elb.tls-certificate-ids: e59934f5bc7044f58693de79f1cb4b6d     # TLS的SNI证书
    kubernetes.io/elb.client-ca-cert-id: 5b5178323a2f4eddbafed065945d9069       # TLS双向认证中客户端的CA证书
    kubernetes.io/elb.proxy-protocol-enable: 'true'                             # 是否开启ProxyProtocol协议,通过ProxyProtocol协议携带客户端真实IP到后端服务器。
    kubernetes.io/elb.security-pool-protocol: 'on'                              # 后端安全协议,开启后,后端协议为TLS,否则为TCP
    kubernetes.io/elb.security-policy-id: 175318e0-b6cb-44c5-80a2-0dc372f20df5  # 自定义安全策略ID,优先级高于系统预置的安全策略
    kubernetes.io/elb.tls-ciphers-policy: tls-1-2-fs                            # 系统预置的安全策略
spec:
  selector:
    app: nginx
  externalTrafficPolicy: Cluster
  ports:
    - name: cce-service-0
      targetPort: 80
      nodePort: 0
      port: 443
      protocol: TCP
  type: LoadBalancer
  loadBalancerIP: **.**.**.**
表1 关键参数说明

参数

参数类型

描述

kubernetes.io/elb.protocol-port

String

Service使用TLS/HTTP/HTTPS时,需设置协议及端口号,格式为protocol:port。

其中,

  • protocol:为监听器端口对应的协议,取值为tls、http或https。
  • port:为Service的服务端口,即spec.ports[].port指定的端口。

例如,本示例中创建TLS监听器,Service协议必须设置为tls,Service服务端口为443,因此参数值为tls:443

kubernetes.io/elb.cert-id

String

ELB服务中的证书ID,作为TLS/HTTPS服务器证书。

获取方法:在CCE控制台,单击顶部的“服务列表 > 网络 > 弹性负载均衡”,并选择“证书管理”。在列表中复制对应证书名称下的ID即可。

kubernetes.io/elb.tls-certificate-ids

String

ELB服务中的SNI证书ID列表(SNI证书中必须带有域名),不同ID间使用英文逗号隔开。更新时,通过指定空字符串""来移除SNI证书。

获取方法:在CCE控制台,单击顶部的“服务列表 > 网络 > 弹性负载均衡”,并选择“证书管理”。在列表中复制对应证书名称下的ID即可。

kubernetes.io/elb.client-ca-cert-id

String

ELB服务中的CA证书ID,CA证书又称客户端CA公钥证书,用于验证客户端证书的签发者;在开启TLS/HTTPS双向认证功能时,只有当客户端能够出具指定CA签发的证书时,TLS/HTTPS连接才能成功。更新时,通过指定空字符串""来移除CA证书。

获取方法:在CCE控制台,单击顶部的“服务列表 > 网络 > 弹性负载均衡”,并选择“证书管理”,并筛选证书类型为CA证书。在列表中复制对应证书名称下的ID即可。

kubernetes.io/elb.security-pool-protocol

String

监听器前端协议为TLS/HTTPS时,可以开启后端安全协议,开启后后端协议为TLS/HTTPS。不支持更新已有监听器的后端安全协议,更新后仅对新创建的监听器生效(通过更新协议或者端口会创建新的监听器)。

  • on/true:表示开启
  • off/false:表示关闭

kubernetes.io/elb.security-policy-id

String

自定义安全策略的ID,优先级高于系统预置的安全策略。更新时,通过指定空字符串""来移除。

获取方法:在CCE控制台,单击顶部的“服务列表 > 网络 > 弹性负载均衡 > TLS安全策略”,并选择“自定义策略”页签。在列表中复制对应策略名称下的ID即可。

kubernetes.io/elb.tls-ciphers-policy

String

系统预置的安全策略,默认为tls-1-0。

获取方法:在CCE控制台,单击顶部的“服务列表 > 网络 > 弹性负载均衡 > TLS安全策略”,并选择“默认策略”页签。在列表中复制对应策略名称即可。

kubernetes.io/elb.proxy-protocol-enable

String

开启ProxyProtocol协议,仅在前端协议为TLS时生效,通过ProxyProtocol协议携带客户端真实IP到后端服务器。

  • on/true:表示开启
  • off/false:表示关闭
说明:

请确保后端服务器具体解析ProxyProtocol协议的能力,否则可能导致业务中断,请谨慎开启。