Cert-manager och Let's Encrypt med Application Gateway för containerapplikationer – Gateway API

Den här guiden visar hur du använder cert-manager för att automatiskt utfärda och förnya SSL/TLS-certifikat till en eller flera klientdelar av distributionen av Azure Application Gateway for Containers. Vi använder gateway-API:et för att konfigurera nödvändiga resurser.

I det här exemplet har cert-manager konfigurerat certifikat som utfärdats från Let's Encrypt för att demonstrera en distribution från slutpunkt till slutpunkt, där Application Gateway för containrar tillhandahåller TLS-avlastning.

Ett diagram som visar cert-manager som hämtar ett certifikat från Let's Encrypt och lagrar det i Kubernetes hemliga arkiv för TLS med Application Gateway för containrar.

För att certifikat ska utfärdas av Let's Encrypt krävs en utmaning av utfärdaren att verifiera domänägarskapet. Den här valideringen sker genom att cert-manager kan skapa en podd- och HTTPRoute-resurs som exponerar en slutpunkt under certifikatutfärdande, vilket bevisar ditt ägarskap för domännamnet.

Mer information om cert-manager och Let's Encrypt med AKS i allmänhet finns här.

Förutsättningar

  1. Om du följer BYO-distributionsstrategin, kontrollerar du att du konfigurerar Application Gateway för Container-resurser och ALB Controller

  2. Om du följer den hanterade distributionsstrategin för ALB ska du säkerställa att du provisionerar ALB-kontroller och Application Gateway för Containers via anpassade resursen ApplicationLoadBalancer.

  3. Distribuera HTTP-exempelprogrammet Använd följande deployment.yaml-fil i klustret för att skapa ett exempelwebbprogram för att demonstrera sidhuvudomskrivningen.

    kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/traffic-split-scenario/deployment.yaml
    

    Det här kommandot skapar följande i klustret:

    • ett namnområde med namnet test-infra
    • två tjänster som heter backend-v1 och backend-v2 i test-infra namnrymden
    • två distributioner kallas backend-v1 och backend-v2 i namnområdet test-infra

Skapa en gatewayresurs

Skapa en ny Gateway resurs som lyssnar efter HTTP-begäranden från Let's Encrypt under utmaningsprocessen.

Skapa en gateway:

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: gateway-01
  namespace: test-infra
  annotations:
    alb.networking.azure.io/alb-namespace: alb-test-infra
    alb.networking.azure.io/alb-name: alb-test
    cert-manager.io/issuer: letsencrypt-cert
spec:
  gatewayClassName: azure-alb-external
  listeners:
  - name: http-listener
    protocol: HTTP
    port: 80
    allowedRoutes:
        namespaces:
          from: Same
EOF

Kommentar

När ALB-styrenheten skapar Application Gateway for Containers-resurser i Azure Resource Manager använder den följande namngivningskonvention för en klientdelsresurs: fe-<eight randomly generated characters>.

Om du vill ändra namnet på den klientdelsresurs som skapats i Azure kan du överväga att följa distributionsstrategin bring-your-own.

När gatewayresursen har skapats kontrollerar du att statusen är giltig, att lyssnaren är programmerad och att en adress har tilldelats till gatewayen.

kubectl get gateway gateway-01 -n test-infra -o yaml

Exempelutdata från en lyckad skapning av gateway.

status:
  addresses:
  - type: IPAddress
    value: xxxx.yyyy.alb.azure.com
  conditions:
  - lastTransitionTime: "2023-06-19T21:04:55Z"
    message: Valid Gateway
    observedGeneration: 1
    reason: Accepted
    status: "True"
    type: Accepted
  - lastTransitionTime: "2023-06-19T21:04:55Z"
    message: Application Gateway For Containers resource has been successfully updated.
    observedGeneration: 1
    reason: Programmed
    status: "True"
    type: Programmed
  listeners:
  - attachedRoutes: 0
    conditions:
    - lastTransitionTime: "2023-06-19T21:04:55Z"
      message: ""
      observedGeneration: 1
      reason: ResolvedRefs
      status: "True"
      type: ResolvedRefs
    - lastTransitionTime: "2023-06-19T21:04:55Z"
      message: Listener is accepted
      observedGeneration: 1
      reason: Accepted
      status: "True"
      type: Accepted
    - lastTransitionTime: "2023-06-19T21:04:55Z"
      message: Application Gateway For Containers resource has been successfully updated.
      observedGeneration: 1
      reason: Programmed
      status: "True"
      type: Programmed
    name: https-listener
    supportedKinds:
    - group: gateway.networking.k8s.io
      kind: HTTPRoute

Installera Cert-Manager

Installera cert-manager med Helm:

helm install \
  cert-manager oci://quay.io/jetstack/charts/cert-manager \
  --version v1.19.1 \
  --namespace cert-manager \
  --create-namespace \
  --set config.enableGatewayAPI=true \
  --set crds.enabled=true

Helm-installationen skapar tre distributioner och vissa tjänster och poddar i ett nytt namnområde med namnet cert-manager. Den installerar även klusteromfattande stödresurser, till exempel RBAC-roller och anpassade resursdefinitioner.

Skapa en ClusterIssuer

Skapa en ClusterIssuer-resurs för att definiera hur cert-manager ska kommunicera med Let's Encrypt. I det här exemplet används en HTTP-utmaning. Under utmaningen skapar cert-manager en HTTPRoute resurs och motsvarande podd som presenterar en valideringsslutpunkt för att bevisa ägarskapet för domänen.

