使用HTTPS协议进行监听时,您需要配置SSL/TLS证书以确保监听与客户端的加密连接。本文介绍ALB Ingress支持的多种配置证书的方法。
证书配置方式对比
ALB Ingress支持三种配置证书的方式:自动发现证书、Secret证书和AlbConfig指定证书。三种配置方式的对比如下。
| 对比项 | 自动发现证书 | AlbConfig指定证书 | Secret证书 | 
| 证书存储方式 | 阿里云数字证书中心。 | 集群内的Secret资源。 | |
| 证书发现方式 | 使用域名匹配自动发现。 | 通过数字证书中心生成的证书ID发现。 | 指定集群的内的Secret资源发现。 | 
| 适用场景 | 适用于已在阿里云数字证书中心购买证书或上传证书的场景。 | 适用于需要在集群内部管理证书的场景,例如使用cert-manager类的管理工具时。 | |
| 跨命名空间使用 | 支持。 | 不支持,仅支持在Secret资源所处的命名空间使用。 | |
| 更新证书方式 | 在数字证书管理服务控制台上传新证书或续费证书后,更新Ingress资源。 | 更新Secret资源的内容。 | |
单个ALB实例支持的证书上限为25个。通常情况下,单个ALB实例所使用的证书数量等于此ALB实例所有监听的证书数量之和(包括关联在Ingress资源上的证书)。具体的计算方法,请参见ALB配额计算方式。
证书管理方式兼容性说明
如果同时使用了多种证书配置方式,证书的管理方式和兼容性如下所示。
| 证书配置情况 | 说明 | 
| 在Ingress中同时使用了自动发现证书和Secret证书。 | 
 | 
