Udostępnij za pośrednictwem


Używanie certyfikatów Let's Encrypt w usłudze Application Gateway dla klastrów usługi AKS

Możesz skonfigurować wystąpienie usługi Azure Kubernetes Service (AKS), aby używać protokołu Let's Encrypt i automatycznie uzyskać certyfikat TLS/SSL dla domeny. Certyfikat jest instalowany na platformie Azure Application Gateway, która wykonuje terminację TLS/SSL dla klastra AKS.

W konfiguracji opisanej w tym artykule jest używany dodatek cert-manager Kubernetes, który automatyzuje tworzenie certyfikatów i zarządzanie nimi.

Napiwek

Rozważ użycie Application Gateway dla kontenerów jako rozwiązania ingress dla Kubernetes. Aby uzyskać więcej informacji, zobacz Szybki start: wdrażanie usługi Application Gateway dla kontenerów kontrolera ALB.

Instalowanie dodatku

Wykonaj następujące kroki, aby zainstalować menedżera certyfikatów w istniejącym klastrze usługi AKS:

  1. Uruchom następujący skrypt, aby zainstalować wykres Helm cert-manager. Skrypt wykonuje następujące akcje:

    • Tworzy nową cert-manager przestrzeń nazw w klastrze usługi AKS
    • Tworzy następujące niestandardowe definicje zasobów (CRD): Certificate, , ChallengeClusterIssuer, , , IssuerOrder
    • Instaluje pakiet cert-manager (ze strony 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. Utwórz ClusterIssuer zasób. Menedżer certyfikatów wymaga, aby ten zasób reprezentował urząd certyfikacji Let's Encrypt, który wystawia podpisany certyfikat.

    Menedżer certyfikatów używa zasobu typu innego niż przestrzeń nazw ClusterIssuer do wydawania certyfikatów, które mogą być używane w wielu przestrzeniach nazw. Let's Encrypt używa protokołu ACME, aby sprawdzić, czy kontrolujesz określoną nazwę domeny i także wystawić certyfikat. Więcej informacji na temat konfigurowania ClusterIssuer właściwości można znaleźć w dokumentacji programu cert-manager.

    ClusterIssuer Nakazuje menedżerowi certyfikatów wystawianie certyfikatów przy użyciu środowiska przejściowego Let's Encrypt używanego do testowania. (Certyfikat główny nie jest obecny w sklepach zaufania przeglądarki ani klienta).

    Domyślnym typem wyzwania w następującym pliku YAML jest http01. Inne typy wyzwań można znaleźć w dokumentacji Let's Encrypt.

    W poniższym YAML pamiętaj o zastąpieniu <YOUR.EMAIL@ADDRESS> twoimi informacjami.

    #!/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. Utwórz zasób wejściowy, aby udostępnić aplikację guestbook przy użyciu wdrożenia Application Gateway z certyfikatem Let's Encrypt.

    Upewnij się, że wdrożenie usługi Application Gateway ma konfigurację publicznego interfejsu IP z nazwą DNS. Użyj domeny domyślnej azure.com lub aprowizuj strefę usługi Azure DNS, a następnie przypisz własną domenę niestandardową. Adnotacja certmanager.k8s.io/cluster-issuer: letsencrypt-staging informuje cert-managera o przetworzeniu oznakowanego zasobu ingress.

    W poniższym przykładzie YAML pamiętaj, aby zastąpić <PLACEHOLDERS.COM> własną domeną lub domeną Application Gateway (na przykład 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
    

    Po kilku sekundach możesz uzyskać dostęp do usługi guestbook za pośrednictwem adresu URL HTTPS Application Gateway, korzystając z automatycznie wystawionego certyfikatu Let's Encrypt dla środowiska testowego.

    Przeglądarka może wyświetlić ostrzeżenie o nieprawidłowym urzędzie certyfikacji. Przyczyną wystawienia certyfikatu przejściowego jest CN=Fake LE Intermediate X1. To ostrzeżenie oznacza, że system działał zgodnie z oczekiwaniami i jesteś gotowy na certyfikat produkcyjny.

  4. Po pomyślnym skonfigurowaniu certyfikatu przejściowego możesz przełączyć się na produkcyjny serwer ACME:

    1. Zastąp adnotację przejściową w zasobie Ingress adnotacją cert-manager.io/cluster-issuer: letsencrypt-prod.
    2. Usuń wcześniej utworzony zasób przejściowy ClusterIssuer. Utwórz nowy zasób przejściowy, zastępując serwer ACME z poprzedniego pliku ClusterIssuer YAML elementem https://acme-v02.api.letsencrypt.org/directory.

Przed wygaśnięciem certyfikatu Let's Encrypt, cert-manager automatycznie aktualizuje certyfikat w magazynie sekretów Kubernetes. W tym momencie Kontroler Ingress usługi Application Gateway stosuje zaktualizowany tajny zasób, do którego odwołuje się w zasobach Ingress, które są używane do konfigurowania usługi Application Gateway.