Pengerasan Node (pratinjau) di Azure Kubernetes Service (AKS)

Node Hardening adalah fitur opsional untuk kumpulan simpul Linux yang melindungi stabilitas simpul saat beban kerja memberikan tekanan pada simpul dalam hal CPU, memori, atau disk. Saat Anda mengaktifkan Node Hardening pada kluster, AKS mengubah cara setiap node mencadangkan dan memberlakukan sumber daya untuk komponen Kubernetes dan layanan host, dan bagaimana kubelet mengusir pod ketika sumber daya menipis.

Artikel ini menjelaskan perubahan apa saja pada Node Hardening, membandingkan default yang diperkeras dengan default AKS standar, dan menunjukkan kepada Anda cara mengaktifkan, memverifikasi, menyesuaikan, dan menonaktifkan fitur.

Important

Fitur pratinjau AKS tersedia atas dasar layanan mandiri dan pendaftaran sukarela. Pratinjau disediakan "apa adanya" dan "sebagaimana tersedia," dan pratinjau tersebut dikecualikan dari perjanjian tingkat layanan (SLA) serta garansi terbatas. Fitur pratinjau AKS sebagian didukung oleh dukungan pelanggan sebatas upaya terbaik. Dengan demikian, fitur-fitur ini tidak dimaksudkan untuk penggunaan produksi. Untuk informasi lebih lanjut, lihat artikel dukungan berikut ini:

Manfaat Pengerasan Node

Pada simpul yang sibuk atau bursty, beban kerja dapat menggunakan sumber daya yang dibutuhkan kubelet, runtime kontainer, dan layanan host. Ketika itu terjadi, simpul dapat menjadi tidak responsif, melaporkan status NotReady, atau mengakhiri pod secara tiba-tiba. Pengerasan Node mengurangi risiko ini dengan cara berikut:

  • Reservasi yang diberlakukan: Secara default, AKS menggunakan nilai kube-reserved hanya untuk menghitung berapa banyak kapasitas yang dapat dialokasikan oleh penjadwal ke pod. Dengan menggunakan Node Hardening, kubelet juga memberlakukan kapasitas kube-reserved dan system-reserved melalui grup kontrol Linux (cgroup). Kubelet dan containerd berjalan dalam cgroup khusus kubereserved.slice, sehingga mereka tetap mempertahankan jatah CPU dan memori yang dicadangkan bahkan ketika pod membebani node hingga kapasitas penuh.
  • Kapasitas khusus untuk layanan host: Hardening Node menambahkan alokasi yang dicadangkan sistem untuk layanan sistem operasi host, yang berjalan di node system.slice.
  • Cadangan memori lebih besar: Ambang penggusuran paksa untuk memori yang tersedia bertambah sesuai dengan memori node, sehingga kubelet mengeluarkan pod sebelum memori node menjadi sangat rendah.
  • Penggusuran graceful: Ambang penggusuran lunak memungkinkan kubelet menggusur pod secara graceful, dengan masa tenggang penghentian, ketika memori atau ruang disk hampir habis. Eviksi paksa, yang segera mengakhiri pod, lalu digunakan sebagai pilihan terakhir.
  • Reservasi yang diskalakan dengan kepadatan pod: Perhitungan memori yang dicadangkan kube meningkat seiring dengan jumlah maksimum pod per simpul, yang memperhitungkan overhead kubelet dan containerd untuk menjalankan lebih banyak pod.

Apa yang berubah saat Anda mengaktifkan Node Hardening

Tabel berikut membandingkan default standar untuk node Linux yang menjalankan Kubernetes 1.29 atau yang lebih baru dengan default yang diterapkan AKS saat Node Hardening diaktifkan.

Reservasi sumber daya

Setting Tanpa hardening node Dengan Hardening Node
CPU yang direservasi untuk Kube Berdasarkan jumlah inti CPU. Untuk informasi selengkapnya, lihat pemesanan CPU. Tidak diubah
Memori yang direservasi untuk Kube min(20 × maxPods + 50, 25% of node memory) MiB min(35 × maxPods + max(250, 2% of node memory), 25% of node memory) MiB
ID proses (PID) yang dicadangkan untuk Kube 1000 Tidak dipesan
CPU yang dialokasikan untuk sistem None 100m
Memori yang dicadangkan sistem None 200 MiB, ditambah 100 MiB untuk setiap memori node 32 GiB penuh, ditambah 100 MiB untuk kluster yang menggunakan Azure CNI
Penyimpanan sementara yang dicadangkan oleh sistem None 1Gi

