为保证公网环境下的通信安全,业务使用 Ingress 暴露到公网时,通常使用 HTTPS 协议通信。本文为您介绍如何为 ALB Ingress 配置 HTTPS 协议的证书。
证书分类
从证书生效的范围区分,ALB 支持如下类型的证书。
从证书的来源区分,ALB 支持如下类型的证书。
配置证书
在容器服务集群中配置 ALB Ingress 时,主要涉及到如下 Kubernetes 资源。
ALB Ingress 支持以下几种证书配置方式,不同方式的区别和适用场景,如下表所示。
注意
如需使用证书中心的证书,请首先登录您的火山引擎账号,然后单击 服务授权,并在弹出的页面中单击 立即授权,完成跨服务授权。 ALB 实例的证书是监听器级别的配置,Ingress 和 ALBInstance 都可以为监听器指定证书。因此,对于同一个监听器而言,可能有一个 ALBInstance + 多个 Ingress 与之关联。同时,这些关联资源上配置的证书可能存在差异。当多个资源上均配置了证书,且证书之间存在冲突时,VKE 集群中的生效逻辑为:选取到期时间最久的证书关联到 ALB 实例上。
例如:假设 ALB 实例中存在 80 监听器,Ingress-A、Ingress-B、Ingress-C 分别配置证书 A、B、C,ALBInstance 配置证书 D,假设证书 C 的到期时间最久,则 VKE 最终会为 ALB 实例关联证书 C。
为了防止由于误修改/删证书导致流量中断,VKE 集群针对以下场景做了例外处理。
除了配置 ALB Ingress 或 ALBInstance 时为 ALB 添加证书外,有时用户还习惯直接在 ALB 控制台中直接修改对应 ALB 实例监听器的关联证书。为了避免用户在 ALB 控制台中手动添加或修改的证书被 alb-ingress-controller 在调谐时,根据 ALB Ingress/ALBInstance 中的配置覆盖,alb-ingress-controller 使用证书 Hash 值做了额外防护,即在 Hash 值不变的情况下,不主动修改 ALB 证书配置。主要场景和举例,如下表所示。
当域名仍然有转发规则在用的情况下,不删除证书。例如:
- 创建 ALB Ingress 时,为 example.com 上配置了扩展证书,此时 ALB 上关联的证书为默认证书以及 example.com 对应的扩展证书。示例代码如下:
apiVersion: networking.k8s.io/v1
ingress.vke.volcengine.com/loadbalancer-port: "443"
ingress.vke.volcengine.com/loadbalancer-protocol: "https"
- secretName: https-secret-demo
- secretName: https-secret-dem-extension
- 当删除 ALB Ingress 上配置的证书,而不删除 example.com 的转发规则时,为了避免误删除证书,导致流量受损,alb-ingress-controller 会跳过删除 example.com 对应的扩展证书,只有 example.com 的转发规则删除之后,alb-ingress-controller 才会删除 example.com 的扩展证书。示例代码如下:
apiVersion: networking.k8s.io/v1
ingress.vke.volcengine.com/loadbalancer-port: "443"
ingress.vke.volcengine.com/loadbalancer-protocol: "https"
- secretName: https-secret-demo
创建 Ingress 时,使用 Secret 指定默认证书或扩展证书,示例如下:
apiVersion: networking.k8s.io/v1
ingress.vke.volcengine.com/loadbalancer-port: "443"
ingress.vke.volcengine.com/loadbalancer-protocol: "https"
- secretName: https-secret-demo
- secretName: https-secret-demo-extension
使用 ALBInstance 配置默认证书或扩展证书,示例如下:
apiVersion: loadbalancer.vke.volcengine.com/v1beta1
- subnetId: "subnet-bp12mw1f8k3jg0****"
certificateSource: "alb"
certificateID: "cert-2wx20lm7uquww7oot********"
- domain: "example.com"
certificateSource: "alb"
certificateID: "cert-2wx20lo6vuww07oot********"
您可以在 Secret 中填写证书 ID,然后在配置 Ingress 时关联 Secret。示例如下:
apiVersion: networking.k8s.io/v1
ingress.vke.volcengine.com/loadbalancer-port: "443"
ingress.vke.volcengine.com/loadbalancer-protocol: "https"
- secretName: https-secret-demo
- secretName: https-secret-demo
说明
您可以使用echo -n "${cert}" | base64命令对证书 ID、证书来源等进行 Base64 编码,请将${cert}替换为您自己的实际值。例如当${cert}取值为cert_center时,编码命令为echo -n "cert_center" | base64,编码后的值为Y2VydF9jZW50ZXI=。
您可以在 Secret 中填写证书内容,然后在配置 Ingress 时关联 Secret。示例如下:
LS0tLS1CRUdJTiBSU0EgUFJJVkFURS***
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS***
apiVersion: networking.k8s.io/v1
ingress.vke.volcengine.com/loadbalancer-port: "443"
ingress.vke.volcengine.com/loadbalancer-protocol: "https"
- secretName: https-secret-demo
- secretName: https-secret-demo
您可以在配置 ALBInstance 时指定证书的 ID。示例如下:
apiVersion: loadbalancer.vke.volcengine.com/v1beta1
- subnetId: "subnet-bp12mw1f8k3jg0****"
certificateSource: "alb"
certificateID: "cert-2wx20lm7uquww7oot********"
- domain: "example.com"
certificateSource: "alb"
certificateID: "cert-2wx20lo6vuww07oot********"
问题 1:使用控制台或 YAML 配置有什么区别?
两种方式的核心差异在于证书 ID 是否会同步写入 ALBInstance:
- 控制台配置:证书 ID 会自动同步到 ALBInstance。移除证书时,证书 ID 也会同步从 ALBInstance 中移除。
- YAML 配置:证书 ID 不会同步到 ALBInstance。移除证书时,证书 ID 也不会从 ALBInstance 中移除。
问题 2:在控制台移除了扩展证书后,扩展证书仍然绑定在 ALB 上
导致该问题有以下两种可能原因,请按实际情况对应处理:
- 可能原因:Ingress 上仍存在使用该证书的转发规则,导致 alb-ingress-controller 跳过了证书删除流程。
- 解决方法:确认证书不再使用后,前往应用型负载均衡控制台手动删除该扩展证书。
- 可能原因:ALBInstance 曾通过 YAML 编辑,仍记录有该扩展证书的 ID。
- 解决方法:确认证书不再使用后,编辑 ALBInstance,手动删除其中的扩展证书 ID。
问题 3:控制台提示“证书不符合预期”
导致该问题有以下两种可能原因,请按实际情况对应处理:
- 可能原因:直接在 ALB 控制台修改了对应监听器的证书,导致 ALB 上实际生效的证书与 Kubernetes 资源记录不一致。
- 解决方法:建议统一在 VKE 侧为 ALB Ingress 绑定证书,避免在 ALB 控制台直接修改。
- 可能原因:多个 ALB Ingress 关联同一个 ALB 实例,且不同 Ingress 上配置的证书存在冲突。此时 alb-ingress-controller 会自动选取到期时间最久的证书应用到 ALB 实例上,其余 Ingress 的证书配置未被采用,因此提示"证书不符合预期"。
- 解决方法:多个 ALB Ingress 复用同一 ALB 实例时,确保各 Ingress 上配置的证书保持一致。
建议全程使用同一种方式(控制台或 YAML)管理证书,避免两种渠道混合使用,否则可能导致证书状态不一致。
按照控制台页面的引导完成证书配置,并遵循以下原则:
- 不同 Ingress 各自管理其对应的扩展域名和扩展证书。
示例如下:
根据证书的管理方式选择对应的配置路径:
- 已有证书 ID:建议在 ALBInstance 上统一配置证书 ID。
- 通过 cert-manager 等组件自行管理证书(含 crt、key 等信息):建议在 Ingress 上配置 TLS Secret。