文档首页/ 云容器引擎 CCE/ 用户指南/ 网络/ 服务(Service)/ 负载均衡(LoadBalancer)/ 为负载均衡类型的Service配置服务器名称指示(SNI)
更新时间:2025-12-31 GMT+08:00
分享

为负载均衡类型的Service配置服务器名称指示(SNI)

SNI证书是一种扩展服务器证书,允许同一个IP地址和端口号下对外提供多个访问域名,可以根据客户端请求的不同域名来使用不同的安全证书,确保HTTPS通信的安全性。

在配置SNI时,用户需要添加绑定域名的证书,客户端会在发起SSL握手请求时就提交请求的域名信息,负载均衡收到SSL请求后,会根据域名去查找证书。如果找到域名对应的证书,则返回该证书;如果没有找到域名对应的证书,则返回服务器默认证书。

配置SNI后,如果您在CCE控制台删除SNI配置或在YAML中删除对应的annotation,ELB侧的配置将会保留。

前提条件

  • 已创建Kubernetes集群,且集群版本满足以下要求:
    • v1.23集群:v1.23.13-r0及以上版本
    • v1.25集群:v1.25.8-r0及以上版本
    • v1.27集群:v1.27.5-r0及以上版本
    • v1.28集群:v1.28.3-r0及以上版本
    • 其他更高版本的集群
  • 您已经在弹性负载均衡服务中创建好一个或多个SNI证书,且证书中指定了域名。详情请参见创建证书
  • 如果您需要通过命令行创建,需要使用kubectl连接到集群,详情请参见通过kubectl连接集群

步骤一:部署示例应用

本文以Nginx无状态工作负载为例。

  1. 登录CCE控制台,单击集群名称进入集群。
  2. 在左侧导航栏中选择“工作负载”,单击页面右上角“创建工作负载”
  3. 在工作负载的“基本信息”中,填写负载名称,本示例中为nginx。其他参数保持默认值。
  4. 在“容器配置 > 容器信息”中,填写容器镜像名称和镜像版本。其他参数保持默认值。

    配置项

    配置示例

    镜像名称

    单击“选择镜像”,选择“镜像中心”页签,搜索nginx,选择nginx后单击“确定”。

    镜像版本

    选择需要部署的镜像版本为latest。

  5. 其余参数均可保持默认,单击“创建工作负载”,完成创建。

步骤二:创建负载均衡并配置SNI

本文中使用示例证书cert-test、cert-sni-test,其中cert-sni-test包含SNI扩展域名,使用时请根据实际情况对以上证书进行替换。

  1. 登录CCE控制台,单击集群名称进入集群。
  2. 在左侧导航栏中选择“服务”,在右上角单击“创建服务”

    本示例中仅列举配置SNI的必选参数,其余参数保持默认,您可根据需求参考通过控制台创建(新版)进行设置。

  3. 设置基础配置参数。

    参数

    说明

    示例

    访问类型

    选择“负载均衡”

    -

    服务名称

    自定义服务名称,可与工作负载名称保持一致。

    nginx

    命名空间

    工作负载所在命名空间。

    default

    选择器

    您可以添加Pod标签的键值,Service将会根据标签与工作负载的Pod进行关联,将流量导向包含该标签的Pod。

    您也可以引用已有工作负载的标签,单击“引用负载标签”,在弹出的窗口中选择负载,然后单击“确定”

    app:nginx

  4. 设置负载均衡配置参数。

    参数

    说明

    示例

    负载均衡器

    选择弹性负载均衡的类型及创建方式。其中独享型ELB需选择“应用型(HTTP/HTTPS)”“网络型(TCP/UDP/TLS)&应用型(HTTP/HTTPS)”,否则监听器端口将无法启用HTTP/HTTPS。
    • 选择已有:仅支持选择与集群在同一个VPC下的ELB实例。如果没有可选的ELB实例,请单击“创建负载均衡器”跳转到ELB控制台创建。
    • 自动创建:自动创建的负载均衡实例将创建到集群所在的VPC,具体配置如表1所示。
      说明:

      当集群使用共享VPC时,不支持自动创建共享型ELB。

    选择已有“独享型”“网络型(TCP/UDP/TLS)&应用型(HTTP/HTTPS)”实例

  5. 填写访问设置参数。

    参数

    说明

    示例

    服务亲和

    选择将外部流量路由到节点本地或集群范围的端点,详情请参见服务亲和(externalTrafficPolicy)
    • 集群级别:集群下所有节点的IP+节点端口均可以访问到此服务关联的负载,服务访问会因路由跳转导致一定性能损失,且无法获取到客户端源IP。
    • 节点级别:只有通过负载所在节点的IP+节点端口才可以访问此服务关联的负载,服务访问没有因路由跳转导致的性能损失,且可以获取到客户端源IP。

    集群级别

    端口配置

    • 协议:请根据业务的协议类型选择。Service在使用ELB提供的TLS或HTTP协议时,根据Kubernetes中定义的实现方案,需要将该参数设置为TCP并选择对应的监听器前端协议。详细说明请参见Service所用的协议
    • 容器端口:工作负载程序实际监听的端口,需用户确定。例如nginx默认使用80端口。
    • 服务端口:Service使用的端口。
      • 单端口监听:端口范围为1-65535。
      • 区间端口监听:负载均衡服务支持创建某个端口范围的监听器,您最多可为每个监听器添加10个互不重叠的监听端口段。

        为负载均衡服务配置区间端口监听需满足以下条件:

        • 集群版本为v1.23.18-r0、v1.25.13-r0、v1.27.10-r0、v1.28.8-r0、v1.29.4-r0、v1.30.1-r0及以上。
        • 使用独享型ELB且选择TCP/UDP/TLS协议。
        • 该功能依赖ELB能力,使用该功能前请确认ELB在当前区域是否支持四层协议全端口监听和转发。
    • 监听器前端协议:ELB监听器的前端协议,是客户端与负载均衡监听器建立流量分发连接所使用的协议。当选择独享型负载均衡器类型时,包含“应用型(HTTP/HTTPS)”方可支持配置HTTP/HTTPS;包含“网络型(TCP/UDP/TLS)”方可支持配置TLS。
    说明:

    在创建LoadBalancer类型Service时,会自动生成一个随机节点端口号(NodePort)。

    • 协议:TCP协议
    • 容器端口:80
    • 服务端口:443
    • 监听器前端协议:HTTPS

  6. 设置负载监听器HTTP/HTTPS和SNI相关配置参数。

    参数

    说明

    使用限制

    示例

    SSL解析方式

    • 单向认证:仅进行服务器端认证。如需认证客户端身份,请选择双向认证。
    • 双向认证:双向认证需要负载均衡实例与访问用户互相提供身份认证,从而允许通过认证的用户访问负载均衡实例,后端服务器无需额外配置双向认证。

    “监听器前端协议”选择“HTTPS”或“TLS”时支持该配置。

    独享型ELB在v1.23.14-r0、v1.25.9-r0、v1.27.6-r0、v1.28.4-r0及以上版本的集群支持。共享型ELB在v1.28.15-r60、v1.29.15-r20、v1.30.14-r20、v1.31.10-r20、v1.32.6-r20、v1.33.5-r10及以上版本的集群支持。

    单向认证

    CA证书

    SSL解析方式选择“双向认证”时需要添加CA证书,用于认证客户端身份。CA证书又称客户端CA公钥证书,用于验证客户端证书的签发者;在开启HTTPS双向认证功能时,只有当客户端能够出具指定CA签发的证书时,HTTPS连接才能成功。

    “监听器前端协议”选择“HTTPS”或“TLS”,且“SSL解析方式”选择“双向认证”时支持该配置。

    -

    服务器证书

    选择一个服务器证书。如果当前无可选证书,需前往弹性负载均衡控制台进行创建,详情请参见创建证书

    “监听器前端协议”选择“HTTPS”或“TLS”时支持该配置。

    cert-test

    SNI

    选择是否添加SNI证书,如果需要添加SNI证书,则证书中必须包含域名。如果当前无可选证书,需前往弹性负载均衡控制台进行创建,详情请参见创建证书

    如果无法根据客户端请求的域名查找到域名对应的SNI证书,则默认返回服务器证书。

    “监听器前端协议”选择“HTTPS”或“TLS”时支持该配置。

    cert-sni-test

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

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

        如果无法根据客户端请求的域名查找到对应的SNI证书,则默认返回服务器证书。

      • 安全策略:当监听器前端协议选择“HTTPS”时,支持选择可用的安全策略,更多信息请参见安全策略。v1.23.14-r0、v1.25.9-r0、v1.27.6-r0、v1.28.4-r0及以上版本的集群支持。
      • 后端协议:当监听器前端协议选择“HTTPS”时,支持使用HTTP或HTTPS协议对接后端服务,默认为HTTP。v1.23.14-r0、v1.25.9-r0、v1.27.6-r0、v1.28.4-r0及以上版本的集群支持。
    图1 配置服务器名称指示(SNI)

  4. 单击“确定”,创建Service。
以关联已有ELB为例,Service使用SNI的YAML文件配置如下:
apiVersion: v1
kind: Service
metadata:
  name: test
  labels:
    app: test
  namespace: default
  annotations:
    kubernetes.io/elb.class: performance        # ELB类型
    kubernetes.io/elb.id: 65318265-4f01-4541-a654-fa74e439dfd3  # 已有ELB的ID
    kubernetes.io/elb.protocol-port: https:80    # 需要开启的SNI的端口
    kubernetes.io/elb.cert-id: b64ab636f1614e1a960b5249c497a880    # HTTPS的服务器证书
    kubernetes.io/elb.tls-certificate-ids: 5196aa70b0f143189e4cb54991ba2286,8125d71fcc124aabbe007610cba42d60    # SNI证书ID列表
    kubernetes.io/elb.lb-algorithm: ROUND_ROBIN
spec:
  selector:
    app: test
  externalTrafficPolicy: Cluster
  ports:
    - name: cce-service-0
      targetPort: 80
      nodePort: 0
      port: 80
      protocol: TCP
  type: LoadBalancer
  loadBalancerIP: **.**.**.**       # ELB的私有IP
表1 关键参数说明

参数

参数类型

描述

kubernetes.io/elb.protocol-port

String

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

其中,

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

例如,本示例中使用SNI时,Service协议必须设置为https,Service服务端口为80,因此参数值为https:80

kubernetes.io/elb.cert-id

String

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

获取方法:在ELB控制台,选择“证书管理”。在列表中复制对应证书名称下的ID即可。

kubernetes.io/elb.tls-certificate-ids

String

ELB服务中的SNI证书ID列表(SNI证书中必须带有域名),不同ID间使用英文逗号隔开。

如果无法根据客户端请求的域名查找到对应的SNI证书,则默认返回服务器证书。

获取方法:在ELB控制台,选择“证书管理”。在列表中复制对应证书名称下的ID即可。

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

String

仅配置双向认证时填写该注解,ELB服务中的证书ID,作为CA证书。

获取方法:在ELB控制台,选择“证书管理”。在列表中复制对应证书名称下的ID即可。

独享型ELB在v1.23.14-r0、v1.25.9-r0、v1.27.6-r0、v1.28.4-r0及以上版本的集群支持。共享型ELB在v1.28.15-r60、v1.29.15-r20、v1.30.14-r20、v1.31.10-r20、v1.32.6-r20、v1.33.5-r10及以上版本的集群支持。

步骤三:访问工作负载

  1. Service创建完成后,复制弹性负载均衡公网IP。

  2. 为域名配置DNS解析,然后可以在浏览器中使用SNI中的域名访问。配置DNS解析的操作步骤请参见添加公网域名解析记录

  3. 在浏览器中查看返回证书的具体信息,如签发者、有效期、SHA-256等,确认返回的是该域名对应的SNI证书。

相关文档