Untuk sementara mengubah parameter kontainer pada pod yang sedang berjalan di kluster Kubernetes versi 1.27 atau lebih lama, Anda perlu memperbarui parameter PodSpec dan menerapkan perubahan tersebut. Pod akan dihapus dan dibuat ulang. Fitur dari Container Service for Kubernetes (ACK) memungkinkan Anda menggunakan file konfigurasi cgroup untuk menyesuaikan parameter CPU, memori, dan batas IOPS disk tanpa me-restart pod.
Fitur ini cocok untuk skenario penyesuaian sementara. Misalnya, jika penggunaan memori pod meningkat, Anda dapat meningkatkan batas memori untuk menghindari pemicu out of memory (OOM) killer. Untuk operasi O&M umum, kami merekomendasikan penggunaan fitur terkait yang disediakan oleh ACK. Informasi lebih lanjut dapat ditemukan di Aktifkan CPU Burst, Aktifkan penjadwalan CPU dengan kesadaran topologi, dan Profil sumber daya.
Prasyarat
Klien kubectl harus terhubung ke kluster ACK. Lihat Dapatkan file kubeconfig kluster dan gunakan kubectl untuk terhubung ke kluster untuk informasi lebih lanjut.
Komponen ack-koordinator versi 0.5.0 atau lebih baru harus diinstal. Lihat ack-koordinator (sebelumnya dikenal sebagai ack-slo-manager) untuk detail lebih lanjut.
Penagihan
Tidak ada biaya saat menginstal atau menggunakan komponen ack-koordinator. Namun, biaya mungkin berlaku dalam skenario berikut:
ack-koordinator adalah komponen non-managed yang mengonsumsi sumber daya node pekerja setelah diinstal. Anda dapat menentukan jumlah sumber daya yang diminta oleh setiap modul selama instalasi.
Secara default, ack-koordinator mengekspos metrik pemantauan fitur seperti profil sumber daya dan penjadwalan granular sebagai metrik Prometheus. Jika Anda mengaktifkan metrik Prometheus untuk ack-koordinator dan menggunakan Managed Service for Prometheus, metrik ini dianggap sebagai metrik kustom, dan biaya akan dikenakan. Biaya bergantung pada ukuran kluster dan jumlah aplikasi. Sebelum mengaktifkan metrik Prometheus, lihat Penagihan dari Managed Service for Prometheus untuk mempelajari kuota gratis dan aturan penagihan metrik kustom. Untuk informasi lebih lanjut tentang cara memantau penggunaan sumber daya, lihat Kueri jumlah data observabel dan tagihan.
Memodifikasi Batas Memori
Jika penggunaan memori pod meningkat, Anda dapat menggunakan file konfigurasi cgroup untuk secara dinamis mengubah batas memori pod guna menghindari pemicu OOM killer. Contoh ini mencakup pembuatan kontainer dengan batas memori awal 1 GB untuk memverifikasi bahwa batas memori dapat diubah tanpa me-restart pod.
Untuk kluster yang menjalankan Kubernetes 1.22 atau lebih baru, pastikan versi komponen ack-koordinator adalah v1.5.0-ack1.14 atau lebih baru. Versi lain hanya mendukung kluster Kubernetes 1.22 atau lebih lama.
Untuk mengubah batas CPU secara umum, kami merekomendasikan penggunaan fitur CPU Burst, yang secara otomatis menyesuaikan batas CPU pod. Lihat Aktifkan CPU Burst. Untuk penyesuaian sementara, ikuti langkah-langkah di Tingkatkan dari resource-controller ke ack-koordinator.
Buat file pod-demo.yaml dengan template YAML 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" # Setel batas memori kontainer menjadi 1 GB. command: ["stress"] args: ["--vm", "1", "--vm-bytes", "256M", "-c", "2", "--vm-hang", "1"]Jalankan perintah berikut untuk menerapkan aplikasi pod-demo di kluster:
kubectl apply -f pod-demo.yamlJalankan perintah berikut untuk menanyakan batas memori asli kontainer:
# Jalur aktual terdiri 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:
# Dalam contoh ini, 1073741824 dikembalikan, yang merupakan hasil dari 1 × 1024 × 1024 × 1024. Ini menunjukkan bahwa batas memori asli kontainer adalah 1 GB. 1073741824Output menunjukkan bahwa batas memori asli kontainer adalah 1 GB, sesuai dengan nilai parameter
spec.containers.resources.limits.memorydi file YAML yang dibuat di Langkah 1.Gunakan template YAML berikut untuk menentukan batas memori kontainer dan buat file cgroups-sample.yaml:
apiVersion: resources.alibabacloud.com/v1alpha1 kind: Cgroups metadata: name: cgroups-sample spec: pod: name: pod-demo namespace: default containers: - name: pod-demo memory: 5Gi # Ubah batas memori pod menjadi 5 GB.Jalankan perintah berikut untuk menerapkan file cgroups-sample.yaml di kluster:
kubectl apply -f cgroups-sample.yamlJalankan perintah berikut untuk menanyakan batas memori baru kontainer setelah perubahan diterapkan:
# Jalur spesifik dapat diperoleh berdasarkan UID pod. cat /sys/fs/cgroup/memory/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podaf44b779_41d8_43d5_a0d8_8a7a0b17****.slice/memory.limit_in_bytesOutput yang diharapkan:
# Dalam contoh ini, 5368709120 dikembalikan, yang merupakan hasil dari 5 × 1024 × 1024 × 1024. Ini menunjukkan bahwa batas memori baru kontainer adalah 5 GB. 5368709120Output menunjukkan bahwa batas memori kontainer adalah 5 GB, sesuai dengan nilai parameter
spec.pod.containers.memorydi file YAML yang dibuat di Langkah 4. Modifikasi berhasil.Jalankan perintah berikut untuk menanyakan status pod:
kubectl describe pod pod-demoOutput yang diharapkan:
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-demoOutput menunjukkan bahwa pod berjalan normal tanpa acara restart.
Mengubah vCore yang Terikat pada Pod
Untuk aplikasi yang memerlukan performa CPU tinggi dan isolasi sumber daya yang lebih baik, Anda dapat mengubah vCore yang terikat ke pod serta menentukan nomor seri vCore yang dapat digunakan oleh pod.
Contoh ini mencakup pembuatan pod tanpa vCore terikat untuk memverifikasi bahwa vCore dapat diubah menggunakan file konfigurasi cgroup tanpa me-restart pod.
Dalam kasus umum, kami merekomendasikan Anda menggunakan penjadwalan CPU dengan kesadaran topologi untuk mengelola sumber daya CPU untuk beban kerja sensitif CPU. Untuk informasi lebih lanjut, lihat Aktifkan penjadwalan CPU dengan kesadaran topologi.
Buat file pod-cpuset-demo.yaml dengan template YAML 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"]Jalankan perintah berikut untuk menerapkan file pod-cpuset-demo.yaml di kluster:
kubectl apply -f pod-cpuset-demo.yamlJalankan perintah berikut untuk menanyakan vCore yang terikat ke kontainer:
# Jalur aktual terdiri 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-31Output menunjukkan bahwa nomor seri vCore yang dapat digunakan oleh kontainer berkisar antara 0 hingga 31 sebelum Anda mengikat vCore ke kontainer.
Gunakan template YAML berikut untuk menentukan vCore dan buat file cgroups-sample-cpusetpod.yaml:
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 # Ikat vCore 2 dan vCore 3 ke pod.Jalankan perintah berikut untuk menerapkan file cgroups-sample-cpusetpod.yaml di kluster:
kubectl apply -f cgroups-sample-cpusetpod.yamlJalankan perintah berikut untuk menanyakan vCore yang terikat ke kontainer setelah perubahan diterapkan:
# Jalur aktual terdiri 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:
2-3Output menunjukkan bahwa vCore 2 dan vCore 3 terikat ke kontainer, sesuai dengan nilai parameter
spec.pod.containers.cpuset-cpusdi file YAML yang dibuat di Langkah 4. Modifikasi berhasil.Jalankan perintah berikut untuk menanyakan status pod:
kubectl describe pod pod-cpuset-demoOutput yang diharapkan:
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 successOutput menunjukkan bahwa pod berjalan normal tanpa acara restart.
Memodifikasi Disk IOPS
Untuk mengubah disk IOPS pod, gunakan Alibaba Cloud Linux sebagai sistem operasi node pekerja yang ingin Anda kelola.
Contoh ini mencakup pembuatan aplikasi intensif-I/O untuk memverifikasi bahwa disk IOPS pod dapat diubah menggunakan file konfigurasi cgroup tanpa me-restart pod.
Jika Anda menentukan batas blkio di cgroup v1, kernel OS hanya membatasi I/O langsung pod. Kernel OS tidak membatasi I/O buffer pod. Untuk membatasi I/O buffer pod, gunakan cgroup v2 atau aktifkan fitur cgroup writeback untuk Alibaba Cloud Linux. Lihat Aktifkan fitur cgroup writeback untuk informasi lebih lanjut.
Buat aplikasi intensif-I/O dengan template YAML berikut:
Mount direktori host /mnt ke pod. Nama perangkat disk yang sesuai adalah /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"] # Gunakan Fio untuk melakukan uji stres tulis pada disk. 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 # Volume disk dimount ke path /data. volumes: - name: pvc hostPath: path: /mntJalankan perintah berikut untuk menerapkan Deployment fio-demo di kluster:
kubectl apply -f fio-demo.yamlBuat file konfigurasi cgroup yang digunakan untuk mengontrol disk IOPS guna membatasi throughput pod.
Gunakan file YAML berikut untuk menentukan batas byte per detik (BPS) perangkat /dev/vda1 dan buat file bernama cgroups-sample-fio.yaml:
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 I/O dalam bit/detik. Contoh: 1048576, 2097152, atau 3145728. device_write_bps: [{device: "/dev/vda1", value: "1048576"}]Jalankan perintah berikut untuk menanyakan batas disk IOPS setelah perubahan diterapkan:
# Jalur aktual terdiri 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 1048576Output menunjukkan bahwa batas IOPS disk adalah
1048576bit/detik.
Lihat data pemantauan node.