| 同时使用了自动发现证书和AlbConfig指定证书,并且它们关联的Listener相同。 | 如果在AlbConfig中指定了证书,则此Listener不会使用自动发现证书。 | 
| 同时使用了Secret证书和AlbConfig指定证书,并且它们关联的Listener相同。 | AlbConfig指定证书和Secret证书是可以完全兼容的,并且可以同时使用。 | 
前提条件
已获取到可信的数字证书。您可以从以下几个途径获取数字证书:
操作流程
步骤一:AlbConfig中创建HTTPS监听
控制台
- 登录容器服务管理控制台,在左侧导航栏选择集群列表。 
- 在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择。 
- 在资源对象浏览器页签的搜索框中,搜索AlbConfig,然后单击搜索结果AlbConfig。 
- 在AlbConfig面板中,找到目标AlbConfig资源(默认为alb),单击其右侧操作列下的YAML编辑。 
- 在查看YAML面板,新增 - spec.listeners.port和- spec.listeners.protocol字段。然后单击确定。 
kubectl
- 使用以下命令,编辑 - albconfig配置文件。- kubectl edit albconfig <Albconfig_Name>
- 根据您的需求修改配置,可以在Albconfig中设置 - port和- protocol,以创建相应的监听。- apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb spec: config: addressAllocatedMode: Fixed addressType: Internet zoneMappings: - vSwitchId: vsw-bp19sXXXXXXX176iv - vSwitchId: vsw-bp1boXXXXXXXu74xz listeners: - port: 80 protocol: HTTP - port: 443 # 新增。 protocol: HTTPS # 新增,protocol的可选项为HTTP、HTTPS、QUIC。
(可选)步骤二:生成自签名证书
如果还未获取证书,执行以下命令可以通过OpenSSL创建自签名证书。
- 由于缺乏可靠的CA认证,自签名证书在浏览器和客户端中默认不受信任,通常会导致客户访问时收到安全警告。本文中生成的自签名证书仅作为示例,请勿在生产环境中使用。 
- 命令中的 - demo.alb.ingress.top是生成的自签名证书所关联的域名。如果您已拥有自己的域名,请进行替换。
openssl genrsa -out albtop-key.pem 4096
openssl req -subj "/CN=demo.alb.ingress.top" -sha256  -new -key albtop-key.pem -out albtop.csr
echo subjectAltName = DNS:demo.alb.ingress.top > extfile.cnf
openssl x509 -req -days 3650 -sha256 -in albtop.csr -signkey albtop-key.pem -out albtop-cert.pem -extfile extfile.cnf- 执行以下命令,查看证书和私钥。 - cat albtop-key.pem # 私钥。- cat albtop-cert.pem # 证书。
- 执行以下命令,使用Base64对证书和私钥编码。 - echo -n `cat albtop-key.pem` | base64 # Base64加密私钥文件。- echo -n `cat albtop-cert.pem` | base64 # Base64加密证书文件.
步骤三:创建示例资源
除了AlbConfig外,ALB Ingress还需要Deployment、Service、IngressClass和Ingress这4种资源才能正常工作,您可以使用以下的示例快速创建这4种资源。
控制台
- 登录容器服务管理控制台,在左侧导航栏选择集群列表。 
- 在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择。 
- 单击使用YAML创建资源。 - 示例模板:选择自定义。 
- 模板:输入YAML配置文件代码。该配置文件用于Deployment、Service、IngressClass和Ingress这四种资源。 
- 配置完成后单击创建,页面将提示创建成功。 
- 检查Deployment和Service创建成功: - 在左侧导航栏,选择工作负载 > 无状态。可查看到名称为 - https-deploy的Deployment已部署。
- 在左侧导航栏,选择网络 > 服务。可查看到名称为的 - https-svc的Service已部署。
- 在左侧导航栏,选择可查看到名称为的 - https-ingress的Ingress已部署。
 
 
kubectl
- 创建https-quickstart.yaml文件,并将以下内容拷贝到该文件中并保存。 - apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: https-ingressclass spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: alb # 修改为AlbConfig资源的名称。 --- apiVersion: apps/v1 kind: Deployment metadata: name: https-deploy spec: replicas: 1 selector: matchLabels: app: https-deploy template: metadata: labels: app: https-deploy spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/acs-sample/old-nginx:latest imagePullPolicy: IfNotPresent name: https-deploy ports: - containerPort: 80 protocol: TCP --- apiVersion: v1 kind: Service metadata: name: https-svc spec: ports: - name: port1 port: 443 protocol: TCP targetPort: 80 selector: app: https-deploy sessionAffinity: None type: ClusterIP --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: name: https-ingress spec: ingressClassName: https-ingressclass rules: - host: demo.alb.ingress.top http: paths: - backend: service: name: https-svc port: number: 443 path: / pathType: Prefix
- 执行以下命令创建。 - kubectl apply -f https-quickstart.yaml
步骤四:配置证书
使用自动发现证书
控制台
在将证书上传到阿里云数字证书中心后,您可以通过在Ingress中的TLS配置证书关联的域名,使ALB Ingress自动发现并使用已上传的证书。
- 将自签名证书上传至阿里云数字证书中心。具体操作,请参见上传和共享SSL证书。 
- 登录容器服务管理控制台,在左侧导航栏选择集群列表。 
- 在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择。 
- 在路由页面,单击目标Ingress其右侧操作列下的更新,然后在编辑 Ingress对话框中,配置如下参数。 - 配置项 - 说明 - 示例值 - TLS配置 - 开启TLS配置开关,配置安全的路由服务。 - 域名:自定义域名。 
- 保密字典:根据需要选择对应的保密字典。 说明- 值为空时,为自动发现形式配置证书。 - 如果您需要创建Secret,请执行如下操作。 - 在保密字典右侧,单击创建。 
- 在创建 Secret对话框,自定义保密字典的名称、Cert、Key,然后单击确定。 
- 在保密字典的下拉框,选择已创建的Secret。 
 
 - 单击+ 新增TLS配置,可配置多条TLS。 - 域名:demo.alb.ingress.top 
- 保密字典:不填值,为空。 
 - (可选)注解 - 您可自定义注解名称和值,也可根据名称选择或搜索要配置的注解。Ingress的注解请参见Ingress支持的Annotation。单击+添加注解,可对Ingress无上限地添加注解。 - 无需配置。 说明- 如需同时监听HTTP/HTTPS协议时需要添加如下注释。 - 名称: - alb.ingress.kubernetes.io/listen-ports
- 值: - [{"HTTP": 80},{"HTTPS": 443}]
  
