Bagikan melalui


Backend MTLS dengan Application Gateway untuk Kontainer - GATEWAY API

Dokumen ini membantu menyiapkan contoh aplikasi yang menggunakan sumber daya berikut dari Gateway API. Langkah-langkah disediakan untuk:

Latar belakang

Keamanan Lapisan Transportasi Bersama (MTLS) adalah proses yang bergantung pada sertifikat untuk mengenkripsi komunikasi dan mengidentifikasi klien ke layanan. Ini memungkinkan beban kerja backend untuk lebih meningkatkan postur keamanannya dengan hanya mempercayai koneksi dari perangkat yang diautentikasi.

Lihat gambar berikut:

A diagram showing the Application Gateway for Containers backend MTLS process.

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 memprovisikan Pengontrol ALB Anda dan menyediakan 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 dan menyebarkan rahasia sampel untuk menunjukkan autentikasi bersama backend (mTLS).

    kubectl apply -f https://trafficcontrollerdocs.blob.core.windows.net/examples/https-scenario/end-to-end-ssl-with-backend-mtls/deployment.yaml
    

    Perintah ini membuat yang berikut ini pada kluster Anda:

    • Namespace yang dipanggil test-infra
    • Satu layanan yang dipanggil mtls-app di test-infra namespace layanan
    • Satu penyebaran yang dipanggil mtls-app di test-infra namespace
    • Satu peta konfigurasi yang dipanggil mtls-app-nginx-cm di test-infra namespace
    • Empat rahasia yang disebut backend.com, frontend.com, gateway-client-cert, dan ca.bundle di test-infra namespace layanan

Menyebarkan sumber daya API Gateway yang diperlukan

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
spec:
  gatewayClassName: azure-alb-external
  listeners:
  - name: https-listener
    port: 443
    protocol: HTTPS
    allowedRoutes:
      namespaces:
        from: Same
    tls:
      mode: Terminate
      certificateRefs:
      - kind : Secret
        group: ""
        name: frontend.com
EOF

Catatan

Saat Pengontrol ALB membuat Application Gateway untuk sumber daya Kontainer di ARM, pengontrol tersebut akan menggunakan konvensi penamaan berikut untuk sumber daya frontend: fe-8< karakter yang dihasilkan secara acak>

Jika Anda ingin mengubah nama frontend yang dibuat di Azure, pertimbangkan untuk mengikuti strategi bawa penyebaran 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

Setelah gateway dibuat, buat sumber daya HTTPRoute.

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: https-route
  namespace: test-infra
spec:
  parentRefs:
  - name: gateway-01
  rules:
  - backendRefs:
    - name: mtls-app
      port: 443
EOF

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

kubectl get httproute https-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

Membuat BackendTLSPolicy

kubectl apply -f - <<EOF
apiVersion: alb.networking.azure.io/v1
kind: BackendTLSPolicy
metadata:
  name: mtls-app-tls-policy
  namespace: test-infra
spec:
  targetRef:
    group: ""
    kind: Service
    name: mtls-app
    namespace: test-infra
  default:
    sni: backend.com
    ports:
    - port: 443
    clientCertificateRef:
      name: gateway-client-cert
      group: ""
      kind: Secret
    verify:
      caCertificateRef:
        name: ca.bundle
        group: ""
        kind: Secret
      subjectAltName: backend.com
EOF

Setelah objek BackendTLSPolicy dibuat, periksa status pada objek untuk memastikan bahwa kebijakan valid:

kubectl get backendtlspolicy -n test-infra mtls-app-tls-policy -o yaml

Contoh output dari pembuatan objek BackendTLSPolicy yang valid:

status:
  conditions:
  - lastTransitionTime: "2023-06-29T16:54:42Z"
    message: Valid BackendTLSPolicy
    observedGeneration: 1
    reason: Accepted
    status: "True"
    type: Accepted

Menguji akses ke aplikasi

Sekarang kami siap untuk mengirim beberapa lalu lintas ke aplikasi sampel kami, melalui FQDN yang ditetapkan ke frontend. Gunakan perintah berikut untuk mendapatkan FQDN:

fqdn=$(kubectl get gateway gateway-01 -n test-infra -o jsonpath='{.status.addresses[0].value}')

Curling FQDN ini harus mengembalikan respons dari backend seperti yang dikonfigurasi pada HTTPRoute.

curl --insecure https://$fqdn/

Selamat, Anda telah menginstal Pengontrol ALB, menyebarkan aplikasi backend dan merutekan lalu lintas ke aplikasi melalui ingress di Application Gateway untuk Kontainer.