Di kluster Kubernetes, Anda mungkin menjalankan aplikasi latency-sensitive (LS) dan best-effort (BE) pada node yang sama. Meskipun aplikasi memiliki pengaturan CPU request dan CPU limit, aplikasi dengan prioritas berbeda tetap dapat bersaing memperebutkan sumber daya CPU. Persaingan ini dapat menurunkan kualitas layanan (QoS), terutama bagi aplikasi berprioritas tinggi. Aktifkan fitur CPU QoS untuk memprioritaskan alokasi sumber daya CPU bagi aplikasi LS.
Untuk memahami dan menggunakan fitur ini secara lebih baik, rujuk topik Pod Quality of Service Classes dan Assign Memory Resources to Containers and Pods dalam dokumentasi resmi Kubernetes. Rujuk juga topik Group identity feature untuk mempelajari cara kerja fitur group identity.
Mengapa Anda memerlukan CPU QoS untuk kontainer
Untuk memaksimalkan pemanfaatan sumber daya node, skenario colocation sering melibatkan penempatan aplikasi LS berprioritas tinggi dan aplikasi BE berprioritas rendah pada node yang sama. Meskipun Kubernetes membatasi penggunaan sumber daya kontainer melalui CPU request dan CPU limit, persaingan CPU antar kontainer tetap tidak dapat dihindari. Misalnya, ketika aplikasi BE dan LS berbagi core fisik atau logis, beban tinggi pada aplikasi BE dapat mengganggu eksekusi aplikasi LS, sehingga meningkatkan waktu respons layanan.
ack-koordinator menyediakan fitur CPU QoS pada Alibaba Cloud Linux untuk meningkatkan stabilitas alokasi sumber daya CPU bagi aplikasi LS dan mengurangi gangguan dari aplikasi BE. Dengan memanfaatkan fitur group identity, ack-koordinator menggunakan prioritas penjadwalan Linux untuk memberikan penjadwalan CPU diferensial bagi aplikasi dengan prioritas berbeda. Fitur ini mengidentifikasi aplikasi LS sebagai prioritas tinggi dan aplikasi BE sebagai prioritas rendah, sehingga secara efektif meningkatkan kualitas layanan untuk aplikasi LS dalam skenario colocation.
Setelah mengaktifkan fitur CPU QoS, Anda memperoleh manfaat berikut:
Sistem operasi menjadwalkan tugas untuk aplikasi LS lebih cepat, yang meningkatkan kecepatan respons dan kinerjanya.
Tugas aplikasi BE yang terbangun tidak mengambil alih proses aplikasi LS, sehingga mencegah gangguan terhadap tugas berprioritas tinggi.
Bahkan dalam skenario Simultaneous MultiThreading (SMT), tugas aplikasi BE tidak berjalan secara paralel dengan tugas aplikasi LS pada core fisik yang sama. Hal ini mencegah tugas BE memengaruhi kinerja tugas LS akibat persaingan sumber daya komputasi pada core fisik yang sama.
Prasyarat
Anda telah membuat kluster ACK yang memenuhi persyaratan berikut:
Versi kluster adalah 1.18 atau lebih baru. Untuk memperbarui kluster, lihat Manually update ACK clusters.
Sistem operasi harus berupa Alibaba Cloud Linux. Fitur ini bergantung pada parameter
group identityyang spesifik untuk OS ini. Untuk informasi tentang persyaratan versi kernel, lihat Group identity feature.CatatanJika Anda tidak menggunakan Alibaba Cloud Linux, Anda dapat menggunakan fitur CPU Suppress untuk mengontrol jumlah sumber daya CPU yang tersedia untuk Pod BE. Untuk informasi selengkapnya, lihat Enable CPU Suppress.
Anda telah menginstal ack-koordinator v0.8.0 atau lebih baru. Untuk informasi selengkapnya, lihat ack-koordinator (FKA ack-slo-manager).
Prosedur
Anda dapat menggunakan ConfigMap untuk mengaktifkan fitur CPU QoS di tingkat kluster dan mengonfigurasi prioritas group identity CPU untuk Pod LS dan BE. Fitur group identity menetapkan identifier untuk setiap cgroup CPU. Saat kernel menjadwalkan tugas yang memiliki identifier tersebut, tugas tersebut diproses sesuai dengan prioritas yang ditentukan.
Setelah konfigurasi selesai, Anda dapat mendeklarasikan kelas CPU QoS untuk Pod dengan menambahkan label koordinator.sh/qosClass ke file YAML-nya. Untuk Pod yang tidak menentukan label koordinator.sh/qosClass, ack-koordinator mengikuti kelas QoS Pod native Kubernetes. Pod BestEffort dipetakan ke BE, sedangkan Pod dalam kelas QoS lainnya dipetakan ke LS.
Buat file bernama configmap.yaml dengan konten berikut untuk mengaktifkan fitur CPU QoS.
apiVersion: v1 kind: ConfigMap metadata: name: ack-slo-config namespace: kube-system data: # Enable the CPU QoS feature for containers. resource-qos-config: | { "clusterStrategy": { "lsClass": { "cpuQOS": { "enable": true, "groupIdentity": 2 } }, "beClass": { "cpuQOS": { "enable": true, "groupIdentity": -1 } } } }Bidang
lsClassdanbeClassmengonfigurasi Pod dalam kelas QoS LS dan BE, masing-masing. BidangcpuQOSmengonfigurasi CPU QoS. Tabel berikut menjelaskan parameter utamanya.Parameter
Type
Nilai
Deskripsi
enableBoolean
true
false
true: Mengaktifkan fitur CPU QoS di seluruh kluster.false: Menonaktifkan fitur CPU QoS di seluruh kluster.
groupIdentityInteger
[-1, 2]
Prioritas group identity CPU. Nilai
groupIdentityyang lebih besar menunjukkan prioritas penjadwalan kernel yang lebih tinggi untuk kontainer. Untuk informasi selengkapnya, lihat Group identity feature.Secara default, nilainya adalah
2untuk Pod LS dan-1untuk Pod BE. Nilai0menonaktifkan fitur ini.Periksa apakah ConfigMap
ack-slo-configsudah ada di namespace kube-system.Jika sudah ada, jalankan perintah patch berikut untuk memperbaruinya. Hal ini mencegah penimpaan konfigurasi lain dalam ConfigMap.
kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)"Jika belum ada, jalankan perintah berikut untuk membuat ConfigMap.
kubectl apply -f configmap.yaml
Buat file bernama
ls-pod-demo.yamldengan konten berikut. Konfigurasi ini menetapkan kelas QoS Pod sebagaiLS. Lalu, terapkan file YAML tersebut ke kluster Anda.CatatanUntuk menerapkan konfigurasi ke workload, seperti deployment, atur anotasi yang sesuai untuk pod di bidang
template.metadata.apiVersion: v1 kind: Pod metadata: name: ls-pod-demo labels: koordinator.sh/qosClass: 'LS' # Specify the QoS class of the Pod as LS. spec: containers: - command: - httpd - -D - FOREGROUND image: registry.cn-zhangjiakou.aliyuncs.com/acs/apache-2-4-51-for-slo-test:v0.1 imagePullPolicy: Always name: apache resources: limits: cpu: "4" memory: 10Gi requests: cpu: "4" memory: 10Gi restartPolicy: Never schedulerName: default-schedulerkubectl apply -f ls-pod-demo.yamlJalankan perintah berikut pada node untuk memeriksa group identity kernel dari Pod LS dalam hierarki cgroup:
cat /sys/fs/cgroup/cpu/kubepods.slice/kubepods-pod1c20f2ad****.slice/cpu.bvt_warp_nsOutput yang diharapkan:
# The group identity of the LS Pod is 2, which indicates high priority. 2Buat file bernama
be-pod-demo.yamldengan konten berikut. Konfigurasi ini menetapkan kelas QoS Pod sebagaiBE. Lalu, terapkan file YAML tersebut ke kluster Anda.apiVersion: v1 kind: Pod metadata: name: be-pod-demo labels: koordinator.sh/qosClass: 'BE' # Specify the QoS class of the Pod as BE. spec: containers: - args: - '-c' - '1' - '--vm' - '1' command: - stress image: registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4 imagePullPolicy: Always name: stress restartPolicy: Always schedulerName: default-schedulerkubectl apply -f be-pod-demo.yamlJalankan perintah berikut pada node untuk memeriksa group identity kernel dari Pod BE dalam hierarki cgroup:
cat /sys/fs/cgroup/cpu/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod4b6e96c8****.slice/cpu.bvt_warp_nsOutput yang diharapkan:
# The group identity of the BE Pod is -1, which indicates low priority. -1Output tersebut menunjukkan bahwa Pod LS memiliki prioritas group identity yang lebih tinggi daripada Pod BE. Hal ini mengonfirmasi bahwa CPU QoS memprioritaskan alokasi sumber daya CPU untuk Pod LS.
FAQ
Kompatibilitas protokol saat melakukan upgrade ke ack-koordinator
Pada versi protokol sebelumnya (ack-slo-manager v0.8.0 dan sebelumnya), Anda mengaktifkan CPU QoS dengan menambahkan anotasi alibabacloud.com/qosClass ke Pod.
ack-koordinator tetap kompatibel dengan protokol lama ini. Anda dapat melakukan upgrade komponen ke ack-koordinator secara mulus dan secara bertahap memigrasikan Pod Anda ke protokol koordinator.sh. ack-koordinator akan mendukung protokol lama hingga 30 Juli 2023. Segera perbarui konfigurasi resource Anda ke versi protokol baru.
Tabel berikut menjelaskan kompatibilitas berbagai versi ack-koordinator dengan fitur CPU QoS.
Versi komponen | Protokol alibabacloud.com | Protokol koordinator.sh |
≥ 0.5.2 dan < 0.8.0 | Didukung | Tidak didukung |
≥ 0.8.0 | Didukung | Didukung |