全部产品
Search
文档中心

容器服务 Kubernetes 版 ACK:配置HTTPS证书以实现加密通信

更新时间:Dec 18, 2024

使用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证书。

  • 如果自动发现证书和Secret证书属于同一域名,那么Secret证书具有更高的优先级。

  • 如果自动发现证书和Secret证书属于不同的域名,那么ALB Ingress Controller会为每个域名分别选择相应的证书。

同时使用了自动发现证书和AlbConfig指定证书,并且它们关联的Listener相同。

如果在AlbConfig中指定了证书,则此Listener不会使用自动发现证书。

同时使用了Secret证书和AlbConfig指定证书,并且它们关联的Listener相同。

AlbConfig指定证书和Secret证书是可以完全兼容的,并且可以同时使用。

前提条件

已获取到可信的数字证书。您可以从以下几个途径获取数字证书:

  • 从阿里云数字证书中心购买证书。具体操作,请参见购买SSL证书

  • 从其他CA购买的证书。

  • (可选)参照本文中的生成自签名证书步骤生成自签名证书。

操作流程

image

步骤一:AlbConfig中创建HTTPS监听

默认AlbConfig配置一个监听端口为80、协议为HTTP的监听,您还需要创建HTTPS监听,并确保配置相关证书。如果未配置证书,HTTPS监听则不可用,Controller会存在由于缺少证书导致的失败事件。更多详情,请参见创建监听

控制台

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 自定义资源

  3. 资源对象浏览器页签的搜索框中,搜索AlbConfig,然后单击搜索结果AlbConfig

  4. AlbConfig面板中,找到名称为alb(默认),或其他AlbConfig的资源,单击其右侧操作列下的YAML编辑

  5. 查看YAML面板,新增spec.listeners.portspec.listeners.protocol字段。然后单击确定

    image

kubectl

  1. 使用以下命令,编辑albconfig配置文件。

    kubectl edit albconfig <Albconfig_Name>
  2. 根据您的需求修改配置,可以在Albconfig中设置portprotocol,以创建相应的监听。

    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  # demo.alb.ingress.top可替换为您的域名
echo subjectAltName = DNS:demo.alb.ingress.top > extfile.cnf  # demo.alb.ingress.top可替换为您的域名
openssl x509 -req -days 3650 -sha256 -in albtop.csr -signkey albtop-key.pem -out albtop-cert.pem -extfile extfile.cnf
  1. 执行以下命令,查看证书和私钥。

    cat albtop-key.pem     # 私钥。
    cat albtop-cert.pem   # 证书。
  2. 执行以下命令,使用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种资源。

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

  3. 单击使用YAML创建资源

    1. 示例模板:选择自定义

    2. 模板:输入YAML配置文件代码。该配置文件用于Deployment、Service、IngressClass和Ingress这4种资源。

      展开查看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: networking.k8s.io/v1
      kind: Ingress
      metadata:
        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
      ---
      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
    3. 配置完成后单击创建,页面将提示创建成功

    4. 检查Deployment和Service创建成功:

      1. 在左侧导航栏,选择工作负载 > 无状态。可查看到名称为https-deploy的Deployment已部署。

      2. 在左侧导航栏,选择网络 > 服务。可查看到名称为的https-svc的Service已部署。

      3. 在左侧导航栏,选择网络 > 路由可查看到名称为的https-ingress的Ingress已部署。

kubectl

除了AlbConfig外,ALB Ingress还需要Deployment、Service、IngressClass和Ingress这4种资源才能正常工作,您可以使用以下的示例快速创建这4种资源。

  1. 创建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
  2. 执行以下命令创建。

    kubectl apply -f https-quickstart.yaml

步骤四:配置证书

使用自动发现证书

控制台

在将证书上传到阿里云数字证书中心后,您可以通过在Ingress中的TLS配置证书关联的域名,使ALB Ingress自动发现并使用已上传的证书。

  1. 将自签名证书上传至阿里云数字证书中心。具体操作,请参见上传和共享SSL证书

  2. 登录容器服务管理控制台,在左侧导航栏选择集群

  3. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择网络 > 路由

  4. 路由页面,单击目标Ingress其右侧操作列下的更新,然后在编辑 Ingress对话框中,配置如下参数。

    配置项

    说明

    示例值

    TLS配置

    开启TLS配置开关,配置安全的路由服务。

    • 域名:自定义域名。

    • 保密字典:根据需要选择对应的保密字典。

      说明

      值为空时,为自动发现形式配置证书。

      如果您需要创建Secret,请执行如下操作。

      1. 保密字典右侧,单击创建

      2. 创建 Secret对话框,自定义保密字典的名称CertKey,然后单击确定

      3. 保密字典的下拉框,选择已创建的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自动发现并使用已上传的证书。

  1. 将自签名证书上传至阿里云数字证书中心。具体操作,请参见上传和共享SSL证书

  2. 执行以下命令编辑Ingress。

    kubectl edit ingress https-ingress
  3. 添加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证书