Gambar-gambar menunjukkan bahwa BPS kontainer sama dengan nilai yang ditentukan dalam parameter
device_write_bpsfile YAML yang dibuat di Langkah 3. Pod tidak direstart setelah perubahan diterapkan.CatatanUntuk informasi lebih lanjut tentang cara mengaktifkan Managed Service for Prometheus, lihat Gunakan Managed Service for Prometheus. Di panel navigasi kiri, pilih Operations > Prometheus Monitoring. Klik tab Application Monitoring untuk melihat data disk.
Ubah parameter sumber daya level Deployment pod secara dinamis
Pengubahan parameter sumber daya level pod yang dinamis juga berlaku untuk parameter level Deployment. Parameter sumber daya level pod diubah menggunakan bidang spec.pod di file konfigurasi cgroup, sedangkan parameter level Deployment diubah menggunakan bidang spec.deployment. Contoh berikut menjelaskan cara mengubah vCore dalam Deployment. Operasi di skenario lain serupa.
Buat file go-demo.yaml dengan template YAML berikut:
Deployment membuat dua pod yang menjalankan program uji stres. Setiap pod meminta 0.5 vCore.
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: polinux/stress command: ["stress"] args: ["--vm", "1", "--vm-bytes", "556M", "-c", "1", "--vm-hang", "1"] imagePullPolicy: Always resources: requests: cpu: 0.5 limits: cpu: 0.5Jalankan perintah berikut untuk menerapkan Deployment go-demo di kluster:
kubectl apply -f go-demo.yamlGunakan template YAML berikut untuk menentukan informasi pengikatan CPU dan buat file bernama cgroups-cpuset-sample.yaml:
apiVersion: resources.alibabacloud.com/v1alpha1 kind: Cgroups metadata: name: cgroups-cpuset-sample spec: deployment: # Ini adalah Deployment. name: go-demo namespace: default containers: - name: go-demo cpuset-cpus: 2,3 # Ikat vCore 2 dan vCore 3 ke pod.Jalankan perintah berikut untuk menerapkan Deployment cgroups-cpuset-sample di kluster:
kubectl apply -f cgroups-cpuset-sample.yamlJalankan perintah berikut untuk menanyakan vCore yang terikat ke kontainer setelah perubahan diterapkan:
# Jalur aktual terdiri 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-3Output menunjukkan bahwa vCore 2 dan vCore 3 terikat ke kontainer, sesuai dengan nilai parameter
spec.deployment.containers.cpuset-cpusdi file konfigurasi cgroup.