Pada Kubernetes 1.27 dan versi sebelumnya, pembaruan parameter kontainer selama waktu proses pod memerlukan pengiriman ulang PodSpec, yang memicu penghapusan dan pembuatan ulang pod. ACK memungkinkan Anda mengubah sementara parameter isolasi CPU, memori, dan I/O disk pod yang sedang berjalan melalui file cgroup—tanpa perlu restart.
Fitur ini hanya untuk penyesuaian darurat sementara. Untuk manajemen resource reguler, gunakan CPU Burst, penjadwalan sadar topologi CPU, atau profil resource.
Cara kerja
ACK menggunakan custom resource definition (CRD) kind: Cgroups untuk meneruskan perubahan resource ke ack-koordinator. Saat Anda menerapkan resource Cgroups, koordlet pada node menulis nilai baru langsung ke file cgroup—melewati loop rekonsiliasi scheduler dan kubelet Kubernetes. PodSpec pod tetap tidak berubah; hanya nilai cgroup pada node yang diperbarui.
Gunakan spec.pod untuk menargetkan pod tertentu, atau spec.deployment untuk menargetkan semua pod dalam suatu Deployment.
Prasyarat
Pastikan bahwa:
-
kubectl telah terhubung ke kluster ACK.
-
ack-koordinator versi 0.5.0 atau lebih baru telah diinstal.
Penagihan
ack-koordinator gratis untuk diinstal dan digunakan. Biaya tambahan mungkin berlaku dalam situasi berikut:
-
Resource node pekerja: ack-koordinator adalah add-on tidak terkelola yang mengonsumsi resource pada node pekerja setelah instalasi. Tentukan permintaan resource untuk setiap modul saat menginstal add-on tersebut.
-
Metrik pemantauan Prometheus: Jika Anda mengaktifkan opsi Enable Prometheus monitoring metrics for ACK-Koordinator dan menggunakan Managed Service for Prometheus, metrik tersebut ditagih sebagai metrik kustom. Biaya tergantung pada ukuran kluster dan jumlah aplikasi. Tinjau dokumentasi penagihan instans Prometheus dan gunakan kueri penggunaan untuk memantau konsumsi sebelum mengaktifkan fitur ini.
Batasan
| Kendala | Detail |
|---|---|
| Cakupan | Hanya untuk penyesuaian sementara. Tidak memperbarui PodSpec pod atau dipertahankan setelah restart pod. |
| Versi kluster (memori) | Kluster versi 1.22 atau lebih baru memerlukan ack-koordinator v1.5.0-ack1.14 atau lebih baru. Versi add-on sebelumnya hanya mendukung kluster yang menjalankan versi 1.22 atau lebih lama. |
| Disk I/O | Node pekerja harus menjalankan Alibaba Cloud Linux (Alinux). |
| I/O buffered cgroup v1 | Pada cgroup v1, batasan blkio hanya berlaku untuk I/O langsung. Untuk membatasi I/O buffered, aktifkan fitur writeback cgroup di Alinux. |
| cgroup v2 | Pembatasan kecepatan I/O disk melalui blkio tidak didukung di lingkungan cgroup v2. |
| Batas CPU | Untuk penyesuaian batas CPU sementara, lihat Migrasi dari resource-controller ke ack-koordinator. |
Ubah batas memori
Tingkatkan batas memori pod untuk mencegah OOM kill tanpa me-restart-nya. Contoh ini menaikkan batas dari 1 GiB menjadi 5 GiB.
-
Buat file
pod-demo.yamldengan konten berikut.apiVersion: v1 kind: Pod metadata: name: pod-demo spec: containers: - name: pod-demo image: registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4 resources: requests: cpu: 1 memory: "50Mi" limits: cpu: 1 memory: "1Gi" # Batas memori awal: 1 GiB command: ["stress"] args: ["--vm", "1", "--vm-bytes", "256M", "-c", "2", "--vm-hang", "1"] -
Terapkan pod tersebut.
kubectl apply -f pod-demo.yaml -
Verifikasi batas memori awal. Jalur cgroup dibuat dari UID pod dan ID kontainer.
cat /sys/fs/cgroup/memory/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podaf44b779_41d8_43d5_a0d8_8a7a0b17****.slice/memory.limit_in_bytesOutput yang diharapkan:
10737418241073741824= 1 GiB, sesuai denganspec.containers.resources.limits.memorydalam definisi pod. -
Buat file
cgroups-sample.yamluntuk mengatur batas memori baru.apiVersion: resources.alibabacloud.com/v1alpha1 kind: Cgroups metadata: name: cgroups-sample spec: pod: name: pod-demo namespace: default containers: - name: pod-demo memory: 5Gi # Batas memori baru: 5 GiB -
Terapkan resource Cgroups.
kubectl apply -f cgroups-sample.yaml -
Verifikasi batas memori yang diperbarui.
cat /sys/fs/cgroup/memory/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podaf44b779_41d8_43d5_a0d8_8a7a0b17****.slice/memory.limit_in_bytesOutput yang diharapkan:
53687091205368709120= 5 GiB, sesuai denganspec.pod.containers.memorydalam resource Cgroups. -
Konfirmasi bahwa pod tidak di-restart.
kubectl describe pod pod-demoPastikan tidak ada event restart di bagian
Events—hanya event penjadwalan dan startup awal:Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 36m default-scheduler Successfully assigned default/pod-demo to cn-hangzhou.192.168.0.50 Normal AllocIPSucceed 36m terway-daemon Alloc IP 192.XX.XX.51/24 took 4.490542543s Normal Pulling 36m kubelet Pulling image "registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4" Normal Pulled 36m kubelet Successfully pulled image "registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4" in 2.204s (2.204s including waiting). Image size: 7755078 bytes. Normal Created 36m kubelet Created container pod-demo Normal Started 36m kubelet Started container pod-demoTidak adanya event restart mengonfirmasi bahwa batas memori diperbarui secara langsung.
Ubah cakupan binding core CPU
Bind pod ke core CPU tertentu untuk isolasi resource yang lebih ketat. Contoh ini membatasi pod dari semua 32 core (0–31) menjadi hanya core 2–3.
Untuk binding core CPU persisten di lingkungan produksi, gunakan penjadwalan sadar topologi CPU sebagai gantinya.
-
Buat file
pod-cpuset-demo.yamldengan konten berikut.apiVersion: v1 kind: Pod metadata: name: pod-cpuset-demo spec: containers: - name: pod-cpuset-demo image: registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4 resources: requests: memory: "50Mi" limits: memory: "1000Mi" cpu: 0.5 command: ["stress"] args: ["--vm", "1", "--vm-bytes", "556M", "-c", "2", "--vm-hang", "1"] -
Terapkan pod tersebut.
kubectl apply -f pod-cpuset-demo.yaml -
Periksa binding core CPU saat ini. Jalurnya dibuat dari UID pod dan ID kontainer.
cat /sys/fs/cgroup/cpuset/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podf9b79bee_eb2a_4b67_befe_51c270f8****.slice/cri-containerd-aba883f8b3ae696e99c3a920a578e3649fa957c51522f3fb00ca943dc2c7****.scope/cpuset.cpusOutput yang diharapkan:
0-310-31berarti kontainer dapat menggunakan semua 32 core CPU. -
Buat file
cgroups-sample-cpusetpod.yamluntuk mengatur binding CPU.apiVersion: resources.alibabacloud.com/v1alpha1 kind: Cgroups metadata: name: cgroups-sample-cpusetpod spec: pod: name: pod-cpuset-demo namespace: default containers: - name: pod-cpuset-demo cpuset-cpus: 2-3 # Batasi pod ke core CPU 2 dan 3 -
Terapkan resource Cgroups.
kubectl apply -f cgroups-sample-cpusetpod.yaml -
Verifikasi binding CPU yang diperbarui.
cat /sys/fs/cgroup/cpuset/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podf9b79bee_eb2a_4b67_befe_51c270f8****.slice/cri-containerd-aba883f8b3ae696e99c3a920a578e3649fa957c51522f3fb00ca943dc2c7****.scope/cpuset.cpusOutput yang diharapkan:
2-3Kontainer terikat ke core 2–3, sesuai dengan
spec.pod.containers.cpuset-cpusdalam resource Cgroups. -
Konfirmasi bahwa pod tidak di-restart.
kubectl describe pod pod-cpuset-demoBagian
Eventsmencakup eventCPUSetBinddari koordlet tetapi tidak ada event restart:Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 7m7s default-scheduler Successfully assigned default/pod-cpuset-demo to cn-hangzhou.192.XX.XX.50 Normal AllocIPSucceed 7m5s terway-daemon Alloc IP 192.XX.XX.56/24 took 2.060752512s Normal Pulled 7m5s kubelet Container image "registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4" already present on machine Normal Created 7m5s kubelet Created container pod-cpuset-demo Normal Started 7m5s kubelet Started container pod-cpuset-demo Normal CPUSetBind 84s koordlet set cpuset 2-3 to container pod-cpuset-demo success
Ubah parameter I/O disk
Node pekerja harus menjalankan Alinux. Pada cgroup v1, batasan blkio hanya berlaku untuk I/O langsung. Untuk membatasi I/O buffered, aktifkan fitur writeback cgroup di Alinux. Tidak didukung di cgroup v2.
Contoh ini menerapkan workload fio dan membatasi throughput tulisnya melalui file cgroup.
-
Buat file
fio-demo.yamldengan konten berikut. Direktori host/mntdimount di/datadalam pod, yang dipetakan ke/dev/vda1.apiVersion: apps/v1 kind: Deployment metadata: name: fio-demo labels: app: fio-demo spec: selector: matchLabels: app: fio-demo template: metadata: labels: app: fio-demo spec: containers: - name: fio-demo image: registry.cn-zhangjiakou.aliyuncs.com/acs/fio-for-slo-test:v0.1 command: ["sh", "-c"] # Jalankan uji tulis sekuensial pada I/O disk menggunakan fio args: ["fio -filename=/data/test -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=12000 -group_reporting -name=mytest"] volumeMounts: - name: pvc mountPath: /data volumes: - name: pvc hostPath: path: /mnt -
Terapkan aplikasi tersebut.
kubectl apply -f fio-demo.yaml -
Batasi throughput tulis menggunakan file cgroup.
-
Buat file
cgroups-sample-fio.yamluntuk mengatur batas byte per detik (BPS) tulis pada/dev/vda1.apiVersion: resources.alibabacloud.com/v1alpha1 kind: Cgroups metadata: name: cgroups-sample-fio spec: deployment: name: fio-demo namespace: default containers: - name: fio-demo blkio: # Batas BPS dalam byte per detik (misalnya, 1048576 = 1 MiB/s) device_write_bps: [{device: "/dev/vda1", value: "1048576"}] -
Terapkan resource Cgroups.
kubectl apply -f cgroups-sample-fio.yaml -
Verifikasi batas I/O disk yang diperbarui. Jalurnya dibuat dari UID pod dan ID kontainer.
cat /sys/fs/cgroup/blkio/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod0840adda_bc26_4870_adba_f193cd00****.slice/cri-containerd-9ea6cc97a6de902d941199db2fcda872ddd543485f5f987498e40cd706dc****.scope/blkio.throttle.write_bps_deviceOutput yang diharapkan:
253:0 1048576Batas BPS tulis adalah
1048576(1 MiB/s) untuk perangkat253:0(/dev/vda1). Pod tidak di-restart.
-
-
Untuk melihat data pemantauan disk di Prometheus, buka Konsol dan pilih Operations > Prometheus Monitoring. Di tab Application Monitoring, filter aplikasi contoh tersebut. Lihat Hubungkan dan konfigurasikan Alibaba Cloud Prometheus Monitoring.
Terapkan perubahan di tingkat Deployment
Semua prosedur di atas juga berlaku di tingkat Deployment—gunakan spec.deployment sebagai ganti spec.pod. Contoh ini menerapkan binding core CPU ke suatu Deployment.
-
Buat file
go-demo.yamldengan konten berikut. Deployment ini menjalankan dua replika dengan masing-masing 0,5 CPU.apiVersion: apps/v1 kind: Deployment metadata: name: go-demo labels: app: go-demo spec: replicas: 2 selector: matchLabels: app: go-demo template: metadata: labels: app: go-demo spec: containers: - name: go-demo image: registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4 command: ["stress"] args: ["--vm", "1", "--vm-bytes", "556M", "-c", "1", "--vm-hang", "1"] imagePullPolicy: Always resources: requests: cpu: 0.5 limits: cpu: 0.5 -
Terapkan aplikasi tersebut.
kubectl apply -f go-demo.yaml -
Buat file
cgroups-cpuset-sample.yamluntuk mengikat pod Deployment ke core CPU tertentu.apiVersion: resources.alibabacloud.com/v1alpha1 kind: Cgroups metadata: name: cgroups-cpuset-sample spec: deployment: # Menargetkan Deployment, bukan pod tunggal name: go-demo namespace: default containers: - name: go-demo cpuset-cpus: 2,3 # Ikatan ke core CPU 2 dan 3 -
Terapkan resource Cgroups.
kubectl apply -f cgroups-cpuset-sample.yaml -
Verifikasi binding CPU untuk salah satu pod. Jalurnya dibuat dari UID pod dan ID kontainer.
cat /sys/fs/cgroup/cpuset/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-pod06de7408_346a_4d00_ba25_02833b6c****.slice/cri-containerd-733a0dc93480eb47ac6c5abfade5c22ed41639958e3d304ca1f85959edc3****.scope/cpuset.cpusOutput yang diharapkan:
2-3Kontainer terikat ke core 2–3, sesuai dengan
spec.deployment.containers.cpuset-cpusdalam resource Cgroups.
Langkah selanjutnya
-
CPU Burst: Kontainer mengumpulkan time slice CPU yang tidak terpakai dan menggunakannya selama lonjakan traffic, sehingga mengurangi latensi dan meningkatkan kualitas layanan. Lihat Aktifkan kebijakan CPU Burst.
-
Penjadwalan sadar topologi CPU: Pin pod ke core CPU tertentu saat penjadwalan untuk menghilangkan overhead context-switching CPU dan akses memori lintas-NUMA. Lihat Aktifkan penjadwalan sadar topologi CPU.
-
Overselling resource dinamis: Reklaim resource yang dialokasikan namun tidak digunakan dan jadikan tersedia untuk workload prioritas lebih rendah. Gabungkan dengan kebijakan QoS single-node untuk menghindari gangguan performa antar aplikasi. Lihat Aktifkan overselling resource dinamis.
-
Profil resource: Analisis data penggunaan historis untuk mendapatkan rekomendasi right-sizing terhadap request dan limit kontainer. Lihat Profil resource.