操作场景
本文档介绍 Ingress 证书使用相关的内容,您可在以下场景中进行 Ingress 证书配置:
- 创建 Ingress 选用 HTTPS 监听协议时,选用合适的服务器证书能够确保访问安全。
 - 为所有的 HTTPS 域名绑定同一个证书,简化配置 Ingress 下所有 HTTPS 规则的证书,使更新操作更加便捷。
 - 为不同的域名绑定不同的证书,改善服务器与客户端 SSL/TLS。
 
注意事项
- 需提前创建需配置的证书,详情请参见 通过控制台新建服务器证书。
 - 需使用 Secret 形式来设置 Ingress 证书。云容器服务 TKE Ingress 会默认创建同名 Secret,其内容包含证书 ID。
 - 若您需要更换证书,建议在证书平台新建一个证书,然后更新 Secret 的证书 ID。因为集群中组件的同步会以 Secret 的声明为准,若您直接在其他证书服务、负载均衡服务上更新的证书,将会被 Secret 里的内容还原。
 - Secret 证书资源需和 Ingress 资源放置在同一个 Namespace 下。
 - 由于控制台默认会创建同名 Secret 证书资源,若同名 Secret 资源已存在,则 Ingress 将无法创建。
 - 通常情况下,在创建 Ingress 时,不会复用 Secret 关联的证书资源。但仍支持在创建 Ingress 复用 Secret 关联的证书资源,更新 Secret 时,会同步更新所有引用该 Secret 的 Ingress 的证书。
 - 为域名增加匹配证书后,将同步开启负载均衡 CLB SNI 功能(不支持关闭)。若删除证书对应的域名,则该证书将默认匹配 Ingress 所对应的 HTTPS 域名。
 - 传统型负载均衡不支持基于域名和 URL 的转发,由传统型负载均衡创建的 Ingress 不支持配置多证书。
 
示例
TKE 支持通过 Ingress 中的 spec.tls 的字段,为 Ingress 创建的 CLB HTTPS 监听器配置证书。其中,secretName 为包含证书 ID 的 Kubernetes Secret 资源。示例如下:
Ingress
通过 YAML 创建:
spec:
    tls:
    - hosts:
      - www.abc.com
      secretName: secret-tls-2
        Secret
通过YAML 创建
apiVersion: v1
stringData:
    qcloud_cert_id: Xxxxxxxx ## 配置证书 ID 为 Xxxxxxxx
    qcloud_ca_cert_id: Xxxxxxxx ## 配置证书 ID 为 Xxxxxxxx。仅配置双向证书时需要,见下面的“注意”。
kind: Secret
metadata:
    name: abcd-com-cert
    namespace: default
type: Opaque
        通过控制台创建
您可以通过容器服务控制台创建,操作详情可参考 创建 Secret。 在“新建Secret” 页面,Secret 主要参数配置如下:
- 名称:自定义,本文以 cos-secret 为例。
 - Secret类型:选择 Opaque,该类型适用于保存密钥证书和配置文件,Value 将以 Base64 格式编码。
 - 生效范围:按需选择,需确保与 Ingress 在同一 Namespace 下。
 - 内容:变量名设置为 
qcloud_cert_id,变量值配置为服务器证书所对应的证书 ID。 
注意
若您需要配置双向证书,则 Secret 除了要添加“服务器证书”外,还需要添加“客户端CA证书”。此时该 Secret 还需要额外添加一个键值对:变量名为:
qcloud_ca_cert_id,变量值配置为“客户端CA证书”所对应的证书ID。
Ingress 证书配置行为
仅配置单个
spec.secretName且未配置 hosts 的情况下,将会为所有的 HTTPS 的转发规则配置该证书。示例如下:spec: tls: - secretName: secret-tls支持配置一级泛域名统配。 示例如下:
spec: tls: - hosts: - *.abc.com secretName: secret-tls若同时配置证书与泛域名证书,将优先选择一个证书。 示例如下,
www.abc.com将会使用secret-tls-2中描述的证书。spec: tls: - hosts: - *.abc.com secretName: secret-tls-1 - hosts: - www.abc.com secretName: secret-tls-2对已使用多个证书的 Ingress 进行更新时,TKE Ingress controller 将进行以下行为判断:
- HTTPS 的 rules.host 无任何匹配时,若判断不通过,则不能提交更新。
 - HTTPS 的 rules.host 匹配中单个 TLS 时,可提交更新,并为该 host 配置对 Secret 中对应的证书。
 - 修改 TLS 的 SecretName 时仅校验 SecretName 的存在性,而不校验 Secret 内容, Secret 存在即可提交更新。
 
