为负载均衡类型的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连接集群。
通过控制台创建
- 登录CCE控制台,单击集群名称进入集群。
- 在左侧导航栏中选择“服务”,在右上角单击“创建服务”。
- 设置Service参数。本示例中仅列举使用SNI的必选参数,其余参数可根据需求参考创建LoadBalancer类型Service进行设置。
- Service名称:自定义服务名称,可与工作负载名称保持一致。
- 访问类型:选择“负载均衡”。
- 选择器:添加标签,Service根据标签选择Pod,填写后单击“确认添加”。也可以引用已有工作负载的标签,单击“引用负载标签”,在弹出的窗口中选择负载,然后单击“确定”。
- 负载均衡器:选择弹性负载均衡的类型、创建方式。
- 类型:“独享型”或“共享型”,其中独享型ELB需选择“应用型(HTTP/HTTPS)”或“网络型(TCP/UDP)&应用型(HTTP/HTTPS)”,否则监听器端口将无法启用HTTP/HTTPS。
- 创建方式:本文中以选择已有ELB为例进行说明,关于自动创建的配置参数请参见表1。
- 端口配置:
- 协议:请选择TCP协议,选择UDP协议将无法使用HTTP/HTTPS。
- 服务端口:Service使用的端口,端口范围为1-65535。
- 容器端口:工作负载程序实际监听的端口,需用户确定。例如nginx默认使用80端口。
- 监听器前端协议:本例中Service使用SNI需选择开启HTTPS。当选择独享型负载均衡器类型时,需包含“应用型(HTTP/HTTPS)”方可支持配置HTTP/HTTPS。
- 监听器配置:
- SSL解析方式:当监听器端口启用HTTPS时可选择SSL解析方式。v1.23.14-r0、v1.25.9-r0、v1.27.6-r0、v1.28.4-r0及以上版本的集群支持。
- 单向认证:仅进行服务器端认证。如需认证客户端身份,请选择双向认证。
- 双向认证:双向认证需要负载均衡实例与访问用户互相提供身份认证,从而允许通过认证的用户访问负载均衡实例,后端服务器无需额外配置双向认证。
- CA证书:SSL解析方式选择“双向认证”时需要添加CA证书,用于认证客户端身份。CA证书又称客户端CA公钥证书,用于验证客户端证书的签发者;在开启HTTPS双向认证功能时,只有当客户端能够出具指定CA签发的证书时,HTTPS连接才能成功。
- 服务器证书:选择一个服务器证书作为默认证书。
- 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及以上版本的集群支持。
- SSL解析方式:当监听器端口启用HTTPS时可选择SSL解析方式。v1.23.14-r0、v1.25.9-r0、v1.27.6-r0、v1.28.4-r0及以上版本的集群支持。
- 单击“确定”,创建Service。
通过kubectl命令行创建
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
参数 |
参数类型 |
描述 |
---|---|---|
kubernetes.io/elb.protocol-port |
String |
Service使用HTTP/HTTPS时,需设置协议及端口号,格式为protocol:port。 其中,
例如,本示例中使用SNI时,Service协议必须设置为https,Service服务端口为80,因此参数值为https:80。 |
kubernetes.io/elb.cert-id |
String |
ELB服务中的证书ID,作为HTTPS服务器证书。 获取方法:在CCE控制台,单击顶部的“服务列表 > 网络 > 弹性负载均衡”,并选择“证书管理”。在列表中复制对应证书名称下的ID即可。 |
kubernetes.io/elb.tls-certificate-ids |
String |
ELB服务中的SNI证书ID列表(SNI证书中必须带有域名),不同ID间使用英文逗号隔开。 如果无法根据客户端请求的域名查找到对应的SNI证书,则默认返回服务器证书。 获取方法:在CCE控制台,单击顶部的“服务列表 > 网络 > 弹性负载均衡”,并选择“证书管理”。在列表中复制对应证书名称下的ID即可。 |