Ambang penggusuran

Setting Tanpa Node Hardening Dengan hardening Node
Penggusuran paksa: memory.available 100Mi 250Mi untuk simpul dengan memori 8 GiB atau kurang, 375Mi untuk simpul dengan lebih dari 8 GiB dan kurang dari 32 GiB, dan 512Mi untuk simpul dengan 32 GiB atau lebih
Eviksi paksa: nodefs.available dan nodefs.inodesFree 10% dan 5% Tidak diubah
Eviksi paksa: pid.available 2000 Belum diatur
Eviksi lunak: memory.available None 500Mi, 750Mi, atau 1Gi, menggunakan tingkat memori node yang sama dengan eviksi paksa, dengan masa tenggang 30 detik
eviksi lunak: nodefs.available dan nodefs.inodesFree None 12% dan 7%, masing-masing dengan masa tenggang 2 menit
Masa tenggang penghentian pod maksimum selama eviksi lunak Belum diatur 60 detik

Penegakan Cgroup

Setting Tanpa hardening Node Dengan Hardening Node
Alokasi simpul yang diterapkan pods pods, kube-reserved, dan system-reserved
Kubelet dan cgroup containerd system.slice, tanpa batasan kubereserved.slice, dengan memori terbatas pada memori yang dicadangkan kube dan berbagi CPU yang proporsional dengan CPU yang dicadangkan kube
grup kontrol (cgroup) layanan host system.slice, tanpa batasan system.slice, dengan memori terbatas pada memori yang dicadangkan sistem dan porsi CPU yang sebanding dengan CPU yang dicadangkan sistem

Karena Node Hardening mencadangkan lebih banyak kapasitas, simpul melaporkan kapasitas yang kurang dapat dialokasikan untuk pod. Misalnya, pada node dengan 4 vCPU dan memori 16 GiB yang menggunakan Azure CNI, mengaktifkan Node Hardening mengurangi kapasitas yang dapat dialokasikan sebagai berikut:

  • Dengan maksimum default 250 pod per node, secara default dibutuhkan sekitar 570 MiB memori, 100 millicore CPU, dan 1 GiB penyimpanan efemeral.
  • Dengan maksimum 30 pod per simpul, sekitar 1,3 GiB memori, 100 milicore CPU, dan 1 GiB penyimpanan ephemeral.

Ambang eviction lunak tidak mengurangi kapasitas yang dapat dialokasikan. Mereka hanya berubah ketika kubelet mulai mengusir pod.

Considerations

Ingatlah pertimbangan berikut sebelum Anda mengaktifkan Node Hardening:

  • Anda mengaktifkan Node Hardening di tingkat kluster, dan ini berlaku untuk semua kumpulan simpul Linux di kluster. Anda tidak dapat mengaktifkannya untuk kumpulan simpul individual, dan itu tidak memengaruhi kumpulan simpul Windows.
  • Node melaporkan kapasitas yang kurang dapat dialokasikan, sehingga pod yang pas pada node sebelum Anda mengaktifkan Node Hardening mungkin tidak pas setelahnya. Tinjau permintaan sumber daya pod dan ukuran kumpulan simpul Anda.
  • Layanan host di system.slice berbagi batas memori keras yang sama dengan memori yang dicadangkan sistem. Jika Anda menjalankan agen Anda sendiri pada simpul sebagai layanan systemd, seperti agen keamanan, pemantauan, atau penerusan log, agen tersebut diperhitungkan dalam batas ini. Validasi penggunaan memori mereka dan stabilitasnya sebelum Anda menggunakan Node Hardening dalam produksi.
  • Nilai yang Anda tetapkan dalam konfigurasi kubelet kustom kumpulan simpul akan menggantikan nilai default Node Hardening yang sesuai. Untuk informasi selengkapnya, lihat Menyesuaikan pengaturan Node Hardening.
  • Jika Anda menonaktifkan Node Hardening nanti, pool node yang ada tetap menyimpan setelan soft eviction yang diperkeras, bahkan setelah node-nya di-image ulang. Untuk menghapus pengaturan ini, Anda perlu membuat pool node baru. Untuk informasi selengkapnya, lihat Menonaktifkan Penguatan Keamanan Node.
  • Nilai default mungkin berubah saat fitur dalam pratinjau. Mulailah dengan kluster nonproduksi, dan validasi beban kerja Anda dalam kondisi tekanan simpul yang representatif.

Prerequisites

  • Sebuah langganan Azure. Jika Anda tidak memilikinya, buat akun gratis.
  • Kluster AKS dengan kumpulan simpul Linux, atau izin untuk membuatnya.
  • Ekstensi aks-preview Azure CLI dan CustomNodeConfigPreview bendera fitur yang dijelaskan di bagian berikut.

Memasang ekstensi aks-preview Azure CLI

  1. Instal ekstensi menggunakan perintah az extension add.

    az extension add --name aks-preview
    
  2. Perbarui ke versi terbaru ekstensi dengan menggunakan perintah az extension update.

    az extension update --name aks-preview
    

Daftarkan CustomNodeConfigPreview penanda fitur

  1. Daftarkan CustomNodeConfigPreview bendera fitur dengan menggunakan az feature register perintah .

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

    Dibutuhkan beberapa menit agar status menampilkan Terdaftar.

  2. Verifikasi status pendaftaran dengan menggunakan az feature show perintah .

    az feature show --namespace "Microsoft.ContainerService" --name "CustomNodeConfigPreview"
    
  3. Saat status menunjukkan Terdaftar, segarkan pendaftaran penyedia sumber daya Microsoft.ContainerService dengan menggunakan perintah az provider register.

    az provider register --namespace "Microsoft.ContainerService"
    

Aktifkan Pengamanan Node

Selama pratinjau, Node Hardening tidak diaktifkan secara default.

Mengaktifkan Node Hardening pada kluster baru

Buat kluster dengan Node Hardening diaktifkan dengan menggunakan perintah az aks create dengan parameter --enable-node-hardening.

Perintah ini memerlukan aks-preview ekstensi dan CustomNodeConfigPreview bendera fitur. Untuk informasi selengkapnya, lihat Prasyarat.

az aks create \
    --resource-group <resource-group-name> \
    --name <cluster-name> \
    --enable-node-hardening \
    --generate-ssh-keys

Untuk mengonfirmasi perubahan, lihat Memverifikasi pengaturan hardening node.

Aktifkan hardening node pada kluster yang ada

Aktifkan Pengerasan Node pada kluster yang ada dengan menggunakan perintah az aks update dengan parameter --enable-node-hardening.

Perintah ini memerlukan ekstensi aks-preview dan flag fitur CustomNodeConfigPreview. Untuk informasi selengkapnya, lihat Prasyarat.

az aks update \
    --resource-group <resource-group-name> \
    --name <cluster-name> \
    --enable-node-hardening

Untuk mengonfirmasi perubahan, lihat Verifikasi setelan hardening node.

Verifikasi pengaturan Hardening Node

  1. Dapatkan kredensial untuk kluster Anda dengan menggunakan perintah az aks get-credentials.

    az aks get-credentials --resource-group <resource-group-name> --name <cluster-name>
    
  2. Tinjau pengaturan reservasi dan eviction kubelet yang efektif pada simpul dengan mengkueri titik akhir konfigurasi kubelet.

    kubectl get --raw "/api/v1/nodes/<node-name>/proxy/configz" | jq '.kubeletconfig | {kubeReserved, systemReserved, evictionHard, evictionSoft, evictionSoftGracePeriod, evictionMaxPodGracePeriod, enforceNodeAllocatable}'
    

    Pada node yang dikeraskan, systemReserved dan evictionSoft berisi nilai, serta enforceNodeAllocatable menyertakan kube-reserved dan system-reserved.

  3. Bandingkan kapasitas node dengan sumber daya yang dapat dialokasikan.

    kubectl get node <node-name> -o jsonpath='{.status.capacity}{"\n"}{.status.allocatable}{"\n"}'
    

    Pada node yang diperkeras, CPU yang dapat dialokasikan, memori, dan penyimpanan ephemeral lebih rendah dari kapasitas. Perbedaannya sama dengan nilai yang dicadangkan kube dan dicadangkan sistem dalam Reservasi resource, ditambah ambang eviction keras dalam Ambang eviction. Misalnya, pada simpul dengan 4 vCPU dan memori 16 GiB yang menggunakan CNI Azure, CPU yang dapat dialokasikan adalah 240 milikore lebih rendah dari kapasitas: 140 milikore CPU cadangan kube dan 100 milikore CPU yang dicadangkan untuk sistem.

Sesuaikan pengaturan hardening node

Anda dapat mengambil alih default kube-reserved dan eviction untuk kumpulan simpul Linux dengan menggunakan konfigurasi kubelet kustom. Pengaturan ini memerlukan CustomNodeConfigPreview flag fitur. Anda dapat menggunakannya apakah Node Hardening diaktifkan pada kluster atau tidak. AKS mengelola nilai yang dicadangkan sistem dan penerapan cgroup, dan Anda tidak dapat menyesuaikannya.

Setiap pengaturan mengambil alih baris dalam tabel reservasi Sumber Daya atau ambang penggusuran. Baris yang dicadangkan untuk Kube sesuai dengan pengaturan kubeReserved. Baris hard eviction sesuai dengan pengaturan hardEvictionThreshold. Baris soft eviction sesuai dengan pengaturan softEvictionThreshold dan softEvictionGracePeriod. Masa tenggang penghentian pod maksimum sesuai dengan evictionMaxPodGracePeriodInSeconds.

Anda dapat mengonfigurasi pengaturan berikut:

Setting Overrides Description
kubeReserved.cpuMillicores CPU yang dicadangkan Kube CPU yang dicadangkan untuk daemon sistem Kubernetes, dalam milikore.
kubeReserved.memoryMB Memori yang dicadangkan untuk Kube Memori yang dicadangkan untuk daemon sistem Kubernetes, di MiB.
hardEvictionThreshold.memoryAvailable Penggusuran paksa: memory.available Ambang eviksi keras untuk memori yang tersedia.
hardEvictionThreshold.nodeFsAvailable Penggusuran paksa: nodefs.available Ambang penggusuran keras untuk ruang sistem file simpul yang tersedia.
hardEvictionThreshold.nodeFsInodesFree Penggusuran paksa: nodefs.inodesFree Ambang eviksi keras untuk inode sistem berkas node yang tersedia.
softEvictionThreshold.memoryAvailable Eviksi lunak: memory.available Ambang penggusuran lunak untuk memori yang tersedia.
softEvictionThreshold.nodeFsAvailable Pengusiran lunak: nodefs.available Ambang penggusuran lunak untuk ruang sistem berkas node yang tersedia.
softEvictionThreshold.nodeFsInodesFree Soft eviction: nodefs.inodesFree Ambang penggusuran lunak untuk inode sistem berkas node yang tersedia.
softEvictionGracePeriod.memoryAvailable eviksi lunak: memory.available masa tenggang Berapa lama memori yang tersedia harus berada di bawah ambang batas lunaknya sebelum kubelet mengeluarkan pod.
softEvictionGracePeriod.nodeFsAvailable Penggusuran sementara: nodefs.available masa tenggang Berapa lama ruang sistem file simpul yang tersedia harus tetap berada di bawah ambang batas lunaknya sebelum kubelet mengeluarkan pod.
softEvictionGracePeriod.nodeFsInodesFree soft eviction: nodefs.inodesFree masa tenggang Lamanya inode bebas pada sistem file node harus tetap berada di bawah ambang batas lunaknya sebelum kubelet mengeluarkan pod.
evictionMaxPodGracePeriodInSeconds Masa tenggang maksimum penghentian pod saat eviction lunak Jumlah detik maksimum yang diizinkan kubelet agar pod dihentikan selama eviksi lunak.
  • Untuk nilai, minimum, dan aturan validasi yang diizinkan untuk setiap pengaturan, lihat Parameter konfigurasi simpul kustom untuk AKS.
  • Untuk setiap sinyal eviksi, atur ambang batas eviksi lunak dan masa tenggang yang sesuai, dan pastikan setiap ambang eviksi lunak lebih besar dari ambang eviksi keras untuk sinyal yang sama.
  1. Buat file konfigurasi kubelet, seperti nodehardening-kubelet.json, dengan pengaturan yang ingin Anda kustomisasi. Contoh berikut menetapkan setiap nilai yang dapat dikonfigurasi. Ini menetapkan kube-reserved ke 200 miicore CPU dan 1.024 MiB memori. Ini menetapkan ambang penggusuran keras untuk 512Mi memori yang tersedia, 10% ruang sistem file yang tersedia, dan 5% inode bebas. Ini mengatur ambang eviction lunak dari 1Gi, 12%, dan 7% dengan masa tenggang 30 detik, 2 menit, dan 2 menit. Ini juga menetapkan masa tenggang penghentian pod maksimum 60 detik.

    {
      "kubeReserved": {
        "cpuMillicores": 200,
        "memoryMB": 1024
      },
      "hardEvictionThreshold": {
        "memoryAvailable": "512Mi",
        "nodeFsAvailable": "10%",
        "nodeFsInodesFree": "5%"
      },
      "softEvictionThreshold": {
        "memoryAvailable": "1Gi",
        "nodeFsAvailable": "12%",
        "nodeFsInodesFree": "7%"
      },
      "softEvictionGracePeriod": {
        "memoryAvailable": "30s",
        "nodeFsAvailable": "2m",
        "nodeFsInodesFree": "2m"
      },
      "evictionMaxPodGracePeriodInSeconds": 60
    }
    
  2. Buat kumpulan simpul Linux yang menggunakan file konfigurasi dengan menggunakan perintah az aks nodepool add dengan parameter --kubelet-config.

    az aks nodepool add \
        --resource-group <resource-group-name> \
        --cluster-name <cluster-name> \
        --name <node-pool-name> \
        --kubelet-config ./nodehardening-kubelet.json
    

    Anda juga dapat menggunakan parameter --kubelet-config dengan perintah az aks create untuk menerapkan konfigurasi ke kumpulan simpul awal kluster.