注意
请确保 Secret 中证书 ID 符合要求。
操作步骤
通过控制台新建服务器证书
说明
若您已具备需配置的证书,则请跳过此步骤。
- 登录负载均衡控制台,选择左侧导航栏中的 证书管理。
 - 在“证书管理”页面中,单击【新建】。
 - 在弹出的“新建证书”窗口中,参考以下信息进行设置。
 
- 证书名称:自定义设置。
 - 证书类型:选择“服务器证书”。服务器证书即 SSL 证书(SSL Certificates)。基于 SSL 证书,可将站点由 HTTP(Hypertext Transfer Protocol)切换到 HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer),即基于安全套接字层(SSL)进行安全数据传输的加密版 HTTP 协议。
 - 证书内容:根据实际情况填写证书内容,证书格式要求请参见文档 SSL 证书格式要求及格式转换说明。
 - 密钥内容:仅当证书类型选择为“服务器证书”时,该选项才会显示。请参考文档 SSL 证书格式要求及格式转换说明 添加相关密钥内容。
 
- 单击提交即可完成创建。
 
创建使用证书的 Ingress 对象
注意事项:
- 当控制台创建的 Ingress 开启 HTTPS 服务,会先创建同名的 Secret 资源用于存放证书 ID,并在 Ingress 中使用并监听该 Secret。
 - TLS 配置域名与证书的对应关系如下:
- 可以使用一级泛域名统配。
 - 若域名匹配中多个不同的证书,将随机选择一个证书,不建议相同域名使用不同证书。
 - 需为所有 HTTPS 域名配置证书,否则会创建不通过。
 
 
操作步骤:
参考 创建 Ingress 完成 Ingress 新建,其中监听端口勾选 Https:443。
修改证书
注意事项:
- 如果您需要修改证书, 请确认所有使用该证书的 Ingress。如用户的多个 Ingress 配置使用同一个 Secret 资源,那么这些 Ingress 对应 CLB 的证书会同步变更。
 - 证书需要通过修改 Secret 进行修改, Secret 内容中包含您使用的云证书的 ID。
 
操作步骤:
执行以下命令,使用默认编辑器打开需修改的 Secret。其中,
[secret-name]需更换为需修改的 Secret 的名称。kubectl edit secrets [secret-name]修改 Secret 资源,将
qcloud_cert_id的值修改为新的证书 ID。 与创建 Secret 相同,修改 Secret 证书 ID 需要进行 Base64 编码,请根据实际需求选择 Base64 手动编码或者指定stringData进行 Base64 自动编码。
更新 Ingress 对象
通过控制台更新
登录容器服务控制台 ,选择左侧导航栏中的集群。
在“集群管理”页面,选择需修改 Ingress 的集群 ID。
在集群详情页,选择左侧【服务】 > 【Ingress】。
单击目标 Ingress 所在行右侧的【更新转发配置】。
在“更新转发配置”页面中,根据实际情况进行转发配置规则更新。
单击【更新转发配置】即可完成更新操作。
通过 YAML 更新
执行以下命令,使用默认编辑器打开需修改的 ingress,修改 yaml 文件并保存即可完成更新操作。
kubectl edit ingress <ingressname> -n <namespaces>