You need to enable JavaScript to run this app.
导航
ALB Ingress 配置 HTTPS 协议
最近更新时间:2025.06.12 14:36:03首次发布时间:2024.06.12 10:18:19
我的收藏
有用
有用
无用
无用

为保证公网环境下的通信安全,业务使用 Ingress 暴露到公网时,通常使用 HTTPS 协议通信。本文为您介绍如何配置 HTTPS 协议的 ALB Ingress。

证书配置概述

证书分类

从 HTTPS 证书生效的范围区分,ALB 支持两种证书:默认证书和扩展证书。客户端使用 HTTPS 协议与 ALB 建立连接时,ALB 会将适当的证书发送给客户端。

证书类型配置方式

默认证书

  • 创建 HTTPS 监听器时必填,一个监听器上只允许配置一个默认证书。
  • 在 Ingress/albinstance 上不填写域名。
  • 支持更新。
  • 不支持删除。

扩展证书

  • 创建 HTTPS 监听器时选填,一个监听器上可以配置多个扩展证书。
  • 在 Ingress/albinstance 上填写域名。
  • 支持更新。
  • 支持删除。

ALB 会根据域名、转发规则和证书的对应关系选择发送给客户端的证书,详细流程,请参见 证书匹配

从证书来源看区分,ALB 支持配置两种证书:上传至 ALB 控制台的证书(下称 ALB 证书)和来自火山引擎证书中心的证书(详情请参见 ALB 使用证书中心的证书)。推荐优先选择证书中心的证书。

证书配置方式

在 VKE 集群中,ALB ingress 主要包含如下两个 Kubernetes 资源:

  • albinstance:自定义资源,用于配置 ALB 实例和监听器,
  • Ingress:标准 Kubernetes 资源对象,用于在 ALB 实例上配置转发规则和后端服务器。

说明

Ingress 和 albinstance 的详细介绍,请参考 路由规则概述

albinstance 和 Ingress 资源均可独立配置证书。通过 Ingress 配置证书时,在 Ingress.spec中指定包含证书信息(上传到火山引擎的证书 ID 或证书的密钥信息)的 secret;通过 albinstance 配置证书时,在albinstance.spec中指定上传到火山引擎的证书 ID。

ALB Ingress 支持三种配置证书的方式:Secret 指定证书 ID、TLS 类型的 Secret 指定证书内容、albinstance 指定证书。不同方式的区别和对比,如下表所示。

配置方式证书来源适用场景更新证书方式

Secret 指定证书 ID

  • ALB 证书
  • 证书中心证书

已在 ALB 控制台或火山引擎证书中心购买或上传证书。

更新 Secret 中的证书 ID。

TLS 类型的 Secret用户侧将证书密钥信息填写到 Secret 中,VKE 控制组件将密钥信息上传到火山引擎证书中心。在集群内部使用诸如 cert-manager 类的工具自动更新 Secret 中的证书信息。更新 secret 中的证书信息。

Albinstance 指定证书

  • ALB 证书
  • 证书中心证书

已在 ALB 控制台或火山引擎证书中心购买或上传证书。

更新 albinstance 上的证书 ID。

注意

如需使用证书中心的证书,请首先登录您的火山引擎账号,然后单击 服务授权,并在弹出的页面中单击 立即授权,完成跨服务授权。

配置示例

默认证书 vs 扩展证书

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: alb-ingress-demo # 路由规则的名称
  namespace: default  # 路由规则所属的命名空间
  annotations:
    ingress.vke.volcengine.com/loadbalancer-port: "443" # 监听器端口号
    ingress.vke.volcengine.com/loadbalancer-protocol: "https"  # 监听器协议。本例中取值为 https
spec:
  ingressClassName: alb  # ALB Instance 的资源名称
  rules:
  - host: example.com  # 需要对外提供访问的域名
    http:
      paths:
      - pathType: Prefix # 路径匹配规则,默认为 Prefix(前缀匹配)
        path: / # 请求匹配的路径
        backend:
          service:
            name: service-demo # 需要对接的服务名称
            port: 
              number: 80 # 需要对接服务的端口号
  tls:
  - secretName: https-secret-demo # 默认证书,不指定域名
  - secretName: https-secret-dem-extension
    hosts:
    - example.com # (可选)扩展证书,指定需要加密的域名
apiVersion: loadbalancer.vke.volcengine.com/v1beta1
kind: ALBInstance
metadata:
  name: alb # ALBInstance 资源名称
