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:
- Buat sumber daya Gateway dengan satu pendengar HTTPS.
- Buat sumber daya HTTPRoute yang mereferensikan layanan backend.
- Buat sumber daya BackendTLSPolicy yang memiliki sertifikat klien dan CA untuk layanan backend yang dirujuk di HTTPRoute.
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:
Prasyarat
Jika mengikuti strategi penyebaran BYO, pastikan Anda menyiapkan Application Gateway untuk sumber daya Kontainer dan Pengontrol ALB.
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.
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
ditest-infra
namespace layanan - Satu penyebaran yang dipanggil
mtls-app
ditest-infra
namespace - Satu peta konfigurasi yang dipanggil
mtls-app-nginx-cm
ditest-infra
namespace - Empat rahasia yang disebut
backend.com
,frontend.com
,gateway-client-cert
, danca.bundle
ditest-infra
namespace layanan
- Namespace yang dipanggil
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.