控制台

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择网络 > 路由

  3. 路由页面,单击目标Ingress其右侧操作列下的更新,然后在编辑 Ingress对话框中,配置如下参数。

    配置项

    说明

    示例值

    TLS配置

    开启TLS配置开关,配置安全的路由服务。

    • 域名:自定义域名。

    • 保密字典:根据需要选择对应的保密字典。

      说明

      值为空时,为自动发现形式配置证书。

      如果您需要创建Secret,请执行如下操作。

      1. 保密字典右侧,单击创建

      2. 创建 Secret对话框,自定义保密字典的名称CertKey,然后单击确定

      3. 保密字典的下拉框,选择已创建的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中使用。

  1. 创建Secret

    1. 使用以下内容创建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}     
    2. 执行以下命令,创建Secret。

      kubectl apply -f https-secret.yaml
  2. 编辑Ingress。

    1. 执行以下命令编辑Ingress。

      kubectl edit ingress https-ingress
    2. 添加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指定证书

控制台

  1. 获取自签证书的CertIdentifier。

    在将证书上传到阿里云数字证书中心后,您可以在AlbConfig中的监听的CertificateId字段填入证书的ID,以便为监听关联已上传的证书。

    说明

    如果监听配置了证书,那么此监听下的Ingress将不再使用自动发现证书。

    1. 上传自签名证书至阿里云数字证书中心。具体操作,请参见上传和共享SSL证书

    2. 获取证书ID。

      1. 登录数字证书管理服务控制台

      2. 在左侧导航栏,选择证书管理 > SSL证书管理

      3. SSL证书页面,单击上传证书页签,在目标证书操作列下单击更多

        证书详情面板中获取CertIdentifier

  2. 关联证书至AlbConfig。

    1. 登录容器服务管理控制台,在左侧导航栏选择集群

    2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 自定义资源

    3. 资源对象浏览器页签的搜索框中,搜索AlbConfig,然后单击搜索结果AlbConfig

    4. AlbConfig面板中,找到名称为alb(默认),或其他AlbConfig的资源,单击其右侧操作列下的YAML编辑

    5. 查看YAML面板,新增如下字段。然后单击确定

      字段

      描述

      示例值

      certificates

      证书信息。

      -

      CertificateId

      步骤1获取证书的CertIdentifier。

      756****-cn-hangzhou

      IsDefault

      是否为默认证书。

      true

      image

  3. 编辑Ingress。

    1. 登录容器服务管理控制台,在左侧导航栏选择集群

    2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择网络 > 路由

    3. 路由页面,单击目标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将不再使用自动发现证书。

  1. 上传自签名证书至阿里云数字证书中心。具体操作,请参见上传和共享SSL证书

  2. 获取证书ID。

    1. 登录数字证书管理服务控制台

    2. 在左侧导航栏,选择证书管理 > SSL证书管理

    3. SSL证书页面,单击上传证书页签,在目标证书操作列下单击更多

      证书详情面板中获取CertIdentifier

关联证书至AlbConfig。

  1. 执行以下命令编辑AlbConfig。

    kubectl edit albconfig <ALBCONFIG_NAME> # <ALBCONFIG_NAME>替换AlbConfig的名称
  2. 在监听中添加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
  3. 执行以下命令编辑Ingress。

    kubectl edit ingress https-ingress
  4. 新增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协议访问服务,可以验证配置证书的效果。

  1. 执行以下命令,查看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

    记录下HOSTSADDRESS部分的值,以便后续步骤使用。

  2. 执行以下命令,使用HTTPS协议连接ALB Ingress访问后端服务。其中的demo.alb.ingress.topalb-********.alb.aliyuncs.com请替换为在上一步中得到的值。

    curl -H HOST:demo.alb.ingress.top -k https://alb-********.alb.aliyuncs.com

    预期输出如下,则表明证书配置成功:

    old

相关文档