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 Dan jetstack Helm. Langkah-langkah yang diuraikan dalam artikel ini mungkin tidak kompatibel dengan versi bagan Helm sebelumnya, ingress controller NGINX, atau Kubernetes.

  • 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.

  1. Dapatkan nama grup sumber daya kluster AKS dengan az aks show perintah .

    az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv
    
  2. 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.
  1. 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.

  2. 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:

Untuk informasi selengkapnya, lihat dokumentasi pengeluar sertifikat cert-manager.

  1. Buat pengeluar sertifikat kluster, seperti cluster-issuer.yaml, menggunakan manifes contoh berikut. Ganti MY_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
    
  2. 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.

  1. Buat atau perbarui hello-world-ingress.yaml file menggunakan contoh file YAML berikut. spec.tls.hosts Perbarui dan spec.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
    
  2. 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.

  1. Hapus sumber daya penerbit kluster.

    kubectl delete -f cluster-issuer.yaml --namespace ingress-basic
    
  2. 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
    
  3. 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
    
  4. Hapus dua aplikasi sampel.

    kubectl delete -f aks-helloworld-one.yaml --namespace ingress-basic
    kubectl delete -f aks-helloworld-two.yaml --namespace ingress-basic
    
  5. Hapus rute masuk yang mengarahkan lalu lintas ke aplikasi sampel.

    kubectl delete -f hello-world-ingress.yaml --namespace ingress-basic
    
  6. 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: