Cert-manager ve Let's Encrypt ile Konteynerlar için Uygulama Ağ Geçidi - Ağ Geçidi API'si

Bu kılavuz, kapsayıcılar için Azure Uygulama Ağ Geçidi dağıtımınızın bir veya birden fazla önendine SSL/TLS sertifikalarını otomatik olarak vermek ve yenilemek için cert-manager'ın nasıl kullanılacağını göstermektedir. Gerekli kaynakları yapılandırmak için Ağ Geçidi API'sini kullanırız.

Bu örnek kapsamında, Let's Encrypt'den verilen sertifikaları yapılandırmak için cert-manager'ı kullandık ve Kapsayıcılar için Application Gateway'in TLS yükünü azaltmak suretiyle uçtan uca bir dağıtımı gösterdik.

Cert-manager'ın Let's Encrypt'ten aldığı sertifikayı, Kapsayıcılar için Application Gateway üzerinden TLS sağlamak amacıyla Kubernetes'in gizli dizinine depoladığını gösteren bir diyagram.

Sertifikaların Let's Encrypt tarafından verilmesi için, yetkili tarafından alan adı sahipliğini doğrulamak için bir doğrulama süreci gerekir. Bu doğrulama, cert-manager'ın sertifika verme sırasında bir uç noktayı erişime açan bir pod ve HTTPRoute kaynağı oluşturmasına izin vererek ve etki alanı adının sahipliğini kanıtlayarak gerçekleşir.

cert-manager ve Genel olarak AKS ile Şifreleyelim ile ilgili diğer ayrıntılara buradan ulaşabilirsiniz.

Prerequisites

  1. BYO dağıtım stratejisini izliyorsanız Kapsayıcılar için Application Gateway kaynaklarınızı ve ALB Denetleyicisi'ni (Eklenti veya Helm) ayarladığınızdan emin olun

  2. ALB yönetilen dağıtım stratejisini izliyorsanız, ApplicationLoadBalancer özel kaynağı aracılığıyla ALB Denetleyicinizi (Eklenti veya Helm) ve Kapsayıcılar için Application Gateway kaynaklarını sağladığınızdan emin olun.

  3. Örnek bir HTTP uygulaması dağıtın Başlık yeniden yazımını göstermek için aşağıdaki deployment.yaml dosyasını kümenize uygulayarak bir örnek web uygulaması oluşturun.

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

    Bu komut kümenizde aşağıdakileri oluşturur:

    • adlı bir ad alanı test-infra
    • backend-v1 ad alanındaki backend-v2 ve test-infra adlı iki hizmet
    • backend-v1 ve backend-v2 adlı iki dağıtım, test-infra ad alanında

Ağ geçidi kaynağı oluşturma

Sınama işlemi sırasında Let's Encrypt'ten gelen HTTP isteklerini dinleyen yeni Gateway bir kaynak oluşturun.

Ağ geçidi oluşturma:

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-prod
spec:
  gatewayClassName: azure-alb-external
  listeners:
  - name: http-listener
    protocol: HTTP
    port: 80
    allowedRoutes:
        namespaces:
          from: Same
EOF

Note

ALB Denetleyicisi Azure Resource Manager'da Kapsayıcılar için Application Gateway kaynaklarını oluşturduğunda, bir ön uç kaynağı için aşağıdaki adlandırma kuralını kullanır: fe-<eight randomly generated characters>.

Azure'da oluşturulan ön uç kaynağının adını değiştirmek istiyorsanız , kendi dağıtım stratejinizi getirin seçeneğini izleyin.

Ağ geçidi kaynağı oluşturulduktan sonra durumun geçerli olduğundan, dinleyicinin Programlandığından ve ağ geçidine bir adres atandığından emin olun.

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

Başarılı ağ geçidi oluşturma işleminin örnek çıktısı.

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

Cert-Manager'ı yükleme

Helm kullanarak cert-manager'ı yükleyin:

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

Helm yüklemesi, cert-manager adlı yeni bir ad alanında üç dağıtım ve bazı hizmetler ile podlar oluşturur. Ayrıca RBAC rolleri ve Özel Kaynak Tanımları gibi küme kapsamlı destek kaynaklarını da yükler.

ClusterIssuer'ı oluşturun

cert-manager'ın Let's Encrypt ile nasıl iletişim kuracağını tanımlamak için bir ClusterIssuer kaynağı oluşturun. Bu örnekte http sınaması kullanılır. Sınama sırasında, cert-manager etki alanının sahipliğini kanıtlamak için doğrulama uç noktası sunan bir HTTPRoute kaynak ve karşılık gelen pod oluşturur.

Tip

Let's Encrypt tarafından desteklenen diğer zorluklar letsencrypt.org - Sınama Türleri'ne göre belgelenmiştir

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

Kaynağın oluşturulduğunu doğrulama

kubectl get ClusterIssuer -A -o yaml

Durum True ve tür Ready olarak görüntülenmelidir.

  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

Sertifika oluşturma

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

Sertifikanın verilmesini doğrulamak için aşağıdaki komutu yürütür. Sertifika verildiyse, sütunun READY değeri olmalıdır True.

kubectl get certificate letsencrypt-cert -n test-infra

Sertifika verilmediyse, bir sınamanın durumunu doğrulamak için aşağıdaki komutu yürütebilirsiniz.

Note

Sertifika başarıyla verildiyse sınama artık listelenmez.

kubectl get challenges -n test-infra -o yaml

Ağ Geçidi kaynağında HTTPS'yi etkinleştirme

Verilen Let's Encrypt sertifikasıyla HTTPS isteklerini sonlandırmak için ağ geçidini değiştirerek ikinci bir dinleyici ekleyin.

Ağ geçidi oluşturma:

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

Note

ALB Denetleyicisi Azure Resource Manager'da Kapsayıcılar için Application Gateway kaynaklarını oluşturduğunda, bir ön uç kaynağı için aşağıdaki adlandırma kuralını kullanır: fe-<eight randomly generated characters>.

Azure'da oluşturulan ön uç kaynağının adını değiştirmek istiyorsanız , kendi dağıtım stratejinizi getirin seçeneğini izleyin.

Ana bilgisayar adınızı dinleyen bir HTTPRoute oluşturma

Dinleyici tarafından https-listener alınan istekleri işlemek için bir HTTPRoute oluşturun.

Important

değerini sertifikanın verilmesini beklediğiniz etki alanı adıyla değiştirdiğinizden contoso.com emin olun.

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

HTTPRoute kaynağı oluşturulduktan sonra, yolun Kabul Edildi ve Kapsayıcılar için Application Gateway kaynağının Programlandığıdan emin olun.

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

Kapsayıcılar için Application Gateway kaynağının durumunun başarıyla güncelleştirildiğinden emin olun.

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

Uygulamaya erişimi test etme

Artık sertifikanız için kullanılan ana bilgisayar adı aracılığıyla örnek uygulamamıza trafik göndermeye hazırız.

Important

"contoso.com değerini sertifikanın verilmesini beklediğiniz alan adıyla değiştirdiğinizden emin olun."

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

Aşağıdaki çıkışı görmeniz gerekir:

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

Tebrikler, ALB Denetleyicisi'ni yüklediniz, bir arka uç uygulaması dağıttınız, Let's Encrypt with cert-manager'dan bir sertifika yayımladınız ve trafiği Kapsayıcılar için Application Gateway aracılığıyla uygulamaya yönlendirdiniz.