spec:
  instance:
    name: "demo-alb" # ALB 实例名称
    zoneMappings: # ALB 实例位于多可用区的子网列表
    - subnetId: "subnet-bp12mw1f8k3jg0****" # 子网 ID,用于 ALB 实例在此可用区下的私网 IP 地址分配
    addressType: "public" # 负载均衡类型。取值:public(公网类型)、 private(私网类型)
    eipSpec:
      isp: "BGP" # 公网负载均衡实例的 EIP 线路类型。取值:BGP
      bandwidth: 10 # 带宽上限。当 billingType 为 2 时,取值范围为 1~500Mbps;当 billingType 为 3 时,取值范围为 1~200Mbps
      billingType: 2 # 计费类型。取值:2(按量计费-按带宽上限)、3(按量计费-按实际流量)
    ipVersion: "ipv4" # IP 版本。取值:ipv4
    deleteProtection: "on" # ALB 实例的删除保护功能,on 表示开启,off 表示关闭
  listeners:
  - protocol: "HTTPS" # 监听器的协议
    port: 443 # 监听器协议为 HTTPS 时的监听端口
    certificateSource: "cert_center" # 配置证书来源,取值:alb(ALB)、cert_center(证书中心)
    certificateID: "cert-2wx20lm7uquww7oot********" # 默认证书,监听器协议为 HTTPS 时默认全域名使用的服务器证书
    domainExtensions:  # 扩展证书,为具体域名单独配置证书
    - domain: "example.com" # 监听器协议为 HTTPS 时支持指定域名绑定服务器证书
      certificateSource: "cert_center" # 配置证书来源,取值:alb(ALB)、cert_center(证书中心)
      certificateID: "cert-2wx20lo6vuww07oot********" # 监听器协议为 HTTPS 时支持指定域名绑定服务器证书

Secret 指定证书 ID

在 Secret 中填写证书 ID、在 Ingress 中关联 Secret。

apiVersion: v1
kind: Secret
metadata:
  name: https-secret-demo
type: Opaque
data:
  cert_id: Y2V***== # secret 中指定 Base64 编码后的证书 ID
  cert_source: YWxi # Base64 编码后的证书来源,包括:YWxi(表示 alb)和 Y2VydF9jZW50ZXI=(表示 cert_center,即证书中心)
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: alb-ingress-demo # 路由规则的名称
  namespace: default  # 路由规则所属的命名空间
  annotations:
    ingress.vke.volcengine.com/loadbalancer-port: "443" # 监听器端口号
    ingress.vke.volcengine.com/loadbalancer-protocol: "https"  # 监听器协议。本例中取值为 https
spec:
  ingressClassName: alb  # ALB Instance 的资源名称
  rules:
  - host: example.com  # 需要对外提供访问的域名
    http:
      paths:
      - pathType: Prefix # 路径匹配规则,默认为 Prefix(前缀匹配)
        path: / # 请求匹配的路径
        backend:
          service:
            name: service-demo # 需要对接的服务名称
            port: 
              number: 80 # 需要对接服务的端口号
  tls:
  - secretName: https-secret-demo # Ingress 中关联 secret
  - hosts:
    - example.com # (可选)指定需要加密的域名
    secretName: https-secret-demo # 通过 Secret 为指定域名配置扩展证书

TLS 类型 Secret

apiVersion: v1
kind: Secret
metadata:
  name: https-secret-demo
type: kubernetes.io/tls
data:
  # secret 中指定证书 key、crt 等信息
  tls.key: |
        LS0tLS1CRUdJTiBSU0EgUFJJVkFURS*** # Base64 编码后的 tls.key
  tls.crt: |
        LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS*** # Base64 编码后的 tls.crt
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: alb-ingress-demo # 路由规则的名称
  namespace: default  # 路由规则所属的命名空间
  annotations:
    ingress.vke.volcengine.com/loadbalancer-port: "443" # 监听器端口号
    ingress.vke.volcengine.com/loadbalancer-protocol: "https"  # 监听器协议。本例中取值为 https
spec:
  ingressClassName: alb  # ALB Instance 的资源名称
  rules:
  - host: example.com  # 需要对外提供访问的域名
    http:
      paths:
      - pathType: Prefix # 路径匹配规则,默认为 Prefix(前缀匹配)
        path: / # 请求匹配的路径
        backend:
          service:
            name: service-demo # 需要对接的服务名称
            port: 
              number: 80 # 需要对接服务的端口号
  tls:
  - secretName: https-secret-demo # Ingress 中关联 secret
  - hosts:
    - example.com # (可选)指定需要加密的域名
    secretName: https-secret-demo # 通过 Secret 为指定域名配置扩展证书

在 albinstance 上指定证书 ID

apiVersion: loadbalancer.vke.volcengine.com/v1beta1
kind: ALBInstance
metadata:
  name: alb # ALBInstance 资源名称
spec:
  instance:
    name: "demo-alb" # ALB 实例名称
    zoneMappings: # ALB 实例位于多可用区的子网列表
    - subnetId: "subnet-bp12mw1f8k3jg0****" # 子网 ID,用于 ALB 实例在此可用区下的私网 IP 地址分配
    addressType: "public" # 负载均衡类型。取值:public(公网类型)、 private(私网类型)
    eipSpec:
      isp: "BGP" # 公网负载均衡实例的 EIP 线路类型。取值:BGP
      bandwidth: 10 # 带宽上限。当 billingType 为 2 时,取值范围为 1~500Mbps;当 billingType 为 3 时,取值范围为 1~200Mbps
      billingType: 2 # 计费类型。取值:2(按量计费-按带宽上限)、3(按量计费-按实际流量)
    ipVersion: "ipv4" # IP 版本。取值:ipv4
    deleteProtection: "on" # ALB 实例的删除保护功能,on 表示开启,off 表示关闭
  listeners:
  - protocol: "HTTPS" # 监听器的协议
    port: 443 # 监听器协议为 HTTPS 时的监听端口
    certificateSource: "cert_center" # 配置证书来源,取值:alb(ALB)、cert_center(证书中心)
    certificateID: "cert-2wx20lm7uquww7oot********" # 默认证书,监听器协议为 HTTPS 时默认全域名使用的服务器证书
    domainExtensions:  # 扩展证书,为具体域名单独配置证书
    - domain: "example.com" # 监听器协议为 HTTPS 时支持指定域名绑定服务器证书
      certificateSource: "cert_center" # 配置证书来源,取值:alb(ALB)、cert_center(证书中心)
      certificateID: "cert-2wx20lo6vuww07oot********" # 监听器协议为 HTTPS 时支持指定域名绑定服务器证书

证书生效逻辑

ALB 实例的证书是监听器级别的配置,Ingress 和 albinstance 都可以为监听器指定证书,对于同一个监听器而言,可以有一个 albinstance + 多个 Ingress 与之关联,这些关联的资源上配置的证书可能存在差异。多个资源上配置的证书之间存在冲突时,VKE 侧选取到期时间最久的证书关联到 alb 实例上。例如:
alb 实例的 80 监听器,Ingress-A、Ingress-B、Ingress-C 分别设置证书 A、B、C,albinstance 设置证书 D,假设证书 C 的到期时间最久,则 VKE 最终会为 alb 实例关联证书 C。
alt

例外情况

为了防止误删证书导致流量中断,VKE 集群在以下两种情况下做了特殊处理:

  1. 记录 k8s 资源上证书配置的 hash 值,在 hash 值不变的情况下,不主动修改证书。

除了配置 alb-ingress/albinstance 时,使用 alb-ingress-controller 为 alb 添加证书外,您还可以直接在应用型负载均衡控制台直接修改 alb 监听器关联的证书。为了避免用户手动添加/删除的证书被 alb-ingress-controller 在调谐 alb-ingress/albinstance 时,根据 alb-ingress/albinstance 上记录的证书配置覆盖,alb-ingress-controller 利用证书 hash 值做了额外防护,在 hash 值不变的情况下,不主动修改 alb 证书配置。主要场景和举例,如下表所示。

场景举例

hash 值不变时,alb-ingress-controller 不主动修改证书。

  • 在 alb-ingress 上配置证书 a,alb-ingress-controller 为 alb 关联证书 a,并记录证书 hash 值 hash-a。
  • 用户在应用型负载均衡控制台将证书修改为 b。
  • alb-ingress 触发调谐时,alb-ingress-controller 在调谐过程中发现记录的证书 hash 值仍然为 hash-a,则跳过修改证书步骤,因此 alb 仍然关联证书 b。