kubectl
在将证书上传到阿里云数字证书中心后,您可以通过在Ingress中的tls字段里填入证书关联的域名,使ALB Ingress自动发现并使用已上传的证书。
- 将自签名证书上传至阿里云数字证书中心。具体操作,请参见上传和共享SSL证书。 
- 执行以下命令编辑Ingress。 - kubectl edit ingress https-ingress
- 添加 - tls字段,填入证书关联的域名。- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: # annotations: # alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS": 443}]' # 如果需要同时监听HTTP和HTTPS协议时需要添加此注释。 name: https-ingress spec: ingressClassName: https-ingressclass rules: - host: demo.alb.ingress.top # demo.alb.ingress.top替换为证书关联的域名 http: paths: - backend: service: name: https-svc port: number: 443 path: / pathType: Prefix tls: # 新增。 - hosts: # 新增。 - demo.alb.ingress.top # 新增,需要和“rules: host“字段中的域名保持一致,同时是证书关联的域名。
使用Secret证书
控制台
- 登录容器服务管理控制台,在左侧导航栏选择集群列表。 
- 在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择。 
- 在路由页面,单击目标Ingress其右侧操作列下的更新,然后在编辑 Ingress对话框中,配置如下参数。 - 配置项 - 说明 - 示例值 - TLS配置 - 开启TLS配置开关,配置安全的路由服务。 - 域名:自定义域名。 
- 保密字典:根据需要选择对应的保密字典。 说明- 值为空时,为自动发现形式配置证书。 - 如果您需要创建Secret,请执行如下操作。 - 在保密字典右侧,单击创建。 
- 在创建 Secret对话框,自定义保密字典的名称、Cert、Key,然后单击确定。 
- 在保密字典的下拉框,选择已创建的Secret。 
 
 - 单击+ 新增TLS配置,可配置多条TLS。 - 域名:demo.alb.ingress.top 
- 保密字典:https-secret - Secret名称:https-secret 
- Cert:非Base64加密自签证书。 
- Key:非Base64加密自签私钥。 
 
 - (可选)注解 - 您可自定义注解名称和值,也可根据名称选择或搜索要配置的注解。Ingress的注解请参见Ingress支持的Annotation。单击+添加注解,可对Ingress无上限地添加注解。 - 无需配置。 说明- 如需同时监听HTTP/HTTPS协议时需要添加如下注释。 - 名称: - alb.ingress.kubernetes.io/listen-ports
- 值: - [{"HTTP": 80},{"HTTPS": 443}]
  
kubectl
您可以将证书保存在集群的Secret资源中,并在Ingress中使用。
- 创建Secret - 使用以下内容创建https-secret.yaml,示例如下,对应的证书和私钥编码请参见步骤二使用Base64对证书和私钥编码。 - apiVersion: v1 kind: Secret metadata: name: https-secret type: kubernetes.io/tls data: tls.key: | # Base64编码后的albtop-key.pem。 {base64 albtop-key.pem} tls.crt: | # Base64编码后的albtop-cert.pem。 {base64 albtop-cert.pem}
- 执行以下命令,创建Secret。 - kubectl apply -f https-secret.yaml
 
- 编辑Ingress。 - 执行以下命令编辑Ingress。 - kubectl edit ingress https-ingress
- 添加 - tls字段,填入证书关联的域名,以及secret资源的名称。- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: # annotations: # alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS": 443}]' # 如果需要同时监听HTTP和HTTPS协议时需要添加此注释。 name: https-ingress namespace: default spec: ingressClassName: alb rules: - host: demo.alb.ingress.top # demo.alb.ingress.top替换为证书关联的域名。 http: paths: - backend: service: name: https-svc port: number: 443 path: / pathType: Prefix tls: # 新增。 - hosts: - demo.alb.ingress.top # 新增,需要和“rules: host“字段中的域名保持一致,同时是证书关联的域名。 secretName: https-secret # 新增,创建证书密钥。
 
