Menggunakan IP publik tingkat instans di Azure Kubernetes Service (AKS)

Simpul AKS tidak memerlukan alamat IP publik mereka sendiri untuk komunikasi. Namun, skenario mungkin memerlukan simpul-simpul dalam satu kumpulan simpul untuk menerima alamat IP publik khusus mereka sendiri. Skenario umum adalah untuk beban kerja game, di mana konsol perlu membuat koneksi langsung ke komputer virtual cloud untuk meminimalkan hop. Skenario ini dapat dicapai di AKS dengan menggunakan IP Publik Simpul.

Pertama-tama, buat grup sumber daya.

az group create --name myResourceGroup2 --location eastus

Buat kluster AKS dan lampirkan IP publik untuk simpul Anda. Masing-masing simpul dalam kumpulan simpul menerima IP publik yang unik. Anda dapat memverifikasi ini dengan melihat instans Set Skala Komputer Virtual.

az aks create -g MyResourceGroup2 -n MyManagedCluster -l eastus  --enable-node-public-ip

Untuk kluster AKS yang ada, Anda juga dapat menambahkan kumpulan simpul baru, dan melampirkan IP publik untuk simpul Anda.

az aks nodepool add -g MyResourceGroup2 --cluster-name MyManagedCluster -n nodepool2 --enable-node-public-ip

Gunakan prefiks IP publik

Ada sejumlah manfaat dalam penggunaan prefiks IP publik. AKS mendukung penggunaan alamat dari prefiks IP publik yang ada untuk simpul Anda dengan meneruskan ID sumber daya dengan bendera node-public-ip-prefix ketika membuat kluster baru atau menambahkan kumpulan simpul.

Pertama, buat prefiks IP publik menggunakan prefiks az network public-ip prefix create:

az network public-ip prefix create --length 28 --location eastus --name MyPublicIPPrefix --resource-group MyResourceGroup3

Lihat output, dan catat id prefiksnya:

{
  ...
  "id": "/subscriptions/<subscription-id>/resourceGroups/myResourceGroup3/providers/Microsoft.Network/publicIPPrefixes/MyPublicIPPrefix",
  ...
}

Terakhir, saat membuat kluster baru atau menambahkan kumpulan simpul baru, gunakan node-public-ip-prefix bendera dan lewati ID sumber daya awalan:

az aks create -g MyResourceGroup3 -n MyManagedCluster -l eastus --enable-node-public-ip --node-public-ip-prefix /subscriptions/<subscription-id>/resourcegroups/MyResourceGroup3/providers/Microsoft.Network/publicIPPrefixes/MyPublicIPPrefix

Cari IP publik untuk simpul

Anda dapat mencari IP publik untuk simpul Anda dengan berbagai cara:

Penting

grup sumber daya simpul berisi beberapa simpul dan IP publik mereka. Gunakan grup sumber daya simpul saat menjalankan perintah untuk mencari IP publik untuk simpul Anda.

az vmss list-instance-public-ips -g MC_MyResourceGroup2_MyManagedCluster_eastus -n YourVirtualMachineScaleSetName

Menggunakan tag IP publik pada IP publik simpul

Tag IP publik dapat digunakan pada IP publik simpul untuk menggunakan fitur Preferensi Perutean Azure.

Persyaratan

  • Diperlukan AKS versi 1.24 atau yang lebih tinggi.

Membuat kluster baru menggunakan internet preferensi perutean

az aks create -n <clusterName> -l <location> -g <resourceGroup> \
  --enable-node-public-ip \
  --node-public-ip-tags RoutingPreference=Internet

Menambahkan kumpulan simpul dengan internet preferensi perutean

az aks nodepool add --cluster-name <clusterName> -n <nodepoolName> -l <location> -g <resourceGroup> \
  --enable-node-public-ip \
  --node-public-ip-tags RoutingPreference=Internet

Perbolehkan koneksi port host dan tambahkan kumpulan simpul ke grup keamanan aplikasi

Simpul AKS yang menggunakan IP publik node yang menghosting layanan pada alamat host mereka harus memiliki aturan NSG yang ditambahkan untuk mengizinkan lalu lintas. Menambahkan port yang diinginkan dalam konfigurasi kumpulan simpul akan membuat aturan izin yang sesuai dalam kelompok keamanan jaringan kluster.

Jika grup keamanan jaringan diberlakukan pada subnet dengan kluster menggunakan jaringan virtual bring-your-own, aturan izinkan harus ditambahkan ke grup keamanan jaringan tersebut. Ini dapat dibatasi pada simpul dalam kumpulan simpul tertentu dengan menambahkan kumpulan simpul ke kelompok keamanan aplikasi (ASG). ASG terkelola akan dibuat secara default di grup sumber daya terkelola jika port host yang diizinkan ditentukan. Simpul juga dapat ditambahkan ke satu atau beberapa ASG kustom dengan menentukan ID sumber daya NSG dalam parameter kumpulan simpul.

Format spesifikasi port host

Saat menentukan daftar port yang akan diizinkan, gunakan daftar terpisah koma dengan entri dalam format port/protocol atau startPort-endPort/protocol.

Contoh:

  • 80/tcp
  • 80/tcp,443/tcp
  • 53/udp,80/tcp
  • 50000-60000/tcp

Persyaratan

  • Diperlukan AKS versi 1.24 atau yang lebih tinggi.

Membuat kluster baru dengan port dan grup keamanan aplikasi yang diizinkan

az aks create \
  --resource-group <resourceGroup> \
  --name <clusterName> \
  --nodepool-name <nodepoolName> \
  --nodepool-allowed-host-ports 80/tcp,443/tcp,53/udp,40000-60000/tcp,40000-50000/udp\
  --nodepool-asg-ids "<asgId>,<asgId>"

Menambahkan kumpulan simpul baru dengan port dan grup keamanan aplikasi yang diizinkan

  --resource-group <resourceGroup> \
  --cluster-name <clusterName> \
  --name <nodepoolName> \
  --allowed-host-ports 80/tcp,443/tcp,53/udp,40000-60000/tcp,40000-50000/udp \
  --asg-ids "<asgId>,<asgId>"

Memperbarui port dan grup keamanan aplikasi yang diizinkan untuk kumpulan simpul

  --resource-group <resourceGroup> \
  --cluster-name <clusterName> \
  --name <nodepoolName> \
  --allowed-host-ports 80/tcp,443/tcp,53/udp,40000-60000/tcp,40000-50000/udp \
  --asg-ids "<asgId>,<asgId>"

Secara otomatis menetapkan port host untuk beban kerja pod (PRATINJAU)

Ketika IP publik dikonfigurasi pada node, port host dapat digunakan untuk memungkinkan pod menerima lalu lintas secara langsung tanpa harus mengonfigurasi layanan load balancer. Ini sangat berguna dalam skenario seperti game, di mana sifat sementara dari IP node dan port tidak menjadi masalah karena layanan matchmaker pada nama host terkenal dapat menyediakan host dan port yang benar untuk digunakan pada waktu koneksi. Namun, karena hanya satu proses pada host yang dapat mendengarkan pada port yang sama, menggunakan aplikasi dengan port host dapat menyebabkan masalah dengan penjadwalan. Untuk menghindari masalah ini, AKS menyediakan kemampuan untuk memiliki sistem secara dinamis menetapkan port yang tersedia pada waktu penjadwalan, mencegah konflik.

Peringatan

Lalu lintas port host pod akan diblokir oleh aturan NSG default yang berlaku pada kluster. Fitur ini harus dikombinasikan dengan memungkinkan port host pada kumpulan simpul untuk memungkinkan lalu lintas mengalir.

Penting

