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 jaringan virtual yang sama atau di jaringan virtual lain melalui peering jaringan virtual. Artikel ini memperlihatkan kepada Anda cara membuat dan menggunakan load balancer internal dengan AKS.

Penting

Mulai 30 September 2025, Azure Kubernetes Service (AKS) tidak lagi mendukung Load Balancer Dasar. Untuk menghindari potensi gangguan layanan, sebaiknya gunakan Load Balancer Standar untuk penyebaran baru dan meningkatkan penyebaran yang ada ke Load Balancer Standar. Untuk informasi selengkapnya tentang penghentian ini, lihat masalah Penghentian GitHub dan pengumuman penghentian Pembaruan Azure. Untuk tetap mendapatkan informasi tentang pengumuman dan pembaruan, ikuti catatan rilis AKS.

Sebelum Anda mulai

Membuat penyeimbang beban internal

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

    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 perintah kubectl apply. 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 dari load balancer internal ditampilkan pada kolom EXTERNAL-IP, 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 harus tersedia dalam subnet yang digunakan oleh load balancer. Secara default, load balancer menggunakan subnet yang sama dengan kluster AKS. Jangan gunakan alamat IP yang dicadangkan Azure, alamat IP yang sudah ditetapkan ke sumber daya lain, atau alamat IP dari CIDR layanan Kubernetes.

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 penyeimbang beban, Anda memiliki dua opsi: mengatur anotasi layanan atau menambahkan properti LoadBalancerIP ke manifes YAML penyeimbang beban.

Penting

Penambahan properti LoadBalancerIP ke manifes YAML load balancer akan dihentikan penggunaannya mengikuti Kubernetes upstream. Meskipun penggunaan saat ini tetap sama dan layanan yang ada diharapkan berfungsi tanpa modifikasi, kami sangat menyarankan pengaturan anotasi layanan sebagai gantinya. Untuk informasi selengkapnya tentang anotasi layanan, lihat anotasi yang didukung untuk Azure Load Balancer.

  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
    
  2. 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 mengonfigurasi load balancer Anda di subnet yang berbeda, lihat Menentukan subnet yang berbeda.

Penting

Private Link Service memiliki batasan berikut:

  • Private Link Service hanya mendukung lalu lintas IPv4 dan hanya mendukung protokol transportasi TCP dan UDP.
  • Jika layanan menggunakan externalTrafficPolicy: Local, subnet Private Link Service harus berbeda dari subnet pod. Untuk menggunakan subnet yang sama, atur externalTrafficPolicy ke Cluster.
  • Jika Anda mengaktifkan protokol PROXY dan menggunakan externalTrafficPolicy: Local, Anda harus mengonfigurasi pemeriksaan kesehatan kustom karena pemeriksaan kesehatan default gagal.

Untuk informasi selengkapnya, lihat batasan layanan Private Link dan pembatasan integrasi layanan Azure Private Link.

  1. Buat manifes layanan bernama internal-lb-pls.yaml dengan jenis layanan LoadBalancer serta anotasi azure-load-balancer-internal 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 perintah kubectl apply. 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 internal yang terkait dengan objek 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 dari load balancer internal ditampilkan pada kolom EXTERNAL-IP, 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 . Ganti pls-xyz dengan nama Layanan Private Link yang dikembalikan pada langkah sebelumnya.

Atur --resource-group ke grup sumber daya target tempat Anda ingin membuat titik akhir privat. Atur --vnet-name dan --subnet ke jaringan virtual dan subnet yang berisi titik akhir privat. Atur --private-connection-resource-id ke ID sumber daya layanan Private Link yang diambil di AKS_PLS_ID.

# Create variables for the Private Link Service

AKS_PLS_NAME=pls-xyz
AKS_PLS_ID=$(az network private-link-service show -g $AKS_MC_RG --name $AKS_PLS_NAME --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

Anda dapat menggunakan anotasi berikut 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 diisi
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 dibuat Opsional MC_resource
service.beta.kubernetes.io/azure-pls-ip-configuration-subnet <Subnet name> String yang menunjukkan subnet tempat PLS disebarkan. Subnet ini harus ada di jaringan virtual 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 bawaan 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 statis IPv4yang dipisahkan spasi untuk 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 spasi yang dipisahkan dari nama domain yang sepenuhnya memenuhi syarat 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. Layanan backend HARUS mendukung protokol PROXY atau koneksi gagal. Opsional false
service.beta.kubernetes.io/azure-pls-visibility "sub1 sub2 sub3 … subN" atau "*" Daftar spasi yang dipisahkan dari ID langganan Azure tempat Layanan Private Link terlihat. Gunakan "*" untuk mengekspos PLS ke semua sub (Paling tidak ketat). Opsional Daftar [] kosong yang hanya menunjukkan kontrol akses berbasis peran: Layanan Private Link ini hanya tersedia untuk pengguna dengan izin RBAC Azure yang diperlukan, termasuk pengguna yang berwenang di seluruh penyewa. (Paling ketat)
service.beta.kubernetes.io/azure-pls-auto-approval "sub1 sub2 sub3 … subN" Daftar spasi yang dipisahkan dari ID langganan Azure yang permintaan koneksi PE-nya ke PLS disetujui secara otomatis. Daftar persetujuan otomatis harus merupakan subset dari daftar visibilitas. Opsional []

Menggunakan load balancer internal dengan 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 di grup sumber daya simpul untuk kluster AKS Anda dan 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 harus memiliki peran Kontributor Jaringan setidaknya 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

Tambahkan anotasi azure-load-balancer-internal-subnet ke layanan Anda untuk menentukan subnet bagi 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

Atur service.beta.kubernetes.io/azure-load-balancer-internal-subnet nilai anotasi ke string nama subnet, seperti "apps-subnet".

Menghapus penyeimbang beban

Load balancer dihapus saat Anda menghapus semua layanan Kubernetes-nya.

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.