使用AlbConfig指定证书
控制台
- 获取自签证书的CertIdentifier。 - 在将证书上传到阿里云数字证书中心后,您可以在AlbConfig中的监听的 - CertificateId字段填入证书的ID,以便为监听关联已上传的证书。说明- 如果监听配置了证书,那么此监听下的Ingress将不再使用自动发现证书。 - 上传自签名证书至阿里云数字证书中心。具体操作,请参见上传和共享SSL证书。 
- 获取证书ID。 - 登录数字证书管理服务控制台。 
- 在左侧导航栏,选择。 
- 在SSL证书管理页面,单击上传证书页签,在目标证书操作列下单击更多。 - 在证书详情面板中获取CertIdentifier。 
 
 
- 关联证书至AlbConfig。 
- 编辑Ingress。 - 登录容器服务管理控制台,在左侧导航栏选择集群列表。 
- 在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择。 
- 在路由页面,单击目标Ingress其右侧操作列下的更新,然后在编辑 Ingress对话框中,配置如下参数。 - 配置项 - 说明 - 示例值 - 注解 - 您可自定义注解名称和值,也可根据名称选择或搜索要配置的注解。Ingress的注解请参见Ingress支持的Annotation。单击+添加注解,可对Ingress无上限地添加注解。 - 名称: - alb.ingress.kubernetes.io/listen-ports
- 值: - [{"HTTPS": 443}]说明- 如果需要同时监听HTTP和HTTPS协议替换为 - [{"HTTP": 80},{"HTTPS": 443}]
  
 
kubectl
在将证书上传到阿里云数字证书中心后,您可以在AlbConfig中的监听的CertificateId字段填入证书的ID,以便为监听关联已上传的证书。
如果监听配置了证书,那么此监听下的Ingress将不再使用自动发现证书。
- 上传自签名证书至阿里云数字证书中心。具体操作,请参见上传和共享SSL证书。 
- 获取证书ID。 - 登录数字证书管理服务控制台。 
- 在左侧导航栏,选择。 
- 在SSL证书管理页面,单击上传证书页签,在目标证书操作列下单击更多。 - 在证书详情面板中获取CertIdentifier。 
 
关联证书至AlbConfig。
- 执行以下命令编辑AlbConfig。 - kubectl edit albconfig <ALBCONFIG_NAME> # <ALBCONFIG_NAME>替换AlbConfig的名称
- 在监听中添加 - certificates字段,填入之前步骤中获取的CertIdentifier。- apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb spec: config: addressType: Intranet name: xiaosha-alb-test listeners: - port: 80 protocol: HTTP - certificates: - CertificateId: 756****-cn-hangzhou # 证书的CertIdentifier。 IsDefault: true # 是否为默认证书。 port: 443 protocol: HTTPS
- 执行以下命令编辑Ingress。 - kubectl edit ingress https-ingress
- 新增 - alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS": 443}]'注释。- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS": 443}]' # 新增,如果需要同时监听HTTP和HTTPS协议时修改为'[{"HTTP": 80},{"HTTPS": 443}]' 。 name: https-ingress spec: ingressClassName: https-ingressclass rules: - host: demo.alb.ingress.top # demo.alb.ingress.top替换为证书关联的域名 http: paths: - backend: service: name: https-svc port: number: 443 path: / pathType: Prefix
步骤五:效果验证
通过使用HTTPS协议访问服务,可以验证配置证书的效果。
- 执行以下命令,查看Ingress信息。 - kubectl get ingress- 预期输出: - NAME CLASS HOSTS ADDRESS PORTS AGE https-ingress https-ingressclass demo.alb.ingress.top alb-********.alb.aliyuncs.com 80, 443 83m- 记录下 - HOSTS与- ADDRESS部分的值,以便后续步骤使用。
- 执行以下命令,使用HTTPS协议连接ALB Ingress访问后端服务。其中的 - demo.alb.ingress.top与- alb-********.alb.aliyuncs.com请替换为在上一步中得到的值。- curl -H HOST:demo.alb.ingress.top -k https://alb-********.alb.aliyuncs.com- 预期输出如下,则表明证书配置成功: - old
相关文档
- 如果您希望兼容客户端使用HTTP/3协议访问服务,请参见使用QUIC监听兼容HTTP/3协议。 
- 如果您希望在监听上使用HTTPS双向认证功能,请参见使用HTTPS双向认证提高服务的安全性。 
