Pada Kubernetes 1.27 dan versi sebelumnya, Anda hanya dapat mengubah parameter kontainer untuk pod yang sedang berjalan dengan memperbarui PodSpec dan mengirim ulang, yang akan menghapus lalu membuat ulang pod tersebut. ACK menyediakan fitur yang memungkinkan Anda mengubah secara dinamis parameter resource pod menggunakan file Cgroups. Fitur ini memungkinkan Anda mengubah sementara parameter isolasi CPU, memori, dan I/O disk pod pada satu mesin tanpa me-restart pod.
Fitur ini hanya ditujukan untuk penyesuaian sementara. Misalnya, jika penggunaan memori pod meningkat secara bertahap, Anda dapat menaikkan batas memori pod tanpa me-restart-nya untuk menghindari pemicuan out of memory (OOM) killer. Untuk operasi O&M rutin dan formal, kami merekomendasikan penggunaan fitur-fitur berikut: Aktifkan kebijakan optimasi performa CPU Burst, Aktifkan penjadwalan sadar topologi CPU, dan Profilisasi resource.
Prasyarat
-
Klien kubectl telah terhubung ke kluster ACK. Untuk informasi selengkapnya, lihat Hubungkan ke kluster ACK menggunakan kubectl.
-
Anda telah menginstal komponen ack-koordinator versi 0.5.0 atau lebih baru. Untuk informasi selengkapnya, lihat ack-koordinator (ack-slo-manager).
Ubah batas memori
Jika penggunaan memori pod meningkat, Anda dapat mengubah sementara dan dinamis batas memori kontainer menggunakan file Cgroups untuk mencegah pemicuan OOM killer. Contoh ini membuat kontainer dengan batas memori awal 1 GB. Kemudian memverifikasi bahwa Anda berhasil mengubah batas memori kontainer menggunakan Cgroups tanpa me-restart pod.
Jika Anda menggunakan fitur ini di kluster versi 1.22 atau lebih baru, pastikan versi komponen ack-koordinator adalah v1.5.0-ack1.14 atau lebih baru. Versi komponen lain hanya mendukung kluster versi 1.22 atau lebih lama.
Untuk penyesuaian rutin batas CPU, Anda dapat menggunakan kebijakan CPU Burst untuk menyesuaikan elastisitas resource CPU pod secara otomatis. Untuk informasi selengkapnya, lihat Aktifkan kebijakan CPU Burst. Jika Anda tetap perlu menyesuaikan sementara batas CPU, lihat prosedur di Migrasi dari resource-controller ke ack-koordinator.
-
Buat file bernama pod-demo.yaml dengan 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" # The memory limit of the container is 1 GB. command: ["stress"] args: ["--vm", "1", "--vm-bytes", "256M", "-c", "2", "--vm-hang", "1"] -
Jalankan perintah berikut untuk menerapkan pod-demo ke kluster.
kubectl apply -f pod-demo.yaml -
Jalankan perintah berikut untuk melihat batas memori awal kontainer.
# The specific path can be constructed from the pod UID and container ID. cat /sys/fs/cgroup/memory/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podaf44b779_41d8_43d5_a0d8_8a7a0b17****.slice/memory.limit_in_bytesOutput yang diharapkan:
# This corresponds to 1 GB, which is 1 × 1024 × 1024 × 1024 = 1073741824. 1073741824Output menunjukkan bahwa batas memori awal kontainer adalah 1 GB. Ini sesuai dengan pengaturan
spec.containers.resources.limits.memorypada Langkah 1. -
Buat file bernama cgroups-sample.yaml dengan konten berikut untuk menentukan batas memori baru bagi kontainer.
apiVersion: resources.alibabacloud.com/v1alpha1 kind: Cgroups metadata: name: cgroups-sample spec: pod: name: pod-demo namespace: default containers: - name: pod-demo memory: 5Gi # Specify a memory limit of 5 GB for the pod. -
Jalankan perintah berikut untuk menerapkan cgroups-sample.yaml ke kluster.
kubectl apply -f cgroups-sample.yaml -
Jalankan perintah berikut untuk melihat batas memori terbaru kontainer.
# The specific path can be constructed from the pod UID. cat /sys/fs/cgroup/memory/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podaf44b779_41d8_43d5_a0d8_8a7a0b17****.slice/memory.limit_in_bytesOutput yang diharapkan:
# This corresponds to 5 GB, which is 5 × 1024 × 1024 × 1024 = 5368709120 5368709120Output yang diharapkan menunjukkan batas memori kontainer adalah 5 GB, yang sesuai dengan nilai yang ditentukan pada Langkah 4 untuk
spec.pod.containers.memory. Hal ini mengonfirmasi bahwa modifikasi berhasil. -
Jalankan perintah berikut untuk memeriksa 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 daftar Events tidak berisi informasi tentang restart pod dan pod berjalan secara normal.
Ubah cakupan binding core CPU
Jika aplikasi Anda bersifat CPU-intensive dan memerlukan isolasi resource yang lebih baik, Anda dapat mengubah cakupan binding core CPU untuk menentukan core CPU mana yang dapat digunakan oleh pod.
Contoh ini membuat pod yang tidak terikat pada core CPU tertentu. Kemudian memverifikasi bahwa Anda berhasil mengubah cakupan binding core CPU pod menggunakan file Cgroups tanpa me-restart pod.
Untuk binding core CPU rutin, kami merekomendasikan penggunaan fitur penjadwalan sadar topologi CPU untuk memberikan performa lebih baik bagi beban kerja yang sensitif terhadap CPU. Untuk informasi selengkapnya, lihat Aktifkan penjadwalan sadar topologi CPU.
-
Buat file bernama pod-cpuset-demo.yaml dengan 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"] -
Jalankan perintah berikut untuk menerapkan pod-cpuset-demo.yaml ke kluster.
kubectl apply -f pod-cpuset-demo.yaml -
Jalankan perintah berikut untuk melihat binding core CPU saat ini dari kontainer.
# The actual path can be constructed from the pod UID and container ID. 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 sebelum binding CPU, rentang core CPU yang tersedia adalah 0 hingga 31, artinya tidak ada batasan CPU.
-
Buat file bernama cgroups-sample-cpusetpod.yaml dengan konten berikut untuk menentukan informasi binding core 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 # Bind the pod to CPU cores 2 and 3. -
Jalankan perintah berikut untuk menerapkan cgroups-sample-cpusetpod.yaml ke kluster.
kubectl apply -f cgroups-sample-cpusetpod.yaml -
Jalankan perintah berikut untuk melihat binding core CPU terbaru dari kontainer.
# The actual path can be constructed from the pod UID and container ID. 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 yang diharapkan menunjukkan bahwa kontainer berhasil disambungkan ke CPU 2 dan CPU 3. Hal ini konsisten dengan pengaturan
spec.pod.containers.cpuset-cpuspada Langkah 4, yang mengonfirmasi bahwa modifikasi berhasil. -
Jalankan perintah berikut untuk memeriksa 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 daftar Events tidak berisi informasi tentang restart pod. Pod berjalan secara normal.
Ubah parameter IOPS disk
Untuk mengontrol IOPS disk, Anda harus menggunakan node pekerja yang menjalankan sistem operasi Alibaba Cloud Linux.
Contoh ini membuat aplikasi uji intensif I/O. Kemudian memverifikasi bahwa Anda dapat membatasi throughput pod dan mengubah batas I/O disk kontainer menggunakan file Cgroups tanpa me-restart pod.
Saat Anda menggunakan batasan blkio di lingkungan cgroup v1, kernel sistem operasi hanya membatasi I/O langsung dari kontainer. I/O buffered tidak dapat dibatasi. Untuk membatasi I/O buffered, Anda harus mengaktifkan fitur cgroup writeback untuk cgroup v1 di Alibaba Cloud Linux. Untuk informasi selengkapnya, lihat Aktifkan fitur cgroup writeback. Fitur ini tidak didukung di lingkungan cgroup v2.
-
Buat aplikasi uji intensif I/O menggunakan konten YAML berikut.
Direktori host /mnt dipasang untuk digunakan di dalam pod dan sesuai dengan nama perangkat disk /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"] # Use the Fio tool to perform a write test on disk IOPS. 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 # Mount to the /data path. volumes: - name: pvc hostPath: path: /mnt -
Jalankan perintah berikut untuk menerapkan fio-demo ke kluster.
kubectl apply -f fio-demo.yaml -
Terapkan file Cgroups yang mengontrol IOPS disk untuk membatasi throughput pod.
-
Buat file bernama cgroups-sample-fio.yaml dengan konten YAML berikut untuk menentukan batas byte per detik (BPS) untuk perangkat /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: # BPS limit, such as 1048576, 2097152, or 3145728. device_write_bps: [{device: "/dev/vda1", value: "1048576"}] -
Jalankan perintah berikut untuk melihat batas I/O disk terbaru dari kontainer.
# The actual path can be constructed from the pod UID and container ID. 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 kecepatan disk saat ini diatur ke
1048576.
-
-
Lihat data pemantauan disk untuk node yang sesuai.


