为保证公网环境下的通信安全,业务使用 Ingress 暴露到公网时,通常使用 HTTPS 协议通信。本文为您介绍如何配置 HTTPS 协议的 ALB Ingress。
从 HTTPS 证书生效的范围区分,ALB 支持两种证书:默认证书和扩展证书。客户端使用 HTTPS 协议与 ALB 建立连接时,ALB 会将适当的证书发送给客户端。
证书类型 | 配置方式 |
---|---|
默认证书 |
|
扩展证书 |
|
ALB 会根据域名、转发规则和证书的对应关系选择发送给客户端的证书,详细流程,请参见 证书匹配。
从证书来源看区分,ALB 支持配置两种证书:上传至 ALB 控制台的证书(下称 ALB 证书)和来自火山引擎证书中心的证书(详情请参见 ALB 使用证书中心的证书)。推荐优先选择证书中心的证书。
在 VKE 集群中,ALB ingress 主要包含如下两个 Kubernetes 资源:
说明
Ingress 和 albinstance 的详细介绍,请参考 路由规则概述。
albinstance 和 Ingress 资源均可独立配置证书。通过 Ingress 配置证书时,在 Ingress.spec
中指定包含证书信息(上传到火山引擎的证书 ID 或证书的密钥信息)的 secret;通过 albinstance 配置证书时,在albinstance.spec
中指定上传到火山引擎的证书 ID。
ALB Ingress 支持三种配置证书的方式:Secret 指定证书 ID、TLS 类型的 Secret 指定证书内容、albinstance 指定证书。不同方式的区别和对比,如下表所示。
配置方式 | 证书来源 | 适用场景 | 更新证书方式 |
---|---|---|---|
Secret 指定证书 ID |
| 已在 ALB 控制台或火山引擎证书中心购买或上传证书。 | 更新 Secret 中的证书 ID。 |
TLS 类型的 Secret | 用户侧将证书密钥信息填写到 Secret 中,VKE 控制组件将密钥信息上传到火山引擎证书中心。 | 在集群内部使用诸如 cert-manager 类的工具自动更新 Secret 中的证书信息。 | 更新 secret 中的证书信息。 |
Albinstance 指定证书 |
| 已在 ALB 控制台或火山引擎证书中心购买或上传证书。 | 更新 albinstance 上的证书 ID。 |
注意
如需使用证书中心的证书,请首先登录您的火山引擎账号,然后单击 服务授权,并在弹出的页面中单击 立即授权,完成跨服务授权。
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、在 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 为指定域名配置扩展证书
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 为指定域名配置扩展证书
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。
为了防止误删证书导致流量中断,VKE 集群在以下两种情况下做了特殊处理:
除了配置 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 不主动修改证书。 |
|
hash 值改变时,alb-ingress-controller 修改证书。 |
|
创建 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 # 默认证书,不指定域名
Yaml 是指直接编辑 alb-ingress/albinstance/secret 等 Yaml 资源;VKE 控制台是指从 VKE 前端操作。主要区别如下:
可能有两个原因:
有两种可能: