Menggunakan TLS dengan pengontrol ingress pada Azure Kubernetes Service (AKS)
Protokol keamanan lapisan transportasi (TLS) menggunakan sertifikat untuk memberikan keamanan untuk komunikasi, enkripsi, autentikasi, dan integritas. Menggunakan TLS dengan pengontrol ingress pada AKS memungkinkan Anda untuk mengamankan komunikasi antara aplikasi Anda dan mengalami manfaat pengontrol ingress.
Anda dapat membawa sertifikat Anda sendiri dan mengintegrasikannya dengan driver CSI Secrets Store. Atau, Anda dapat menggunakan cert-manager, yang secara otomatis menghasilkan dan mengonfigurasi sertifikat Let's Encrypt . Dua aplikasi berjalan di kluster AKS, yang masing-masing dapat diakses melalui satu alamat IP.
Penting
Add-on perutean aplikasi direkomendasikan untuk masuk di AKS. Untuk informasi selengkapnya, lihat Ingress nginx terkelola dengan add-on perutean aplikasi.
Penting
Microsoft tidak mengelola atau mendukung cert-manager dan masalah apa pun yang berasal dari penggunaannya. Untuk masalah dengan cert-manager, lihat dokumentasi pemecahan masalah cert-manager.
Terdapat dua pengontrol ingress sumber terbuka untuk Kubernetes berdasarkan Nginx: Satu dikelola oleh komunitas Kubernetes (kubernetes/ingress-nginx), dan satu lagi dikelola oleh NGINX, Inc. (nginxinc/kubernetes-ingress). Artikel ini menggunakan pengontrol ingress komunitas Kubernetes.
Sebelum Anda mulai
Artikel ini mengasumsikan Anda telah menyiapkan pengontrol ingress dan aplikasi. Jika Anda memerlukan pengontrol ingress atau aplikasi contoh, lihat Membuat pengontrol ingress.
Artikel ini menggunakan Helm 3 untuk memasang ingress controller NGINX pada versi Kubernetes yang didukung. Pastikan Anda menggunakan rilis terbaru Helm dan memiliki akses ke
ingress-nginx
repositori Danjetstack
Helm. Langkah-langkah yang diuraikan dalam artikel ini mungkin tidak kompatibel dengan versi bagan Helm sebelumnya, ingress controller NGINX, atau Kubernetes.- Untuk informasi selengkapnya tentang mengonfigurasi dan menggunakan Helm, lihat Menginstal aplikasi dengan Helm di AKS. Untuk petunjuk pemutakhiran, lihat dokumen instalasi Helm.
Artikel ini mengasumsikan Anda memiliki kluster AKS yang sudah ada dengan Azure Container Registry (ACR) terintegrasi. Untuk informasi selengkapnya tentang membuat kluster AKS dengan ACR terintegrasi, lihat Mengautentikasi dengan ACR dari AKS.
Jika Anda menggunakan Azure CLI, artikel ini mengharuskan Anda menjalankan Azure CLI versi 2.0.64 atau yang lebih baru. Jalankan
az --version
untuk menemukan versinya. Jika Anda perlu memasang atau meningkatkan, lihat Memasang Azure CLI.Jika Anda menggunakan Azure PowerShell, artikel ini mengharuskan Anda menjalankan Azure PowerShell versi 5.9.0 atau yang lebih baru. Jalankan
Get-InstalledModule -Name Az
untuk menemukan versinya. Jika Anda perlu menginstal atau meningkatkan, lihat Install modul Azure PowerShell.
Menggunakan TLS dengan sertifikat Anda sendiri dengan Driver CSI Secrets Store
Untuk menggunakan TLS dengan sertifikat Anda sendiri dengan Secrets Store CSI Driver, Anda memerlukan kluster AKS dengan Driver Secrets Store CSI yang dikonfigurasi dan instans Azure Key Vault.
Untuk informasi selengkapnya, lihat Menyiapkan Driver CSI Secrets Store untuk mengaktifkan Pengontrol Ingress NGINX dengan TLS.
Menggunakan TLS dengan sertifikat Let's Encrypt
Untuk menggunakan TLS dengan sertifikat Let's Encrypt , Anda akan menyebarkan cert-manager, yang secara otomatis menghasilkan dan mengonfigurasi sertifikat Let's Encrypt.
Mengimpor gambar cert-manager yang digunakan oleh bagan Helm ke ACR Anda
Gunakan
az acr import
untuk mengimpor gambar berikut ke ACR Anda.REGISTRY_NAME=<REGISTRY_NAME> CERT_MANAGER_REGISTRY=quay.io CERT_MANAGER_TAG=v1.8.0 CERT_MANAGER_IMAGE_CONTROLLER=jetstack/cert-manager-controller CERT_MANAGER_IMAGE_WEBHOOK=jetstack/cert-manager-webhook CERT_MANAGER_IMAGE_CAINJECTOR=jetstack/cert-manager-cainjector az acr import --name $REGISTRY_NAME --source $CERT_MANAGER_REGISTRY/$CERT_MANAGER_IMAGE_CONTROLLER:$CERT_MANAGER_TAG --image $CERT_MANAGER_IMAGE_CONTROLLER:$CERT_MANAGER_TAG az acr import --name $REGISTRY_NAME --source $CERT_MANAGER_REGISTRY/$CERT_MANAGER_IMAGE_WEBHOOK:$CERT_MANAGER_TAG --image $CERT_MANAGER_IMAGE_WEBHOOK:$CERT_MANAGER_TAG az acr import --name $REGISTRY_NAME --source $CERT_MANAGER_REGISTRY/$CERT_MANAGER_IMAGE_CAINJECTOR:$CERT_MANAGER_TAG --image $CERT_MANAGER_IMAGE_CAINJECTOR:$CERT_MANAGER_TAG
Catatan
Anda juga dapat mengimpor bagan Helm ke ACR Anda. Untuk informasi selengkapnya, lihat Mendorong dan menarik bagan Helm ke ACR.
Opsi konfigurasi pengontrol ingress
Anda dapat mengonfigurasi pengontrol ingress NGINX menggunakan alamat IP publik statis atau alamat IP publik dinamis. Jika Anda menggunakan domain kustom, Anda perlu menambahkan catatan A ke zona DNS Anda. Jika Anda tidak menggunakan domain kustom, Anda dapat mengonfigurasi nama domain yang sepenuhnya memenuhi syarat (FQDN) untuk alamat IP pengontrol ingress.
Membuat alamat IP publik statis atau dinamis
Gunakan alamat IP publik statik
Anda dapat mengonfigurasi pengontrol ingress Anda dengan alamat IP publik statis. Alamat IP publik statis tetap ada jika Anda menghapus pengontrol ingress Anda. Alamat IP tidak tetap jika Anda menghapus kluster AKS Anda.
Saat meningkatkan pengontrol ingress, Anda harus meneruskan parameter ke rilis Helm untuk memastikan layanan pengontrol ingress dibuat mengetahui load balancer yang akan dialokasikan untuk itu. Agar sertifikat HTTPS berfungsi dengan benar, Anda menggunakan label DNS untuk mengonfigurasi FQDN untuk alamat IP pengontrol ingress.
Dapatkan nama grup sumber daya kluster AKS dengan
az aks show
perintah .az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv
Buat alamat IP publik dengan metode alokasi statis menggunakan
az network public-ip create
perintah . Contoh berikut membuat alamat IP publik bernama myAKSPublicIP di grup sumber daya kluster AKS yang diperoleh pada langkah sebelumnya.az network public-ip create --resource-group MC_myResourceGroup_myAKSCluster_eastus --name myAKSPublicIP --sku Standard --allocation-method static --query publicIp.ipAddress -o tsv
Catatan
Atau, Anda dapat membuat alamat IP di grup sumber daya yang berbeda, yang dapat Anda kelola secara terpisah dari kluster AKS Anda. Jika Anda membuat alamat IP di grup sumber daya yang berbeda, pastikan hal berikut benar:
- Identitas kluster yang digunakan oleh kluster AKS telah mendelegasikan izin ke grup sumber daya, seperti Kontributor Jaringan.
- Tambahkan parameter
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-resource-group"="<RESOURCE_GROUP>"
. Ganti<RESOURCE_GROUP>
dengan nama grup sumber daya tempat alamat IP berada.
Tambahkan parameter
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"="<DNS_LABEL>"
. Label DNS dapat diatur, baik saat pengontrol ingress pertama kali disebarkan atau dapat dikonfigurasi nanti.Tambahkan parameter
--set controller.service.loadBalancerIP="<STATIC_IP>"
. Tentukan alamat IP publik Anda yang dibuat di langkah sebelumnya.DNS_LABEL="<DNS_LABEL>" NAMESPACE="ingress-basic" STATIC_IP=<STATIC_IP> helm upgrade ingress-nginx ingress-nginx/ingress-nginx \ --namespace $NAMESPACE \ --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"=$DNS_LABEL \ --set controller.service.loadBalancerIP=$STATIC_IP \ --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz
Untuk informasi selengkapnya, lihat Menggunakan alamat IP publik statik dan label DNS dengan load balancer AKS.
Gunakan Alamat IP Publik Dinamis
Alamat IP publik Azure dibuat untuk pengontrol ingress Anda saat dibuat. Alamat IP publik statis untuk masa pakai pengontrol ingress Anda. Alamat IP publik tidak tetap jika Anda menghapus pengontrol ingress Anda. Jika Anda membuat pengontrol ingress baru, pengontrol tersebut akan diberi alamat IP publik baru. Output Anda akan terlihat mirip dengan contoh output berikut.
kubectl get service
Gunakan perintah untuk mendapatkan alamat IP publik untuk pengontrol ingress Anda.# Get the public IP address for your ingress controller kubectl --namespace ingress-basic get services -o wide -w nginx-ingress-ingress-nginx-controller # Sample output NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR nginx-ingress-ingress-nginx-controller LoadBalancer 10.0.74.133 EXTERNAL_IP 80:32486/TCP,443:30953/TCP 44s app.kubernetes.io/component=controller,app.kubernetes.io/instance=nginx-ingress,app.kubernetes.io/name=ingress-nginx
Menambahkan catatan A ke zona DNS Anda
Jika Anda menggunakan domain kustom, Anda perlu menambahkan catatan A ke zona DNS Anda. Jika Anda tidak menggunakan domain kustom, Anda dapat mengonfigurasi alamat IP publik dengan FQDN.
Tambahkan catatan A ke zona DNS Anda dengan alamat IP eksternal layanan NGINX menggunakan
az network dns record-set a add-record
.az network dns record-set a add-record \ --resource-group myResourceGroup \ --zone-name MY_CUSTOM_DOMAIN \ --record-set-name "*" \ --ipv4-address MY_EXTERNAL_IP
Mengonfigurasi FQDN untuk pengontrol ingress Anda
Secara opsional, Anda dapat mengonfigurasi FQDN untuk alamat IP pengontrol ingress alih-alih domain kustom dengan mengatur label DNS. FQDN Anda harus mengikuti formulir ini: <CUSTOM DNS LABEL>.<AZURE REGION NAME>.cloudapp.azure.com
.
Penting
Label DNS Anda harus unik dalam lokasi Azure-nya.
Anda dapat mengonfigurasi FQDN menggunakan salah satu metode berikut:
- Atur label DNS menggunakan Azure CLI atau Azure PowerShell.
- Atur label DNS menggunakan pengaturan bagan Helm.
Untuk informasi selengkapnya, lihat Label nama DNS alamat IP publik.
Mengatur label DNS menggunakan Azure CLI atau Azure PowerShell
Pastikan untuk mengganti <DNS_LABEL>
dengan label DNS unik Anda.
# Public IP address of your ingress controller
IP="MY_EXTERNAL_IP"
# Name to associate with public IP address
DNSLABEL="<DNS_LABEL>"
# Get the resource-id of the public IP
PUBLICIPID=$(az network public-ip list --query "[?ipAddress!=null]|[?contains(ipAddress, '$IP')].[id]" --output tsv)
# Update public IP address with DNS name
az network public-ip update --ids $PUBLICIPID --dns-name $DNSLABEL
# Display the FQDN
az network public-ip show --ids $PUBLICIPID --query "[dnsSettings.fqdn]" --output tsv
Mengatur label DNS menggunakan pengaturan bagan Helm
Anda dapat meneruskan pengaturan anotasi ke konfigurasi bagan Helm Anda menggunakan --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"
parameter . Parameter ini dapat diatur ketika pengontrol ingress pertama kali disebarkan, atau dapat dikonfigurasi nanti.
Contoh berikut menunjukkan cara memperbarui pengaturan ini setelah pengontrol telah disebarkan. Pastikan untuk mengganti <DNS_LABEL>
dengan label DNS unik Anda.
DNSLABEL="<DNS_LABEL>"
NAMESPACE="ingress-basic"
helm upgrade ingress-nginx ingress-nginx/ingress-nginx \
--namespace $NAMESPACE \
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"=$DNSLABEL \
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz
Memasang cert-manager
Pengontrol ingress NGINX mendukung penghentian TLS. Ada beberapa cara untuk mengambil dan mengonfigurasi sertifikat untuk HTTPS. Artikel ini menggunakan cert-manager, yang menyediakan fungsionalitas pembuatan dan manajemen sertifikat Lets Encrypt otomatis.
Untuk menginstal pengontrol cert-manager, gunakan perintah berikut.
# Set variable for ACR location to use for pulling images
ACR_URL=<REGISTRY_URL>
# Label the ingress-basic namespace to disable resource validation
kubectl label namespace ingress-basic cert-manager.io/disable-validation=true
# Add the Jetstack Helm repository
helm repo add jetstack https://charts.jetstack.io
# Update your local Helm chart repository cache
helm repo update
# Install the cert-manager Helm chart
helm install cert-manager jetstack/cert-manager \
--namespace ingress-basic \
--version=$CERT_MANAGER_TAG \
--set installCRDs=true \
--set nodeSelector."kubernetes\.io/os"=linux \
--set image.repository=$ACR_URL/$CERT_MANAGER_IMAGE_CONTROLLER \
--set image.tag=$CERT_MANAGER_TAG \
--set webhook.image.repository=$ACR_URL/$CERT_MANAGER_IMAGE_WEBHOOK \
--set webhook.image.tag=$CERT_MANAGER_TAG \
--set cainjector.image.repository=$ACR_URL/$CERT_MANAGER_IMAGE_CAINJECTOR \
--set cainjector.image.tag=$CERT_MANAGER_TAG
Untuk informasi selengkapnya tentang konfigurasi cert-manager, lihat proyek cert-manager.
Membuat pengeluar sertifikat kluster OS
Sebelum sertifikat dapat diterbitkan, cert-manager memerlukan salah satu penerbit berikut:
- Pengeluar sertifikat, yang berfungsi dalam satu namespace.
- Sumber daya ClusterIssuer , yang berfungsi di semua namespace layanan.
Untuk informasi selengkapnya, lihat dokumentasi pengeluar sertifikat cert-manager.
Buat pengeluar sertifikat kluster, seperti
cluster-issuer.yaml
, menggunakan manifes contoh berikut. GantiMY_EMAIL_ADDRESS
dengan alamat yang valid dari organisasi Anda.apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt spec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: MY_EMAIL_ADDRESS privateKeySecretRef: name: letsencrypt solvers: - http01: ingress: class: nginx podTemplate: spec: nodeSelector: "kubernetes.io/os": linux
Terapkan pengeluar sertifikat menggunakan
kubectl apply
perintah .kubectl apply -f cluster-issuer.yaml --namespace ingress-basic
Memperbarui rute ingress Anda
Anda perlu memperbarui rute masuk Anda untuk menangani lalu lintas ke FQDN atau domain kustom Anda.
Dalam contoh berikut, lalu lintas dirutekan seperti:
- Lalu lintas ke hello-world-ingress. MY_CUSTOM_DOMAIN dirutekan ke layanan aks-helloworld-one .
- Lalu lintas ke hello-world-ingress. MY_CUSTOM_DOMAIN/hello-world-two dirutekan ke layanan aks-helloworld-two .
- Lalu lintas ke hello-world-ingress. MY_CUSTOM_DOMAIN/static dialihkan ke layanan bernama aks-helloworld-one untuk aset statik.
Catatan
Jika Anda mengonfigurasi FQDN untuk alamat IP pengontrol ingress alih-alih domain kustom, gunakan FQDN alih-alih hello-world-ingress. MY_CUSTOM_DOMAIN.
Misalnya, jika FQDN Anda demo-aks-ingress.eastus.cloudapp.azure.com, ganti hello-world-ingress. MY_CUSTOM_DOMAIN dengan demo-aks-ingress.eastus.cloudapp.azure.com di hello-world-ingress.yaml
.
Buat atau perbarui
hello-world-ingress.yaml
file menggunakan contoh file YAML berikut.spec.tls.hosts
Perbarui danspec.rules.host
ke nama DNS yang Anda buat di langkah sebelumnya.apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: hello-world-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 nginx.ingress.kubernetes.io/use-regex: "true" cert-manager.io/cluster-issuer: letsencrypt spec: ingressClassName: nginx tls: - hosts: - hello-world-ingress.MY_CUSTOM_DOMAIN secretName: tls-secret rules: - host: hello-world-ingress.MY_CUSTOM_DOMAIN http: paths: - path: /hello-world-one(/|$)(.*) pathType: Prefix backend: service: name: aks-helloworld-one port: number: 80 - path: /hello-world-two(/|$)(.*) pathType: Prefix backend: service: name: aks-helloworld-two port: number: 80 - path: /(.*) pathType: Prefix backend: service: name: aks-helloworld-one port: number: 80 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: hello-world-ingress-static annotations: nginx.ingress.kubernetes.io/ssl-redirect: "false" nginx.ingress.kubernetes.io/rewrite-target: /static/$2 spec: ingressClassName: nginx tls: - hosts: - hello-world-ingress.MY_CUSTOM_DOMAIN secretName: tls-secret rules: - host: hello-world-ingress.MY_CUSTOM_DOMAIN http: paths: - path: /static(/|$)(.*) pathType: Prefix backend: service: name: aks-helloworld-one port: number: 80
Perbarui sumber daya ingress menggunakan perintah
kubectl apply
.kubectl apply -f hello-world-ingress.yaml --namespace ingress-basic
Verifikasi bahwa objek sertifikat telah dibuat
Selanjutnya, sumber daya sertifikat harus dibuat. Sumber daya sertifikat menentukan sertifikat X.509 yang diinginkan. Untuk informasi selengkapnya, lihat sertifikat cert-manager.
Cert-manager secara otomatis membuat objek sertifikat untuk Anda menggunakan ingress-shim, yang secara otomatis disebarkan dengan cert-manager sejak v0.2.2. Untuk informasi selengkapnya, lihat dokumentasi ingress-shim.
Untuk memverifikasi bahwa sertifikat berhasil dibuat, gunakan kubectl get certificate --namespace ingress-basic
perintah dan verifikasi SIAP adalah True. Mungkin perlu waktu beberapa menit untuk mendapatkan output.
kubectl get certificate --namespace ingress-basic
Output berikut menunjukkan status sertifikat.
NAME READY SECRET AGE
tls-secret True tls-secret 11m
Menguji konfigurasi ingress
Buka browser web untuk hello-world-ingress. MY_CUSTOM_DOMAIN atau FQDN dari pengontrol ingress Kubernetes Anda. Pastikan berikut ini benar:
- Anda dialihkan untuk menggunakan HTTPS.
- Sertifikat tepercaya.
- Aplikasi demo ditampilkan di browser web.
- Tambahkan /hello-world-two ke akhir domain dan pastikan aplikasi demo kedua dengan judul kustom ditampilkan.
Membersihkan sumber daya
Artikel ini menggunakan Helm untuk memasang komponen ingress, sertifikat, dan aplikasi sampel. Saat Anda menyebarkan bagan Helm, sejumlah sumber daya Kubernetes dibuat. Sumber daya ini mencakup pod, penyebaran, dan layanan. Untuk membersihkan sumber daya ini, Anda dapat menghapus seluruh namespace sampel atau sumber daya individual.
Menghapus namespace layanan sampel dan semua sumber daya
Menghapus namespace sampel juga menghapus semua sumber daya di namespace layanan.
Hapus seluruh namespace sampel menggunakan
kubectl delete
perintah dan tentukan nama namespace Anda.kubectl delete namespace ingress-basic
Menghapus sumber daya satu per satu
Atau, Anda dapat menghapus sumber daya satu per satu.
Hapus sumber daya penerbit kluster.
kubectl delete -f cluster-issuer.yaml --namespace ingress-basic
Cantumkan rilis Helm dengan perintah
helm list
. Cari bagan bernama nginx dan cert-manager, seperti yang ditunjukkan dalam contoh output berikut.$ helm list --namespace ingress-basic NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION cert-manager ingress-basic 1 2020-01-15 10:23:36.515514 -0600 CST deployed cert-manager-v0.13.0 v0.13.0 nginx ingress-basic 1 2020-01-15 10:09:45.982693 -0600 CST deployed nginx-ingress-1.29.1 0.27.0
Hapus instalan rilis menggunakan
helm uninstall
perintah . Contoh berikut mencopot pemasangan penyebaran ingress NGINX dan cert-manager.$ helm uninstall cert-manager nginx --namespace ingress-basic release "cert-manager" uninstalled release "nginx" uninstalled
Hapus dua aplikasi sampel.
kubectl delete -f aks-helloworld-one.yaml --namespace ingress-basic kubectl delete -f aks-helloworld-two.yaml --namespace ingress-basic
Hapus rute masuk yang mengarahkan lalu lintas ke aplikasi sampel.
kubectl delete -f hello-world-ingress.yaml --namespace ingress-basic
Hapus namespace itu sendiri.
kubectl delete
Gunakan perintah dan tentukan nama namespace Anda.kubectl delete namespace ingress-basic
Langkah berikutnya
Artikel ini menyertakan beberapa komponen eksternal ke AKS. Untuk mempelajari komponen ini lebih lanjut, lihat halaman proyek berikut:
Anda juga dapat: