你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

将 LetsEncrypt.org 的证书用在 AKS 群集的应用程序网关上

此部分配置 AKS,以便利用 LetsEncrypt.org 并自动获取域的 TLS/SSL 证书。 该证书安装在应用程序网关上,后者会针对 AKS 群集执行 SSL/TLS 终止操作。 此处介绍的设置使用 cert-manager Kubernetes 加载项,该加载项可自动创建并管理证书。

请按以下步骤在现有的 AKS 群集上安装 cert-manager

  1. Helm Chart

    请运行以下脚本来安装 cert-manager Helm Chart。 此脚本可执行以下操作:

    • 在 AKS 上创建新的 cert-manager 命名空间
    • 创建以下 CRD:证书、质询、ClusterIssuer、颁发者、顺序
    • 安装 cert-manager Chart(来自 docs.cert-manager.io
    #!/bin/bash
    
    # Install the CustomResourceDefinition resources separately
    kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.10.1/cert-manager.crds.yaml
    
    # Create the namespace for cert-manager
    kubectl create namespace cert-manager
    
    # Label the cert-manager namespace to disable resource validation
    kubectl label namespace cert-manager cert-manager.io/disable-validation=true
    
    # Add the Jetstack Helm repository
    helm repo add jetstack https://charts.jetstack.io
    
    # Update your local Helm chart repository cache
    helm repo update
    
    # Install the cert-manager Helm chart
    # Helm v3+
    helm install \
      cert-manager jetstack/cert-manager \
      --namespace cert-manager \
      --version v1.10.1 \
      # --set installCRDs=true
    
    # To automatically install and manage the CRDs as part of your Helm release,
    # you must add the --set installCRDs=true flag to your Helm installation command.
    
  2. ClusterIssuer 资源

    请创建 ClusterIssuer 资源。 这是 cert-manager 所需的,用于表示 Lets Encrypt 证书颁发机构(可从其中获取签名的证书)。

    Cert-manager 使用非命名空间 ClusterIssuer 资源颁发可从多个命名空间使用的证书。 Let’s Encrypt 使用 ACME 协议来验证你是否控制给定的域名,并使用该协议来颁发证书。 此处提供有关如何配置 ClusterIssuer 属性的更多详细信息。 ClusterIssuer 指示 cert-manager 使用 Lets Encrypt 过渡环境来颁发证书,该过渡环境用于测试(不存在于浏览器/客户端信任存储中的根证书)。

    在以下 YAML 中,默认的质询类型为 http01。 其他质询记录在 letsencrypt.org - 验证方式

    重要

    在以下 YAML 中更新 <YOUR.EMAIL@ADDRESS>

    #!/bin/bash
    kubectl apply -f - <<EOF
    apiVersion: cert-manager.io/v1
    kind: ClusterIssuer
    metadata:
      name: letsencrypt-staging
    spec:
      acme:
        # You must replace this email address with your own.
        # Let's Encrypt uses this to contact you about expiring
        # certificates, and issues related to your account.
        email: <YOUR.EMAIL@ADDRESS>
        # ACME server URL for Let’s Encrypt’s staging environment.
        # The staging environment won't issue trusted certificates but is
        # used to ensure that the verification process is working properly
        # before moving to production
        server: https://acme-staging-v02.api.letsencrypt.org/directory
        privateKeySecretRef:
          # Secret resource used to store the account's private key.
          name: example-issuer-account-key
        # Enable the HTTP-01 challenge provider
        # you prove ownership of a domain by ensuring that a particular
        # file is present at the domain
        solvers:
          - http01:
               ingress:
                  ingressclassName: azure/application-gateway
    EOF
    
  3. 部署应用

    请创建一项入口资源,以便使用应用程序网关和 Lets Encrypt 证书来公开 guestbook 应用程序。

    确保应用程序网关有一个带 DNS 名称的公共前端 IP 配置(可以使用默认的 azure.com 域,也可以先预配 Azure DNS Zone 服务,然后分配你自己的自定义域)。 注释 certmanager.k8s.io/cluster-issuer: letsencrypt-staging,它告知 cert-manager 处理标记的入口资源。

    重要

    将下面 YAML 中的 <PLACEHOLDERS.COM> 更新为你自己的域(或应用程序网关域,例如“kh-aks-ingress.westeurope.cloudapp.azure.com”)

    kubectl apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: guestbook-letsencrypt-staging
    annotations:
        kubernetes.io/ingress.class: azure/application-gateway
        cert-manager.io/cluster-issuer: letsencrypt-staging
    spec:
      tls:
      - hosts:
        - <PLACEHOLDERS.COM>
        secretName: guestbook-secret-name
      rules:
      - host: <PLACEHOLDERS.COM>
          http:
          paths:
          - backend:
              serviceName: frontend
              servicePort: 80
    EOF
    

    几秒钟后,可以使用自动颁发的暂存 Lets Encrypt 证书通过应用程序网关 HTTPS URL 访问 guestbook 服务。 浏览器可能会警告你:证书颁发机构无效。 暂存证书由 CN=Fake LE Intermediate X1 颁发。 此警告表示系统的运行符合预期,你可以获取生产证书了。

  4. 生产证书

    成功设置暂存证书以后,可以切换到生产 ACME 服务器:

    1. 将入口资源上的暂存注释替换为:certmanager.k8s.io/cluster-issuer: letsencrypt-prod
    2. 删除你在上一步中创建的现有暂存 ClusterIssuer,并通过将上面的 ClusterIssuer YAML 中的 ACME 服务器替换为 https://acme-v02.api.letsencrypt.org/directory 来创建一个新服务器
  5. 证书过期和续订

    Lets Encrypt 证书过期之前,cert-manager 会自动更新 Kubernetes 机密存储中的证书。 那时候,应用程序网关入口控制器会应用在入口资源中引用的已更新机密(用于配置应用程序网关)。