You need to enable JavaScript to run this app.
导航
使用 Secret 配置 ALB Ingress 证书
最近更新时间:2025.03.20 10:59:31首次发布时间:2024.11.14 10:25:39
我的收藏
有用
有用
无用
无用

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

说明

邀测·申请试用】:该功能目前处于邀测阶段。如需使用,请提交申请。

证书管理

ALB Ingress 支持多种证书管理方式,其主要区别如下表所示。

对比项使用 ALBInstance 配置证书使用 Secret 配置证书
(指定证书 ID)
使用 Secret 配置证书
(TLS 类型)
获取证书在证书中心购买,或通过其他途径获取。
管理证书应用型负载均衡和证书中心。证书中心。
使用证书通过证书 ID 指定。配置 TLS 类型的 Secret,并使用data字段来指定 Base64 编码的证书和私钥。配置完成后,证书会自动上传并保存在证书中心。
更换证书在应用型负载均衡或证书中心更新证书后,在 VKE 更新 ALBInstance 配置。在应用型负载均衡或证书中心更新证书后,在 VKE 更新 Secret 资源。直接更新 Secret 资源。

说明

使用 ALBInstance 配置证书的方法,请参见 ALB Ingress 配置 HTTPS 协议

使用限制

  • 仅支持使用以下密钥算法的证书:
    • 非国密证书:RSA、ECC
    • 国密证书:SM2
  • 一个火山引擎账号(包含所有相关的子账号)最多可以上传 500 本证书到证书中心。如果证书上传失败,请确认当前账号未超过该阈值。
  • 删除 ALB Ingress 时,系统不会自动删除上传至证书中心的证书,您需要手工清理。

前提条件

  • 已创建集群,详情请参见 创建集群
  • 已连接集群,详情请参见 连接集群
  • 已获取可信数字证书,包括证书文件和私钥文件,并且确定证书是有效的(未过期、未被吊销)。本文中以证书 tls.crt 和私钥 tls.key 为例。

说明

更多上传证书的要求,请参见 上传证书

操作步骤

步骤一:配置 Secret 证书

使用 Secret 配置证书(指定证书 ID)

您可以使用 Secret 指定已经保存在应用型负载均衡服务或证书中心的证书。操作步骤如下:

  1. 在集群中创建 Secret,指定证书的来源和证书 ID。示例文件secret-demo.yaml代码如下:
apiVersion: v1
kind: Secret
metadata:
  name: https-secret-demo
type: Opaque
data:
  cert_id: Y2V***== # Base64 编码后的证书 ID
  cert_source: YWxi # Base64 编码后的证书来源,包括:YWxi(表示 alb)和 Y2VydF9jZW50ZXI=(表示 cert_center,即证书中心)
  1. 执行以下命令,创建 Secret。
kubectl apply -f secret-demo.yaml

使用 Secret 配置证书(TLS 类型)

您可以配置 TLS 类型的 Secret,并使用data字段来指定 Base64 编码的证书和私钥。证书导入到系统后,会被保存在证书中心。操作步骤如下:

  1. 执行以下命令,使用 Base64 对证书和私钥进行编码。
echo -n `cat tls.key` | base64 # 将 tls.key 替换为您的私钥文件
echo -n `cat tls.crt` | base64 # 将 tls.crt 替换为您的证书文件
  1. 创建 Secret 的 YAML 文件。示例文件secret-demo.yaml代码如下:
apiVersion: v1
kind: Secret
metadata:
  name: https-secret-demo
type: kubernetes.io/tls
data:
  tls.key: |
    LS0tLS1CRUdJTiBSU0EgUFJJVkFURS*** # Base64 编码后的 tls.key
  tls.crt: |
    LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS*** # Base64 编码后的 tls.crt
  1. 执行以下命令,创建 Secret。
kubectl apply -f secret-demo.yaml

步骤二:创建 ALBInstance

  1. 登录 容器服务控制台
  2. 单击左侧导航栏中的 集群
  3. 在集群列表页面,单击目标集群。
  4. 在左侧导航栏中,选择 工作负载 > 对象浏览器。 单击 使用 Yaml 创建,创建路由规则。指定外部域名和服务的映射关系。
    • 在 类型 下拉菜单中选择 自定义
    • 在 Yaml 配置框内输入 Yaml 配置。
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 时的监听端口