Nonaktifkan Hardening Node

Nonaktifkan Node Hardening dengan menggunakan perintah az aks update dengan parameter --disable-node-hardening.

Perintah ini memerlukan aks-preview ekstensi dan CustomNodeConfigPreview bendera fitur. Untuk informasi selengkapnya, lihat Prasyarat.

az aks update \
    --resource-group <resource-group-name> \
    --name <cluster-name> \
    --disable-node-hardening

Menonaktifkan Node Hardening menonaktifkan pengaturan tingkat kluster, tetapi tidak segera mengubah node yang ada. Simpul yang ada menyimpan semua pengaturan yang diperkuat hingga di-reimage, misalnya, selama upgrade image node. Setelah node di-image ulang, perubahan berikut berlaku:

  • Dikembalikan ke default standar AKS: Sumber daya yang dicadangkan kube dan dicadangkan sistem, ambang penggusuran ketat, dan penegakan cgroup. Kapasitas node yang dapat dialokasikan meningkat sesuai dengan itu.
  • Dipertahankan: Ambang batas eviksi lunak, masa tenggang eviksi lunak, dan masa tenggang penghentian pod maksimum selama eviksi lunak.

Anda dapat mengatur konfigurasi kubelet kustom hanya saat membuat kluster atau kumpulan simpul, sehingga Anda tidak dapat menghapus setelan soft eviction yang dipertahankan dari kumpulan simpul yang ada. Untuk menghapusnya, buat kumpulan simpul baru yang secara eksplisit meniadakan setelan tersebut, pindahkan beban kerja Anda ke kumpulan simpul baru, lalu hapus kumpulan simpul lama.

  1. Buat file konfigurasi kubelet, seperti remove-soft-eviction.json. Contoh berikut menetapkan setiap ambang batas soft eviction dan masa tenggang ke string kosong, yang menonaktifkan soft eviction untuk sinyal tersebut. Ini juga mengatur masa tenggang penghentian pod maksimum ke 0, yang merupakan default AKS standar.

    {
      "softEvictionThreshold": {
        "memoryAvailable": "",
        "nodeFsAvailable": "",
        "nodeFsInodesFree": ""
      },
      "softEvictionGracePeriod": {
        "memoryAvailable": "",
        "nodeFsAvailable": "",
        "nodeFsInodesFree": ""
      },
      "evictionMaxPodGracePeriodInSeconds": 0
    }
    
  2. Buat kumpulan simpul Linux yang menggunakan file konfigurasi dengan menggunakan perintah az aks nodepool add dengan parameter --kubelet-config.

    az aks nodepool add \
        --resource-group <resource-group-name> \
        --cluster-name <cluster-name> \
        --name <node-pool-name> \
        --kubelet-config ./remove-soft-eviction.json
    
  3. Pindahkan beban kerja Anda ke kumpulan simpul baru, lalu hapus kumpulan simpul lama. Untuk informasi selengkapnya, lihat Mengubah ukuran kumpulan simpul di AKS.

Untuk mengonfirmasi pengaturan pada node, lihat Memverifikasi pengaturan hardening node. Pada node di pool node baru, evictionSoft kosong.