Gunakan load balancer internal dengan Azure Kubernetes Service (AKS)

Anda dapat membuat dan menggunakan load balancer internal untuk membatasi akses ke aplikasi Anda di Azure Kubernetes Service (AKS). Load balancer internal tidak memiliki IP publik dan membuat layanan Kubernetes hanya dapat diakses oleh aplikasi yang dapat menjangkau IP privat. Aplikasi ini dapat berada dalam VNET yang sama atau di VNET lain melalui peering VNET. Artikel ini memperlihatkan kepada Anda cara membuat dan menggunakan load balancer internal dengan AKS.

Catatan

Azure Load Balancer tersedia dalam dua SKU: Dasar dan Standar. SKU Standar digunakan secara default saat Anda membuat kluster AKS. Saat membuat jenis layanan LoadBalancer , Anda akan mendapatkan jenis load balancer yang sama seperti saat Anda memprovisikan kluster. Untuk informasi selengkapnya, lihat Perbandingan SKU Azure Load Balancer.

Sebelum Anda mulai

Membuat penyeimbang muatan internal

  1. Buat manifes layanan bernama internal-lb.yaml dengan jenis LoadBalancer layanan dan azure-load-balancer-internal anotasi.

    apiVersion: v1
    kind: Service
    metadata:
      name: internal-app
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: internal-app
    
  2. Sebarkan load balancer internal menggunakan kubectl apply perintah . Perintah ini membuat load balancer Azure di grup sumber daya simpul yang terhubung ke jaringan virtual yang sama dengan kluster AKS Anda.

    kubectl apply -f internal-lb.yaml
    
  3. Lihat detail layanan menggunakan kubectl get service perintah .

    kubectl get service internal-app
    

    Alamat IP load balancer internal ditampilkan di EXTERNAL-IP kolom, seperti yang ditunjukkan dalam contoh output berikut. Dalam konteks ini, Eksternal mengacu pada antarmuka eksternal load balancer. Ini tidak berarti bahwa ia menerima alamat IP publik dan eksternal. Alamat IP ini ditetapkan secara dinamis dari subnet yang sama dengan kluster AKS.

    NAME           TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    internal-app   LoadBalancer   10.0.248.59   10.240.0.7    80:30555/TCP   2m
    

Tentukan alamat IP

Saat Anda menentukan alamat IP untuk load balancer, alamat IP yang ditentukan harus berada di subnet yang sama dengan kluster AKS, tetapi belum dapat ditetapkan ke sumber daya. Misalnya, Anda tidak boleh menggunakan alamat IP dalam rentang yang ditunjuk untuk subnet Kubernetes dalam kluster AKS.

Anda dapat menggunakan az network vnet subnet list perintah Azure CLI atau Get-AzVirtualNetworkSubnetConfig cmdlet PowerShell untuk mendapatkan subnet di jaringan virtual Anda.

Untuk informasi selengkapnya tentang subnet, lihat Menambahkan kumpulan simpul dengan subnet unik.

Jika Anda ingin menggunakan alamat IP tertentu dengan load balancer, Anda memiliki dua opsi: mengatur anotasi layanan atau menambahkan properti LoadBalancerIP ke manifes YAML load balancer.

Penting

Menambahkan properti LoadBalancerIP ke manifes YAML load balancer tidak digunakan lagi setelah Kubernetes upstream. Meskipun penggunaan saat ini tetap sama dan layanan yang ada diharapkan berfungsi tanpa modifikasi, kami sangat menyarankan pengaturan anotasi layanan sebagai gantinya.

  1. Atur anotasi layanan menggunakan service.beta.kubernetes.io/azure-load-balancer-ipv4 untuk alamat IPv4 dan service.beta.kubernetes.io/azure-load-balancer-ipv6 untuk alamat IPv6.

    apiVersion: v1
    kind: Service
    metadata:
      name: internal-app
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-ipv4: 10.240.0.25
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: internal-app
    
  1. Lihat detail layanan menggunakan kubectl get service perintah .

    kubectl get service internal-app
    

    Alamat IP di EXTERNAL-IP kolom harus mencerminkan alamat IP yang Anda tentukan, seperti yang ditunjukkan dalam contoh output berikut:

    NAME           TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
    internal-app   LoadBalancer   10.0.184.168   10.240.0.25   80:30225/TCP   4m
    

Untuk informasi selengkapnya tentang cara mengonfigurasi load balancer Anda di subnet yang berbeda, lihat Menentukan subnet yang berbeda