说明

  • 更多 ALBInstance 配置,请参见 通过 kubectl 创建 ALB Ingress
  • 使用 Secret 管理证书时,无需再通过certificateSourcecertificateID等参数配置证书类型和证书 ID,而是由 Secret 来管理和指定对应的证书。
  1. 创建完成后,在 对象浏览器 页面,单击 albinstance,进入详情页面,查看创建的 ALBInstance 资源。

步骤三:部署应用和服务

  1. 创建应用和服务的 YAML 文件。示例文件workload-demo.yaml代码如下:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-demo # 无状态负载名称
  namespace: default # 无状态负载所在的命名空间
spec: 
  replicas: 1 # 无状态负载的副本数
  selector: 
    matchLabels: 
      app: nginx
  template: 
    metadata: 
      labels: 
        app: nginx
    spec:
      containers:
      - name: nginx # 容器名称
        image: doc-cn-beijing.cr.volces.com/vke/nginx-demo:v1.0 # 容器镜像地址和 Tag
        ports:
        - containerPort: 80 # 容器开放的端口号
---
apiVersion: v1
kind: Service
metadata:
  name: service-demo # 服务名称
spec:
  selector:
    app: nginx # 通过标签选择器将服务与后段容器组(Pod)绑定。
  ports:
  - name: rule # 端口映射规则名称
    protocol: TCP # 服务协议,支持 TCP 或 UDP
    port: 80 # 服务端口
    nodePort: 30000 # 节点端口,取值范围为 30000~32767
    targetPort: 80 # 容器端口,即工作负载对外提供服务的端口号或端口名称,例如:Nginx 开放的默认端口号为 80
  type: NodePort # 服务的类型

注意

  • 当集群的容器网络模型为 Flannel 时,仅支持关联和选择 NodePort、LoadBalancer 类型的服务。
  • 当集群的容器网络模型为 VPC-CNI 时:
    • 若 Ingress 开启了 直通 Pod 模式,则支持关联和选择 NodePort、LoadBalancer、ClusterIP 类型的服务。
    • 若 Ingress 未开启 直通 Pod 模式,则仅支持关联和选择 NodePort、LoadBalancer 类型的服务。
  1. 执行以下命令,在集群中部署应用和服务。
kubectl apply -f workload-demo.yaml

步骤四:创建 ALB Ingress

  1. 创建路由规则(Ingress)的 YAML 文件,示例alb-ingress.yaml代码如下:
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 # 默认证书
  - hosts:
    - example.com # (可选)指定需要加密的域名
    secretName: https-secret-demo # 通过 Secret 为指定域名配置扩展证书

说明

本例中使用最简单的方式创建 ALB Ingress。更多配置,请参见 通过 kubectl 创建 ALB Ingress

  1. 执行以下命令,创建 ALB Ingress。
kubectl apply -f alb-ingress.yaml

结果验证

查看证书

如果您选择使用 Secret 导入本地证书,系统会自动将证书上传至证书中心保存。配置完成后,您可以登录证书中心查看对应的证书详情。

  1. 登录 证书中心控制台 。
  2. 在左侧导航栏中选择 SSL 证书 > 证书管理
  3. 在证书列表中选择目标证书。
    alt
  4. 单击证书名称,进入证书详情。可以查看到该证书关联的域名、ALB 实例等信息。其中,证书 备注名称 的格式为集群ID_Secret命名空间_Secret名称_Secret的Hash值。您可以使用该名称,确认创建证书的集群和 Secret。

注意

请勿在证书中心修改对应证书的名称,否则可能导致 ALB Ingress 故障。

alt

查看配置

执行以下命令,查看 Ingress 配置。

kubectl get ingress

预期返回结果如下,表示 Ingress 服务创建成功,服务可以访问。

NAME                CLASS   HOSTS           ADDRESS           PORTS   AGE
alb-ingress-demmo   alb     example.com     180.xxx.xxx.xxx   80,443  74s

访问服务

使用以下命令,通过域名访问服务。

curl -H "Host: example.com" https://180.xxx.xxx.xxx --insecure

注意

  • 当您使用自签名证书时,可以使用-k--insecure参数忽略证书的验证。
  • 在生产环境中使用 TLS 证书时,建议您使用官方可信证书。使用自签名证书且忽略证书验证,可能导致您受到中间人攻击。

预期输出如下,表示可以通过域名访问到后端服务。

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>