Fitur pratinjau AKS tersedia berdasarkan layanan mandiri. Pratinjau disediakan "apa adanya" dan "sebagaimana tersedia," dan mereka dikecualikan dari perjanjian tingkat layanan dan garansi terbatas. Pratinjau AKS sebagian dicakup oleh dukungan pelanggan berdasarkan upaya terbaik. Dengan demikian, fitur-fitur ini tidak dimaksudkan untuk penggunaan produksi. Untuk informasi lebih lanjut, lihat artikel dukungan berikut ini:

Persyaratan

  • Diperlukan AKS versi 1.24 atau yang lebih tinggi.

Daftarkan bendera fitur 'PodHostPortAutoAssignPreview'

Daftarkan PodHostPortAutoAssignPreview bendera fitur dengan menggunakan perintah daftar fitur az, seperti yang ditunjukkan dalam contoh berikut:

az feature register --namespace "Microsoft.ContainerService" --name "PodHostPortAutoAssignPreview"

Dibutuhkan beberapa menit agar status menampilkan Terdaftar. Verifikasi status pendaftaran dengan menggunakan perintah az feature show :

az feature show --namespace "Microsoft.ContainerService" --name "PodHostPortAutoAssignPreview"

Saat status mencerminkan Terdaftar, refresh pendaftaran penyedia sumber daya Microsoft.ContainerService dengan menggunakan perintah az provider register :

az provider register --namespace Microsoft.ContainerService

Secara otomatis menetapkan port host ke pod

Pemicu penetapan otomatis port host dilakukan dengan menyebarkan beban kerja tanpa port host dan menerapkan kubernetes.azure.com/assign-hostports-for-containerports anotasi dengan daftar port yang memerlukan penetapan port host. Nilai anotasi harus ditentukan sebagai daftar entri yang dipisahkan koma seperti port/protocol, di mana port adalah nomor port individual yang ditentukan dalam spesifikasi Pod dan protokolnya adalah tcp atau udp.

Port akan ditetapkan dari rentang 40000-59999 dan akan unik di seluruh kluster. Port yang ditetapkan juga akan ditambahkan ke variabel lingkungan di dalam pod sehingga aplikasi dapat menentukan port apa yang ditetapkan. Nama variabel lingkungan akan dalam format berikut (contoh di bawah): <deployment name>_PORT_<port number>_<protocol>_HOSTPORT, jadi contohnya adalah mydeployment_PORT_8080_TCP_HOSTPORT: 41932.

Berikut adalah contoh echoserver penyebaran, yang menunjukkan pemetaan port host untuk port 8080 dan 8443:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: echoserver-hostport
  labels:
    app: echoserver-hostport
spec:
  replicas: 3
  selector:
    matchLabels:
      app: echoserver-hostport
  template:
    metadata:
      annotations:
        kubernetes.azure.com/assign-hostports-for-containerports: 8080/tcp,8443/tcp
      labels:
        app: echoserver-hostport
    spec:
      nodeSelector:
        kubernetes.io/os: linux
      containers:
        - name: echoserver-hostport
          image: k8s.gcr.io/echoserver:1.10
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
            - name: https
              containerPort: 8443
              protocol: TCP

Ketika penyebaran diterapkan, hostPort entri akan berada di YAML dari masing-masing pod:

$ kubectl describe pod echoserver-hostport-75dc8d8855-4gjfc
<cut for brevity>
Containers:
  echoserver-hostport:
    Container ID:   containerd://d0b75198afe0612091f412ee7cf7473f26c80660143a96b459b3e699ebaee54c
    Image:          k8s.gcr.io/echoserver:1.10
    Image ID:       k8s.gcr.io/echoserver@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229                                                                                                      Ports:          8080/TCP, 8443/TCP
    Host Ports:     46645/TCP, 49482/TCP
    State:          Running
      Started:      Thu, 12 Jan 2023 18:02:50 +0000
    Ready:          True
    Restart Count:  0
    Environment:
      echoserver-hostport_PORT_8443_TCP_HOSTPORT:  49482
      echoserver-hostport_PORT_8080_TCP_HOSTPORT:  46645

Langkah berikutnya