hash 值改变时,alb-ingress-controller 修改证书。

  • 在 alb-ingress 上配置证书 a,alb-ingress-controller 为 alb 关联证书 a,并记录证书 hash 值 hash-a。
  • 用户在应用型负载均衡控制台将证书修改至 b。
  • 在 alb-ingress 上配置证书 c,alb-ingress-controller 在调谐过程中发现 alb-ingress 当前计算出的证书 hash 值为 hash-c,与之前记录的 hash-a 不一致,则进入修改 alb 证书逻辑,alb 关联证书 c。
  1. 域名仍然有转发规则在用的情况下,不删除证书。例如:
  • 创建 alb-ingress 时,为 example.com 上配置了扩展证书,此时 alb 上关联的证书为:默认证书以及 example.com 对应的扩展证书。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: alb-ingress-demo # 路由规则的名称
      namespace: default  # 路由规则所属的命名空间
      annotations:
        ingress.vke.volcengine.com/loadbalancer-port: "443" # 监听器端口号
        ingress.vke.volcengine.com/loadbalancer-protocol: "https"  # 监听器协议。本例中取值为 https
    spec:
      ingressClassName: alb  # ALB Instance 的资源名称
      rules:
      - host: example.com  # 需要对外提供访问的域名
        http:
          paths:
          - pathType: Prefix # 路径匹配规则,默认为 Prefix(前缀匹配)
            path: / # 请求匹配的路径
            backend:
              service:
                name: service-demo # 需要对接的服务名称
                port: 
                  number: 80 # 需要对接服务的端口号
      - host: another.com
        http:
          paths:
          - pathType: Prefix
            path: /
            backend:
              service:
                name: service-demo
                port:
                  number: 80                   
      tls:
      - secretName: https-secret-demo # 默认证书,不指定域名
      - secretName: https-secret-dem-extension
        hosts:
        - example.com # (可选)扩展证书,指定需要加密的域名
    
  • 当删除 alb-ingress 上配置的证书,而不删除 example.com 的转发规则时,为了避免误删除 alb-ingress/albinstance 上配置的扩展证书,导致流量受损,alb-ingress-controller 会跳过删除 example.com 对应的扩展证书,只有 example.com 的转发规则删除之后,alb-ingress-controller 才会删除 example.com 的扩展证书。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: alb-ingress-demo # 路由规则的名称
      namespace: default  # 路由规则所属的命名空间
      annotations:
        ingress.vke.volcengine.com/loadbalancer-port: "443" # 监听器端口号
        ingress.vke.volcengine.com/loadbalancer-protocol: "https"  # 监听器协议。本例中取值为 https
    spec:
      ingressClassName: alb  # ALB Instance 的资源名称
      rules:
      - host: example.com  # 需要对外提供访问的域名
        http:
          paths:
          - pathType: Prefix # 路径匹配规则,默认为 Prefix(前缀匹配)
            path: / # 请求匹配的路径
            backend:
              service:
                name: service-demo # 需要对接的服务名称
                port: 
                  number: 80 # 需要对接服务的端口号
      - host: another.com
        http:
          paths:
          - pathType: Prefix
            path: /
            backend:
              service:
                name: service-demo
                port:
                  number: 80                   
      tls:
      - secretName: https-secret-demo # 默认证书,不指定域名
    

VKE 控制台和 Yaml 用法的区别

Yaml 是指直接编辑 alb-ingress/albinstance/secret 等 Yaml 资源;VKE 控制台是指从 VKE 前端操作。主要区别如下:

  • 通过 VKE 控制台,为 example.com 配置证书,证书 id 会同步到 albinstance 上;移除 example.com 的证书,证书 id 会同步从 albinstance 上移除
    alt
  • 通过 Yaml 编辑 alb-ingress,为 example.com 配置证书,证书 id 不会同步到 albinstance 上;移除 example.com 的证书,证书 id 不会从 albinstance 上移除。

FAQ

为什么在 VKE 控制台移除了扩展证书后,扩展证书仍然绑定在 alb 上

可能有两个原因:

  1. ingress 上还有在用扩展证书的转发规则,alb-ingress-controller 跳过移除证书。
    1. 解决方法:如果确认证书不再需要了,手动在应用型负载均衡控制台删除扩展证书
  2. 通过 yaml 编辑过 albinstance,albinstance 上仍记录有扩展证书的 id
    1. 解决方法:如果确认证书不再需要了,编辑 albinstance,删除扩展证书

为什么 VKE 控制台提示证书不符合预期

有两种可能:

  1. 用户自行在应用型负载均衡控制台修改过证书,alb 上实际生效的证书和 k8s 资源不一致
    1. 解决方法:建议用户在 VKE 侧配置,为 alb-ingress 绑定预期要使用的证书
  2. 如前所述,多个 alb-ingress 可以关联同一个 alb 实例,如果不同 alb-ingress 上配置的证书有冲突,alb-ingress-controller 会选取到期时间最久的证书配置到 alb 实例上,证书配置未被选中的 alb-ingress 上就会提示证书不符合预期
    1. 解决方法:建议用户在多个 alb-ingress 上复用同一个 alb 时,不同 alb-ingress 上配置的证书保持一致。

最佳实践

  • 避免混合使用【通过 VKE 控制台配置证书】与【通过 yaml 配置证书】。
  • 通过 VKE 控制台配置证书时,跟随前端引导。
    • 默认证书在多个 ingress 之间保持一致。
    • 不同 ingress 管理不同扩展域名+扩展证书。
    • ingress-A
      • 默认a
      • www.a.com->证书b
    • ingress-B
      • 默认证书a
      • www.b.com->证书c
  • 通过 yaml 配置证书时
    • 如果已有证书 ID,建议在 albinstance 上统一配置证书 ID。
    • 如果通过 cert-manager 等组件自行管理证书 crt、key 等信息,建议在 Ingress 上配置 TLS secret。