Bagikan melalui


Cert-manager dan Let's Encrypt dengan Application Gateway for Containers - Gateway API

Panduan ini menunjukkan cara menggunakan cert-manager untuk secara otomatis menerbitkan dan memperbarui sertifikat SSL/TLS ke satu atau beberapa frontend penyebaran Azure Application Gateway for Containers Anda. Kami menggunakan API Gateway untuk mengonfigurasi sumber daya yang diperlukan.

Untuk tujuan contoh ini, kami mengonfigurasi cert-manager untuk sertifikat yang diperoleh dari Let's Encrypt guna mendemonstrasikan penyebaran end-to-end, di mana Application Gateway untuk Kontainer menyediakan offloading TLS.

Diagram ini memperlihatkan cert-manager mengambil sertifikat dari Let's Encrypt dan menyimpannya ke toko rahasia Kubernetes untuk TLS pada Application Gateway untuk Kontainer.

Agar sertifikat dikeluarkan oleh Let's Encrypt, otoritas memerlukan tantangan untuk memverifikasi kepemilikan domain. Validasi ini terjadi dengan memungkinkan cert-manager membuat pod dan sumber daya HTTPRoute yang mengekspos titik akhir selama penerbitan sertifikat, membuktikan kepemilikan Anda atas nama domain.

Detail selengkapnya tentang cert-manager dan Let's Encrypt dengan AKS secara umum dapat ditemukan di sini.

Prasyarat

  1. Jika mengikuti strategi penyebaran BYO, pastikan Anda menyiapkan Application Gateway untuk sumber daya Kontainer dan Pengontrol ALB

  2. Jika mengikuti strategi penyebaran terkelola ALB, pastikan Anda menyediakan Pengontrol ALB dan Application Gateway untuk sumber daya Kontainer melalui sumber daya kustom ApplicationLoadBalancer.

  3. Sebarkan contoh aplikasi HTTP Terapkan file deployment.yaml berikut pada kluster Anda untuk membuat aplikasi web sampel untuk menunjukkan penulisan ulang header.

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

    Perintah ini membuat yang berikut ini pada kluster Anda:

    • namespace yang dipanggil test-infra
    • dua layanan bernama backend-v1 dan backend-v2 di namespace test-infra
    • dua deployment yang dipanggil backend-v1 dan backend-v2 di ruang nama test-infra

Membuat sumber daya Gateway

Buat sumber daya baru Gateway yang mendengarkan permintaan HTTP dari Let's Encrypt selama proses tantangan.

Membuat 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

Catatan

Saat Pengontrol ALB membuat Application Gateway untuk sumber daya kontainer di Azure Resource Manager, pengontrol menggunakan konvensi penamaan berikut untuk sumber daya frontend: fe-<eight randomly generated characters>.

Jika Anda ingin mengubah nama sumber daya frontend yang dibuat di Azure, pertimbangkan untuk mengikuti strategi penyebaran bawaan Anda sendiri.

Setelah sumber daya gateway dibuat, pastikan statusnya valid, pendengar diprogram, dan alamat ditetapkan ke gateway.

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

Contoh output pembuatan gateway yang berhasil.

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

Menginstal Cert-Manager

Instal cert-manager menggunakan 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

Penginstalan helm membuat tiga penerapan serta beberapa layanan dan pod di namespace baru bernama cert-manager. Ini juga menginstal sumber daya pendukung cakupan kluster, seperti peran RBAC dan Definisi Sumber Daya Kustom.

Membuat sebuah ClusterIssuer

Buat sumber daya ClusterIssuer untuk menentukan bagaimana cert-manager akan berkomunikasi dengan Let's Encrypt. Untuk contoh ini, tantangan HTTP digunakan. Selama proses tantangan, cert-manager membuat sumber daya HTTPRoute dan pod yang sesuai yang menyajikan endpoint validasi untuk memverifikasi kepemilikan domain.

Tip

Tantangan lain yang didukung oleh Let's Encrypt didokumenkan pada letsencrypt.org - Jenis Tantangan

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

Verifikasi bahwa sumber daya telah dibuat

kubectl get ClusterIssuer -A -o yaml

Status harus menampilkan True dan mengetik 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

Membuat sertifikat

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

Jalankan perintah berikut untuk memvalidasi penerbitan sertifikat. Jika sertifikat telah diterbitkan, nilai READY kolom harus True.

kubectl get certificate letsencrypt-cert -n test-infra

Jika sertifikat tidak diterbitkan, Anda dapat menjalankan perintah berikut untuk memvalidasi status tantangan.

Catatan

Jika sertifikat telah berhasil diterbitkan, tantangan tidak akan lagi tercantum.

kubectl get challenges -n test-infra -o yaml

Mengaktifkan HTTPS pada sumber daya Gateway

Ubah gateway untuk menambahkan pendengar kedua untuk mengakhiri permintaan HTTPS dengan sertifikat Let's Encrypt yang dikeluarkan.

Membuat 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

Catatan

Saat Pengontrol ALB membuat Application Gateway untuk sumber daya kontainer di Azure Resource Manager, pengontrol menggunakan konvensi penamaan berikut untuk sumber daya frontend: fe-<eight randomly generated characters>.

Jika Anda ingin mengubah nama sumber daya frontend yang dibuat di Azure, pertimbangkan untuk mengikuti strategi penyebaran bawaan Anda sendiri.

Membuat HTTPRoute yang mendengarkan nama host Anda

Buat HTTPRoute untuk menangani permintaan yang diterima oleh pendengar https-listener .

Penting

Pastikan Anda mengganti contoso.com dengan nama domain yang Anda harapkan sertifikatnya dikeluarkan.

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

Setelah sumber daya HTTPRoute dibuat, pastikan rute Diterima dan sumber daya Application Gateway for Containers diprogram.

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

Verifikasi status sumber daya Application Gateway for Containers berhasil diperbarui.

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

Menguji akses ke aplikasi

Sekarang kami siap untuk mengirim beberapa lalu lintas ke aplikasi sampel kami, melalui nama host yang digunakan untuk sertifikat Anda.

Penting

Pastikan Anda mengganti contoso.com dengan nama domain yang Anda harapkan sertifikatnya dikeluarkan.

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

Anda akan melihat output berikut:

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

Selamat, Anda telah menginstal Kontroler ALB, menyebarkan aplikasi backend, mengeluarkan sertifikat dari Let's Encrypt dengan cert-manager, dan merutekan lalu lintas ke aplikasi melalui Application Gateway untuk Container.