Поделиться через


Использование сертификатов Let's Encrypt в шлюзе приложений для кластеров AKS

Вы можете настроить экземпляр службы Azure Kubernetes (AKS), чтобы использовать Let's Encrypt и автоматически получать TLS/SSL-сертификат для вашего домена. Сертификат устанавливается в Шлюз приложений Azure, который выполняет завершение TLS/SSL для кластера AKS.

В описанной в этой статье настройке используется надстройка Kubernetes cert-manager , которая автоматизирует создание сертификатов и управление ими.

Совет

Рассмотрите Шлюз приложений для контейнеров в качестве решения для входа в Kubernetes. Для получения дополнительной информации см. Краткое руководство: развертывание шлюза приложений для контроллера ALB контейнеров.

Установите надстройку

Чтобы установить cert-manager в существующем кластере AKS, выполните следующие действия.

  1. Выполните следующий сценарий, чтобы установить диаграмму Helm диспетчера сертификатов. Этот сценарий выполняет следующие действия:

    • Создает новое cert-manager пространство имен в кластере AKS
    • Создает следующие пользовательские определения ресурсов (CRD): Certificate, Challenge, , ClusterIssuerIssuerOrder
    • Устанавливает диаграмму cert-manager (с сайта cert-manager)
    #!/bin/bash
    
    # Install the CustomResourceDefinition resources separately
    kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.16.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.17.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. Диспетчер сертификатов требует, чтобы этот ресурс представлял центр сертификации Let's Encrypt, который выдает подписанный сертификат.

    Cert-manager использует не имеющий пространства имен ресурс ClusterIssuer для выдачи сертификатов, доступных из нескольких пространств имен. Let's Encrypt использует протокол ACME, чтобы убедиться, что вы контролируете определенное доменное имя и для выдачи сертификата. Дополнительные сведения о настройке ClusterIssuer свойств можно найти в документации cert-manager.

    ClusterIssuer указывает cert-manager выдавать сертификаты с помощью промежуточной среды Let's Encrypt, используемой для тестирования. (Корневой сертификат отсутствует в браузерах или хранилищах доверия клиентов.)

    Тип проблемы по умолчанию в следующем YAML – это http01. Другие типы вызовов можно найти в документации Let's Encrypt.

    В следующем файле 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:
             #   class: azure/application-gateway
               ingressTemplate:
                 metadata:
                   annotations:
                     kubernetes.io/ingress.class: azure/application-gateway
    EOF
    
  3. Создайте ресурс Ingress для предоставления приложения guestbook с использованием развертывания Шлюза приложений с сертификатом Let's Encrypt.

    Убедитесь, что в развертывании шлюза приложений есть публичная IP-конфигурация внешнего интерфейса с DNS-именем. Используйте домен по умолчанию azure.com или подготовьте зону Azure DNS, а затем назначьте свой личный домен. Заметка certmanager.k8s.io/cluster-issuer: letsencrypt-staging сообщает диспетчеру сертификатов об обработке тегированного ресурса входящего трафика.

    В следующем 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
    

    Через несколько секунд вы можете получить доступ к службе guestbook через URL-адрес HTTPS Шлюза приложений, используя автоматически выданный сертификат Let's Encrypt для промежуточного тестирования.

    Браузер может предупредить вас о недопустимом центре сертификации. Причина заключается в том, что CN=Fake LE Intermediate X1 выдал промежуточный сертификат. Это предупреждение означает, что система работала должным образом, и вы готовы к получению сертификата на эксплуатацию.

  4. После успешной настройки промежуточного сертификата можно переключиться на рабочий сервер ACME:

    1. Замените промежуточную заметку на ресурс cert-manager.io/cluster-issuer: letsencrypt-prodвходящего трафика.
    2. Удалите существующий промежуточный ClusterIssuer ресурс, созданный ранее. Создайте новый промежуточный ресурс, заменив в предыдущем ClusterIssuer YAML сервер ACME на https://acme-v02.api.letsencrypt.org/directory.

Перед истечением срока действия сертификата Let's Encrypt, cert-manager автоматически обновляет сертификат в хранилище секретов Kubernetes. На этом этапе контроллер Шлюз приложений для входящего трафика применяет обновленный секрет, указанный в ресурсах входящего трафика, которые он использует для настройки Шлюза приложений.