Tips

Andra utmaningar som stöds av Let's Encrypt dokumenteras på letsencrypt.org – Utmaningstyper

kubectl apply -f - <<EOF
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
  namespace: test-infra
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory # production endpoint
    #server: https://acme-staging-v02.api.letsencrypt.org/directory # staging endpoint
    email: your-email@example.com
    privateKeySecretRef:
      name: letsencrypt-private-key
    solvers:
      - http01:
          gatewayHTTPRoute:
            parentRefs:
              - name: gateway-01
                namespace: test-infra
                kind: Gateway
EOF

Kontrollera att resursen har skapats

kubectl get ClusterIssuer -A -o yaml

Statusen ska visa True och skriva Ready.

  status:
    acme:
      lastPrivateKeyHash: x+xxxxxxxxxxxxxxxxxxxxxxx+MY4PAEeotr9XH3V7I=
      lastRegisteredEmail: your-email@example.com
      uri: https://acme-staging-v02.api.letsencrypt.org/acme/acct/165888253
    conditions:
    - lastTransitionTime: "2024-10-04T21:22:40Z"
      message: The ACME account was registered with the ACME server
      observedGeneration: 1
      reason: ACMEAccountRegistered
      status: "True"
      type: Ready

Skapa ett certifikat

kubectl apply -f - <<EOF
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: letsencrypt-cert
  namespace: test-infra
spec:
  secretName: letsencrypt-secret # name published to secret store
  issuerRef:
    name: letsencrypt-prod # ClusterIssuer resource name
    kind: ClusterIssuer
  dnsNames:
    - contoso.com # domain name to be used
EOF

Kör följande kommando för att verifiera utfärdandet av certifikatet. Om certifikatet har utfärdats ska värdet för READY kolumnen vara True.

kubectl get certificate letsencrypt-cert -n test-infra

Om certifikatet inte har utfärdats kan du köra följande kommando för att verifiera statusen för en utmaning.

Kommentar

Om certifikatet har utfärdats, kommer utmaningen inte längre att listas.

kubectl get challenges -n test-infra -o yaml

Aktivera HTTPS på gatewayresursen

Ändra gatewayen för att lägga till en andra lyssnare för att avsluta HTTPS-begäranden med det utfärdade Let's Encrypt-certifikatet.

Skapa en gateway:

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: gateway-01
  namespace: test-infra
  annotations:
    alb.networking.azure.io/alb-namespace: alb-test-infra
    alb.networking.azure.io/alb-name: alb-test
    cert-manager.io/issuer: letsencrypt-cert
spec:
  gatewayClassName: azure-alb-external
  listeners:
  - name: http-listener
    protocol: HTTP
    port: 80
    allowedRoutes:
        namespaces:
          from: Same
  - name: https-listener
    port: 443
    protocol: HTTPS
    tls:
      certificateRefs:
      - name: letsencrypt-secret
    allowedRoutes:
      namespaces:
        from: Same
EOF

Kommentar

När ALB-styrenheten skapar Application Gateway for Containers-resurser i Azure Resource Manager använder den följande namngivningskonvention för en klientdelsresurs: fe-<eight randomly generated characters>.

Om du vill ändra namnet på den klientdelsresurs som skapats i Azure kan du överväga att följa distributionsstrategin bring-your-own.

Skapa en HTTPRoute som lyssnar efter ditt värdnamn

Skapa en HTTPRoute för att hantera begäranden som tagits emot av lyssnaren https-listener .

Viktigt!

Se till att du ersätter contoso.com med det domännamn som du förväntar dig att certifikatet ska utfärdas till.

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: https-example
  namespace: test-infra
spec:
  parentRefs:
  - name: gateway-01
  hostnames:
  - "contoso.com"
  rules:
  - backendRefs:
    - name: backend-v1
      port: 8080
EOF

När HTTPRoute-resursen har skapats kontrollerar du att vägen är Godkänd och att Application Gateway for Containers-resursen är programmerad.

kubectl get httproute cert-manager-route -n test-infra -o yaml

Kontrollera att statusen för Application Gateway for Containers-resursen har uppdaterats.

status:
  parents:
  - conditions:
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: ""
      observedGeneration: 1
      reason: ResolvedRefs
      status: "True"
      type: ResolvedRefs
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: Route is Accepted
      observedGeneration: 1
      reason: Accepted
      status: "True"
      type: Accepted
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: Application Gateway For Containers resource has been successfully updated.
      observedGeneration: 1
      reason: Programmed
      status: "True"
      type: Programmed
    controllerName: alb.networking.azure.io/alb-controller
    parentRef:
      group: gateway.networking.k8s.io
      kind: Gateway
      name: gateway-01
      namespace: test-infra

Testa åtkomsten till programmet

Nu är vi redo att skicka trafik till vårt exempelprogram via det värdnamn som används för ditt certifikat.

Viktigt!

Se till att du ersätter contoso.com med det domännamn som du förväntar dig att certifikatet ska utfärdas till.

curl https://contoso.com/ -v 2>&1 | grep issuer

Du bör se följande utdata:

* issuer: C=US; O=Let's Encrypt; CN=R10

Grattis, du har installerat ALB-styrenheten, distribuerat ett serverdelsprogram, utfärdat ett certifikat från Let's Encrypt med cert-manager och dirigerat trafik till programmet via Application Gateway för containrar.