Sebelum Anda mulai

  • Anda memerlukan Kubernetes versi 1.22.x atau yang lebih baru.
  • Anda memerlukan grup sumber daya yang ada dengan VNet dan subnet. Grup sumber daya ini adalah tempat Anda membuat titik akhir privat. Jika Anda tidak memiliki sumber daya ini, lihat Membuat jaringan virtual dan subnet.
  1. Buat manifes layanan bernama internal-lb-pls.yaml dengan jenis LoadBalancer layanan dan azure-load-balancer-internal anotasi dan azure-pls-create . Untuk opsi lainnya, lihat dokumen desain Integrasi Layanan Azure Private Link.

    apiVersion: v1
    kind: Service
    metadata:
      name: internal-app
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
        service.beta.kubernetes.io/azure-pls-create: "true"
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: internal-app
    
  2. Sebarkan load balancer internal menggunakan kubectl apply perintah . Perintah ini membuat load balancer Azure di grup sumber daya simpul yang terhubung ke jaringan virtual yang sama dengan kluster AKS Anda. Ini juga membuat objek Private Link Service yang terhubung ke konfigurasi IP frontend dari load balancer yang terkait dengan layanan Kubernetes.

    kubectl apply -f internal-lb-pls.yaml
    
  3. Lihat detail layanan menggunakan kubectl get service perintah .

    kubectl get service internal-app
    

    Alamat IP load balancer internal ditampilkan di EXTERNAL-IP kolom, seperti yang ditunjukkan dalam contoh output berikut. Dalam konteks ini, Eksternal mengacu pada antarmuka eksternal load balancer. Ini tidak berarti bahwa ia menerima alamat IP publik dan eksternal.

    NAME           TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    internal-app   LoadBalancer   10.125.17.53  10.125.0.66   80:30430/TCP   64m
    
  4. Lihat detail objek Layanan Private Link menggunakan az network private-link-service list perintah .

    # Create a variable for the node resource group
    
    AKS_MC_RG=$(az aks show -g myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv)
    
    # View the details of the Private Link Service object
    
    az network private-link-service list -g $AKS_MC_RG --query "[].{Name:name,Alias:alias}" -o table
    

    Output Anda akan terlihat mirip dengan contoh output berikut:

    Name      Alias
    --------  -------------------------------------------------------------------------
    pls-xyz   pls-xyz.abc123-defg-4hij-56kl-789mnop.eastus2.azure.privatelinkservice
    

Titik Akhir Privat memungkinkan Anda untuk terhubung secara privat ke objek layanan Kubernetes melalui Layanan Private Link yang Anda buat.

  • Buat titik akhir privat menggunakan az network private-endpoint create perintah .

    # Create a variable for the private link service
    
    AKS_PLS_ID=$(az network private-link-service list -g $AKS_MC_RG --query "[].id" -o tsv)
    
    # Create the private endpoint
    
    $ az network private-endpoint create \
        -g myOtherResourceGroup \
        --name myAKSServicePE \
        --vnet-name myOtherVNET \
        --subnet pe-subnet \
        --private-connection-resource-id $AKS_PLS_ID \
        --connection-name connectToMyK8sService
    

Kustomisasi PLS melalui Anotasi

Berikut ini adalah anotasi yang dapat digunakan untuk menyesuaikan sumber daya PLS.

Anotasi Nilai Deskripsi Wajib diisi Default
service.beta.kubernetes.io/azure-pls-create "true" Boolean menunjukkan apakah PLS perlu dibuat. Wajib
service.beta.kubernetes.io/azure-pls-name <PLS name> String yang menentukan nama sumber daya PLS yang akan dibuat. Opsional "pls-<LB frontend config name>"
service.beta.kubernetes.io/azure-pls-resource-group Resource Group name String yang menentukan nama Grup Sumber Daya tempat sumber daya PLS akan dibuat Opsional MC_ resource
service.beta.kubernetes.io/azure-pls-ip-configuration-subnet <Subnet name> String yang menunjukkan subnet tempat PLS akan disebarkan. Subnet ini harus ada di VNET yang sama dengan kumpulan backend. IP NAT PLS dialokasikan dalam subnet ini. Opsional Jika service.beta.kubernetes.io/azure-load-balancer-internal-subnet, subnet ILB ini digunakan. Jika tidak, subnet default dari file konfigurasi digunakan.
service.beta.kubernetes.io/azure-pls-ip-configuration-ip-address-count [1-8] Jumlah total IP NAT privat yang akan dialokasikan. Opsional 1
service.beta.kubernetes.io/azure-pls-ip-configuration-ip-address "10.0.0.7 ... 10.0.0.10" Daftar IP IPv4 statis yang dipisahkan spasi yang akan dialokasikan. (IPv6 tidak didukung saat ini.) Jumlah total IP tidak boleh lebih besar dari jumlah ip yang ditentukan dalam service.beta.kubernetes.io/azure-pls-ip-configuration-ip-address-count. Jika ada lebih sedikit IP yang ditentukan, sisanya dialokasikan secara dinamis. IP pertama dalam daftar diatur sebagai Primary. Opsional Semua IP dialokasikan secara dinamis.
service.beta.kubernetes.io/azure-pls-fqdns "fqdn1 fqdn2" Daftar fqdn yang dipisahkan spasi yang terkait dengan PLS. Opsional []
service.beta.kubernetes.io/azure-pls-proxy-protocol "true" atau "false" Boolean menunjukkan apakah protokol PROXY TCP harus diaktifkan pada PLS untuk meneruskan informasi koneksi, termasuk ID tautan dan alamat IP sumber. Perhatikan bahwa layanan backend HARUS mendukung protokol PROXY atau koneksi akan gagal. Opsional false
service.beta.kubernetes.io/azure-pls-visibility "sub1 sub2 sub3 … subN" atau "*" Daftar id langganan Azure yang dipisahkan spasi tempat layanan tautan privat terlihat. Gunakan "*" untuk mengekspos PLS ke semua sub (Paling tidak ketat). Opsional Daftar [] kosong yang hanya menunjukkan kontrol akses berbasis peran: Layanan tautan privat ini hanya akan tersedia untuk individu dengan izin kontrol akses berbasis peran dalam direktori Anda. (Paling ketat)
service.beta.kubernetes.io/azure-pls-auto-approval "sub1 sub2 sub3 … subN" Daftar id langganan Azure yang dipisahkan spasi. Ini memungkinkan permintaan koneksi PE dari langganan yang tercantum ke PLS untuk disetujui secara otomatis. Ini hanya berfungsi ketika visibilitas diatur ke "*". Opsional []

