
# 为负载均衡类型的Service配置TLS
TLS协议适用于需要超高性能和大规模TLS卸载的场景。您可以为Service配置TLS协议，转发来自客户端加密的TCP协议请求。
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
Service配置TLS协议依赖ELB能力，使用该功能前请确认当前区域是否支持使用TLS协议，详情请参见[添加TLS监听器（独享型）](https://support.huaweicloud.com/usermanual-elb/elb_ug_jt_0100.html)。
#### 前提条件
- 已创建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连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)。
 
#### 约束与限制
使用TLS协议时，不支持同时配置会话保持。
#### 创建负载均衡并配置TLS
您可以通过以下方式进行创建。
- [通过控制台创建]
- [通过kubectl命令行创建]
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在左侧导航栏中选择"服务"，在右上角单击"创建服务"。 
   本示例中仅列举配置SNI的必选参数，其余参数保持默认，您可根据需求参考[通过控制台创建](https://support.huaweicloud.com/usermanual-cce/cce_10_0681.html#cce_10_0681__section6880821105120)进行设置。
   
   
3. 设置基础配置参数。 
   
   | 参数   | 说明                                                                                                                                                            | 示例        |
   |:---|:---|:---|
   | 访问类型 | 选择"负载均衡"。                                                                                                                                                     | -         |
   | 服务名称 | 自定义服务名称，可与工作负载名称保持一致。                                                                                                                                         | nginx     |
   | 命名空间 | 工作负载所在命名空间。                                                                                                                                                   | default   |
   | 选择器  | 您可以添加Pod标签的键值，Service将会根据标签与工作负载的Pod进行关联，将流量导向包含该标签的Pod。 您也可以引用已有工作负载的标签，单击"引用负载标签"，在弹出的窗口中选择负载，然后单击"确定"。 | app:nginx |
      
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002407634521.png "点击放大")
   
   
   
4. 设置负载均衡配置参数。 
   
   | 参数    | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | 示例                                              |
   |:---|:---|:---|
   | 负载均衡器 | 选择弹性负载均衡的类型及创建方式。其中独享型ELB需选择"网络型（TCP/UDP/TLS）"或"网络型（TCP/UDP/TLS）\&应用型（HTTP/HTTPS）"，否则监听器端口将无法启用TLS。 - 选择已有：仅支持选择与集群在同一个VPC下的ELB实例。如果没有可选的ELB实例，请单击"创建负载均衡器"跳转到ELB控制台创建。  - 自动创建：自动创建的负载均衡实例将创建到集群所在的VPC，具体配置如[表1](https://support.huaweicloud.com/usermanual-cce/cce_10_0681.html#cce_10_0681__table3428724185319)所示。 说明： 当集群使用共享VPC时，不支持自动创建共享型ELB。    | 选择已有"独享型"的"网络型（TCP/UDP/TLS）\&应用型（HTTP/HTTPS）"实例 |
      
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002380836822.png "点击放大")
   
   
   
5. 填写访问设置参数。
   
   
   | 参数   | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | 示例                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
   |:---|:---|:---|
   | 服务亲和 | 选择将外部流量路由到节点本地或集群范围的端点，详情请参见[服务亲和（externalTrafficPolicy）](https://support.huaweicloud.com/usermanual-cce/cce_10_0249.html#cce_10_0249__section18134208069)。 - 集群级别：集群下所有节点的IP+节点端口均可以访问到此服务关联的负载，服务访问会因路由跳转导致一定性能损失，且无法获取到客户端源IP。  - 节点级别：只有通过负载所在节点的IP+节点端口才可以访问此服务关联的负载，服务访问没有因路由跳转导致的性能损失，且可以获取到客户端源IP。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | 集群级别                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
   | 端口配置 | - 协议：请根据业务的协议类型选择。根据Kubernetes中定义的实现方案，Service在使用ELB提供的非UDP协议时，都需要将该参数设置为TCP并选择对应的[监听器前端协议](https://support.huaweicloud.com/usermanual-cce/cce_10_0681.html#cce_10_0681__li1688115499190)。详细说明请参见[Service所用的协议](https://kubernetes.io/zh-cn/docs/reference/networking/service-protocols/#special-cases)。  - 容器端口：工作负载程序实际监听的端口，需用户确定。例如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  - 服务端口：80  - 监听器前端协议：TLS   |
      
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002380497226.png "点击放大")
   
   
   
6. 设置负载监听器相关配置参数。 
   
   | 参数      | 说明                                                                                                                                                                                                                                                                     | 使用限制                                                                                                                                                                                                                      | 示例        |
   |:---|:---|:---|:---|
   | 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://support.huaweicloud.com/usermanual-elb/elb_ug_zs_0004.html)。                                                                                                                                                  | 当"监听器前端协议"选择"HTTPS"或"TLS"时支持该配置。                                                                                                                                                                                          | cert-test |
      
   
   
7. 设置后端分配策略。 
   
   | 参数   | 说明                                                                                                                                                                                                                           | 使用限制                                                    | 示例  |
   |:---|:---|:---|:---|
   | 后端协议 | 负载均衡器转发请求给后端服务器时使用的协议，后端服务器需监听此协议并响应。 当"监听器前端协议"选择"TLS"时支持后端协议为"TCP"或"TLS"，默认为TCP。 说明： 当添加多个端口时，如果部分端口选择的监听器前端协议非TLS，该配置仅对TLS端口生效。 | v1.23.14-r0、v1.25.9-r0、v1.27.6-r0、v1.28.4-r0及以上版本的集群支持。 | TCP |
      
   
   
8. 单击"创建"，创建Service。
 
以关联已有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：表示关闭   说明： 当添加多个端口时，如果部分端口选择的监听器前端协议非TLS，该配置仅对TLS端口生效。                               |
| 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协议的能力，否则可能导致业务中断，请谨慎开启。                                                                |
   
#### 验证配置
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在左侧导航栏中选择"服务"，找到新建Service所在行，端口对应的访问协议为TLS协议。 
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002380670782.png "点击放大")
   
   
   
 