Seperti yang ditunjukkan pada gambar di atas, throughput BPS (File System Write) kontainer sesuai dengan batas
device_write_bpsyang ditetapkan pada Langkah 3. Pod tidak direstart selama modifikasi.CatatanAnda juga dapat mengaktifkan Dasbor Prometheus Alibaba Cloud. Untuk informasi selengkapnya, lihat Menyambungkan ke dan mengonfigurasi Pemantauan Prometheus Alibaba Cloud. Di halaman Pemantauan Prometheus, pilih Operations > Prometheus Monitoring. Pada tab Application Monitoring, Anda dapat memfilter aplikasi sampel untuk melihat data disk-nya.
Ubah secara dinamis parameter resource pod di tingkat deployment
Modifikasi dinamis parameter resource di tingkat pod, seperti yang dijelaskan pada bagian sebelumnya, juga berlaku di tingkat deployment. Modifikasi di tingkat pod berlaku melalui bidang spec.pod dalam file Cgroups, sedangkan modifikasi di tingkat deployment berlaku melalui bidang spec.deployment. Contoh berikut menunjukkan cara mengubah cakupan binding core CPU untuk deployment. Operasi untuk skenario lain serupa.
-
Buat file bernama go-demo.yaml dengan konten berikut.
Deployment berisi dua instans program uji stres. Setiap instans menggunakan 0,5 core 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 -
Jalankan perintah berikut untuk menerapkan go-demo ke kluster.
kubectl apply -f go-demo.yaml -
Buat file bernama cgroups-cpuset-sample.yaml dengan konten berikut untuk menentukan informasi binding CPU.
apiVersion: resources.alibabacloud.com/v1alpha1 kind: Cgroups metadata: name: cgroups-cpuset-sample spec: deployment: # This is for a Deployment. name: go-demo namespace: default containers: - name: go-demo cpuset-cpus: 2,3 # Bind the pod to CPU cores 2 and 3. -
Jalankan perintah berikut untuk menerapkan cgroups-cpuset-sample ke kluster.
kubectl apply -f cgroups-cpuset-sample.yaml -
Jalankan perintah berikut untuk melihat binding core CPU terbaru dari kontainer.
# The actual path can be constructed from the pod UID and container ID. 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 kontainer terikat ke core CPU 2 dan 3. Hal ini sesuai dengan pengaturan
spec.deployment.containers.cpuset-cpusdalam file Cgroups.