Gunakan jaringan privat

Saat membuat kluster AKS, Anda dapat menentukan setelan jaringan tingkat lanjut. Pengaturan ini memungkinkan Anda untuk menyebarkan kluster ke jaringan virtual Azure dan subnet yang ada. Misalnya, Anda dapat menyebarkan kluster AKS ke jaringan privat yang terhubung ke lingkungan lokal Anda dan menjalankan layanan yang hanya dapat diakses secara internal.

Untuk informasi selengkapnya, lihat mengonfigurasi subnet jaringan virtual Anda sendiri dengan Kubenet atau dengan Azure CNI.

Anda tidak perlu membuat perubahan apa pun pada langkah-langkah sebelumnya untuk menyebarkan load balancer internal yang menggunakan jaringan privat dalam kluster AKS. Load balancer dibuat dalam grup sumber daya yang sama dengan kluster AKS Anda, tetapi sebaliknya terhubung ke jaringan virtual dan subnet privat Anda, seperti yang ditunjukkan dalam contoh berikut:

$ kubectl get service internal-app

NAME           TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
internal-app   LoadBalancer   10.1.15.188   10.0.0.35     80:31669/TCP   1m

Catatan

Identitas kluster yang digunakan oleh kluster AKS setidaknya harus memiliki peran Kontributor Jaringan pada sumber daya jaringan virtual. Anda dapat melihat identitas kluster menggunakan az aks show perintah , seperti az aks show --resource-group <resource-group-name> --name <cluster-name> --query "identity". Anda dapat menetapkan peran Kontributor Jaringan menggunakan az role assignment create perintah , seperti az role assignment create --assignee <identity-resource-id> --scope <virtual-network-resource-id> --role "Network Contributor".

Jika Anda ingin menentukan peran kustom sebagai gantinya, Anda memerlukan izin berikut:

  • Microsoft.Network/virtualNetworks/subnets/join/action
  • Microsoft.Network/virtualNetworks/subnets/read

Untuk informasi selengkapnya, lihat Menambahkan, mengubah, atau menghapus subnet jaringan virtual.

Tentukan subnet yang berbeda

  • azure-load-balancer-internal-subnet Tambahkan anotasi ke layanan Anda untuk menentukan subnet untuk load balancer Anda. Subnet yang ditentukan harus berada dalam jaringan maya yang sama dengan kluster AKS Anda. Saat disebarkan, alamat load balancer EXTERNAL-IP adalah bagian dari subnet yang ditentukan.

    apiVersion: v1
    kind: Service
    metadata:
      name: internal-app
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
        service.beta.kubernetes.io/azure-load-balancer-internal-subnet: "apps-subnet"
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: internal-app
    

Menghapus load balancer

Load balancer dihapus ketika semua layanannya dihapus.

Seperti halnya sumber daya Kubernetes apa pun, Anda dapat langsung menghapus layanan, seperti kubectl delete service internal-app, yang juga menghapus load balancer Azure yang mendasar.

Langkah berikutnya

Pelajari lebih lanjut tentang layanan Kubernetes di dokumen layanan Kubernetes.