Komponen ack-koordinator menyediakan Quality of Service (QoS) memori untuk kontainer yang berjalan di kluster ACK. Dengan menetapkan kelas QoS berbeda ke kontainer, ack-koordinator memprioritaskan alokasi memori bagi workload yang sensitif terhadap latensi dan mengurangi error out of memory (OOM) selama kontensi memori.
Cara kerja
Kubernetes menetapkan memory request dan memory limit untuk setiap pod. Dua mode kegagalan dapat terjadi ketika memori dibatasi:
-
Tekanan tingkat kontainer: Ketika penggunaan memori kontainer (termasuk page cache) mendekati batasnya, OS memicu reclaim memori langsung pada level memcg, sehingga memblokir proses kontainer tersebut. Jika alokasi memori lebih cepat daripada reclaim, error OOM akan menghentikan pod.
-
Tekanan tingkat node: Ketika jumlah batas memori semua kontainer melebihi kapasitas memori fisik node, kernel OS melakukan reclaim memori secara acak di antara kontainer. Hal ini menurunkan kinerja dan dapat memicu error OOM pada pod mana pun di node tersebut.
ack-koordinator mengatasi kedua mode kegagalan tersebut dengan mengonfigurasi secara otomatis memory control group (memcg) untuk setiap kontainer. Fitur ini mengaktifkan tiga fitur kernel Alibaba Cloud Linux:
-
Memcg QoS: mengunci jumlah minimum memori agar kontainer prioritas tinggi tetap mempertahankan working set-nya
-
Memcg backend asynchronous reclamation: melakukan reclaim memori secara proaktif sebelum mencapai batas, sehingga menghindari reclaim langsung yang memblokir
-
Memcg global minimum watermark rating: menyesuaikan ambang batas reclaim per kontainer sehingga kontainer sensitif terhadap latensi (LS) menjadi yang terakhir direclaim
Hasilnya adalah distribusi memori yang lebih adil di antara kontainer dan latensi aplikasi yang lebih rendah selama overcommitment.
Keunggulan dibanding QoS memori Kubernetes open-source
Fitur memory QoS Kubernetes upstream didukung mulai Kubernetes 1.22 ke atas, hanya mendukung cgroup v2, dan memerlukan konfigurasi kubelet manual. Fitur ini berlaku untuk semua pod dan node di kluster serta tidak mendukung konfigurasi detail halus per pod atau per namespace.
Fitur memory QoS ack-koordinator meningkatkan implementasi upstream dalam dua aspek utama:
-
Kompatibilitas kernel yang lebih luas: Mendukung antarmuka cgroup v1 dan cgroup v2, didukung oleh fitur kernel Alibaba Cloud Linux seperti memcg backend asynchronous reclamation dan minimum watermark rating. Untuk detailnya, lihat Overview of kernel features and interfaces.
-
Konfigurasi detail halus: Gunakan anotasi pod atau ConfigMap untuk mengonfigurasi QoS memori secara independen untuk pod tertentu, namespace, atau seluruh kluster.
Mekanisme konfigurasi
ack-koordinator menggunakan empat parameter cgroup untuk menerapkan kebijakan QoS memori. Tabel berikut menunjukkan bagaimana setiap parameter dipetakan ke opsi konfigurasi yang dijelaskan dalam Advanced parameters:
| cgroup parameter | Kontrol | Dikonfigurasi oleh |
|---|---|---|
memory.limit_in_bytes |
Batas atas keras untuk kontainer | Kubernetes (dari limits.memory) |
memory.high |
Ambang batas throttling — reclaim dimulai di sini | throttlingPercent |
memory.wmark_high |
Pemicu reclaim asinkron | wmarkRatio |
memory.min |
Lantai memori yang tidak dapat direclaim | minLimitPercent / lowLimitPercent |
Prioritas konfigurasi
Ketika beberapa sumber konfigurasi berlaku untuk pod yang sama, ack-koordinator menggunakan urutan prioritas berikut (tertinggi pertama):
-
Anotasi Pod (
koordinator.sh/memoryQOS) -
ConfigMap tingkat Namespace (
ack-slo-pod-config) -
ConfigMap tingkat Kluster (
ack-slo-config)
Pemetaan kelas QoS
Jika sebuah pod tidak memiliki label koordinator.sh/qosClass, ack-koordinator memetakan dari kelas QoS Kubernetes secara otomatis:
| Kelas QoS Kubernetes | Kelas QoS koordinator |
|---|---|
| Guaranteed | Pengaturan QoS memori default |
| Burstable | LS (latency-sensitive) |
| BestEffort | BE (best-effort) |
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
-
Kluster ACK yang menjalankan Kubernetes 1.18 atau lebih baru. Untuk upgrade, lihat Manually update ACK clusters.
-
Alibaba Cloud Linux sebagai OS node. Beberapa parameter lanjutan bergantung pada fitur kernel Alibaba Cloud Linux. Lihat Advanced parameters untuk detailnya.
-
ack-koordinator versi 0.8.0 atau lebih baru telah diinstal. Lihat ack-koordinator untuk langkah instalasi.
Aktifkan QoS memori untuk pod tertentu
Tambahkan anotasi berikut ke spesifikasi pod:
annotations:
# Aktifkan QoS memori dengan pengaturan yang direkomendasikan
koordinator.sh/memoryQOS: '{"policy": "auto"}'
# Nonaktifkan QoS memori
# koordinator.sh/memoryQOS: '{"policy": "none"}'
Aktifkan QoS memori untuk kluster
Gunakan ConfigMap ack-slo-config untuk menerapkan QoS memori ke semua pod di kluster.
-
Buat file bernama
configmap.yamldengan konten berikut:apiVersion: v1 kind: ConfigMap metadata: name: ack-slo-config namespace: kube-system data: resource-qos-config: |- { "clusterStrategy": { "lsClass": { "memoryQOS": { "enable": true } }, "beClass": { "memoryQOS": { "enable": true } } } } -
Tetapkan kelas QoS setiap pod menggunakan label
koordinator.sh/qosClass:apiVersion: v1 kind: Pod metadata: name: pod-demo labels: koordinator.sh/qosClass: 'LS' -
Terapkan ConfigMap:
-
Jika
ack-slo-configsudah ada dikube-system, perbarui agar tidak menimpa pengaturan lain yang tidak terkait: ``bash kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)"`` -
Jika belum ada, buat: ``
bash kubectl apply -f configmap.yaml``
-
-
(Opsional) Konfigurasi advanced parameters.
Aktifkan QoS memori untuk namespace
Gunakan ConfigMap ack-slo-pod-config untuk mengaktifkan atau menonaktifkan QoS memori untuk pod di namespace tertentu.
-
Buat file bernama
ack-slo-pod-config.yamldengan konten berikut:apiVersion: v1 kind: ConfigMap metadata: name: ack-slo-pod-config namespace: kube-system data: memory-qos: | { "enabledNamespaces": ["allow-ns"], "disabledNamespaces": ["block-ns"] }Ganti
allow-nsdanblock-nsdengan nama namespace aktual. -
Terapkan ConfigMap:
kubectl patch cm -n kube-system ack-slo-pod-config --patch "$(cat ack-slo-pod-config.yaml)" -
(Opsional) Konfigurasi advanced parameters.
Contoh: Redis dalam kondisi overcommitment memori
Contoh ini menunjukkan bagaimana QoS memori mengurangi latensi Redis dan meningkatkan throughput saat memori node mengalami overcommitment. Pengujian menggunakan:
-
Kluster ACK Pro dengan dua node, masing-masing memiliki 8 vCPU dan memori 32 GB
-
Satu node menjalankan workload Redis, satu lagi menjalankan uji stres
Jalankan pengujian
-
Buat file bernama
redis-demo.yaml:apiVersion: v1 kind: ConfigMap metadata: name: redis-demo-config data: redis-config: | appendonly yes appendfsync no --- apiVersion: v1 kind: Pod metadata: name: redis-demo labels: koordinator.sh/qosClass: 'LS' annotations: koordinator.sh/memoryQOS: '{"policy": "auto"}' spec: containers: - name: redis image: redis:5.0.4 command: - redis-server - "/redis-master/redis.conf" env: - name: MASTER value: "true" ports: - containerPort: 6379 resources: limits: cpu: "2" memory: "6Gi" requests: cpu: "2" memory: "2Gi" volumeMounts: - mountPath: /redis-master-data name: data - mountPath: /redis-master name: config volumes: - name: data emptyDir: {} - name: config configMap: name: redis-demo-config items: - key: redis-config path: redis.conf nodeName: # Tetapkan ke nama node yang menjalankan Redis. --- apiVersion: v1 kind: Service metadata: name: redis-demo spec: ports: - name: redis-port port: 6379 protocol: TCP targetPort: 6379 selector: name: redis-demo type: ClusterIP -
Deploy Redis:
kubectl apply -f redis-demo.yaml -
Simulasikan overcommitment memori menggunakan tool Stress. Buat file bernama
stress-demo.yaml:apiVersion: v1 kind: Pod metadata: name: stress-demo labels: koordinator.sh/qosClass: 'BE' annotations: koordinator.sh/memoryQOS: '{"policy": "auto"}' spec: containers: - args: - '--vm' - '2' - '--vm-bytes' - 11G - '-c' - '2' - '--vm-hang' - '2' command: - stress image: polinux/stress imagePullPolicy: Always name: stress restartPolicy: Always nodeName: # Tetapkan ke node yang sama dengan redis-demo. -
Deploy workload stres:
kubectl apply -f stress-demo.yaml -
Verifikasi global minimum watermark sebelum menjalankan benchmark.
PentingDalam skenario overcommitment memori, global minimum watermark yang rendah menyebabkan OOM killer berjalan sebelum reclaim memori. Untuk node 32 GB, atur nilai ini minimal 4.000.000 KB.
cat /proc/sys/vm/min_free_kbytesOutput yang diharapkan:
4000000 -
Deploy tool memtier-benchmark untuk mengirim permintaan ke pod Redis:
apiVersion: v1 kind: Pod metadata: labels: name: memtier-demo name: memtier-demo spec: containers: - command: - memtier_benchmark - '-s' - 'redis-demo' - '--data-size' - '200000' - "--ratio" - "1:4" image: 'redislabs/memtier_benchmark:1.3.0' name: memtier restartPolicy: Never nodeName: # Tetapkan ke nama node yang mengirim permintaan. -
Periksa hasil benchmark:
kubectl logs -f memtier-demo -
Untuk perbandingan, nonaktifkan QoS memori pada kedua pod dan ulangi pengujian:
apiVersion: v1 kind: Pod metadata: name: redis-demo labels: koordinator.sh/qosClass: 'LS' annotations: koordinator.sh/memoryQOS: '{"policy": "none"}' spec: ... --- apiVersion: v1 kind: Pod metadata: name: stress-demo labels: koordinator.sh/qosClass: 'BE' annotations: koordinator.sh/memoryQOS: '{"policy": "none"}'
Hasil pengujian
Data berikut hanya sebagai referensi. Hasil aktual bergantung pada konfigurasi kluster dan workload Anda.
| Metrik | QoS memori dinonaktifkan | QoS memori diaktifkan |
|---|---|---|
Latency-avg |
51,32 ms | 47,25 ms |
Throughput-avg |
149,0 MB/s | 161,9 MB/s |
Mengaktifkan QoS memori mengurangi latensi Redis sebesar 7,9% dan meningkatkan throughput sebesar 8,7% dalam kondisi overcommitment memori.
Parameter lanjutan
Tabel berikut mencantumkan parameter lanjutan yang dapat Anda atur dalam anotasi pod atau ConfigMap ack-slo-config. Anotasi pod memiliki prioritas lebih tinggi daripada pengaturan ConfigMap.
<table> <thead> <tr> <td><p><b>Parameter</b></p></td> <td><p><b>Tipe</b></p></td> <td><p><b>Rentang nilai</b></p></td> <td><p><b>Deskripsi</b></p></td> <td><p><b>Anotasi pod</b></p></td> <td><p><b>ConfigMap</b></p></td> </tr> </thead> <colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup> <tbody> <tr> <td><p><code>enable</code></p></td> <td><p>Boolean</p></td> <td> <ul> <li><p><code>true</code></p></li> <li><p><code>false</code></p></li> </ul></td> <td> <ul> <li><p><code>true</code>: mengaktifkan QoS memori untuk semua kontainer di kluster. Pengaturan memcg yang direkomendasikan untuk kelas QoS kontainer digunakan. </p></li> <li><p><code>false</code>: menonaktifkan QoS memori untuk semua kontainer di kluster. Pengaturan memcg dikembalikan ke pengaturan awal untuk kelas QoS kontainer. </p></li> </ul></td> <td><p><img></p></td> <td><p><img></p></td> </tr> <tr> <td><p><code>policy</code></p></td> <td><p>String</p></td> <td> <ul> <li><p><code>auto</code></p></li> <li><p><code>default</code></p></li> <li><p><code>none</code></p></li> </ul></td> <td> <ul> <li><p><code>auto</code>: mengaktifkan QoS memori untuk kontainer di pod dan menggunakan pengaturan yang direkomendasikan. Pengaturan yang direkomendasikan memiliki prioritas lebih tinggi daripada pengaturan yang ditentukan dalam ConfigMap ack-slo-pod-config. </p></li> <li><p><code>default</code>: menentukan bahwa pod mewarisi pengaturan yang ditentukan dalam ConfigMap ack-slo-pod-config. </p></li> <li><p><code>none</code>: menonaktifkan QoS memori untuk pod. Pengaturan memcg terkait dikembalikan ke pengaturan awal. Pengaturan awal memiliki prioritas lebih tinggi daripada pengaturan yang ditentukan dalam ConfigMap ack-slo-pod-config. </p></li> </ul></td> <td><p><img></p></td> <td><p><img></p></td> </tr> <tr> <td><p><code>minLimitPercent</code></p></td> <td><p>Int</p></td> <td><p>0\~100</p></td> <td><p>Satuan: %. Nilai default: <code>0</code>. Nilai default menunjukkan bahwa parameter ini dinonaktifkan. </p><p>Parameter ini menentukan proporsi memori request pod yang tidak dapat direclaim. Parameter ini cocok untuk skenario di mana aplikasi sensitif terhadap page cache. Anda dapat menggunakan parameter ini untuk caching file guna mengoptimalkan kinerja baca dan tulis. Untuk informasi lebih lanjut, lihat topik Alibaba Cloud Linux <a href="https://www.alibabacloud.com/help/en/document_detail/169536.html#concept-2482889">Memcg QoS feature of the cgroup v1 interface</a>. </p><p>Jumlah memori yang tidak dapat direclaim dihitung berdasarkan rumus berikut: <code>Nilai memory.min = Memory request × Nilai minLimitPercent/100</code>. Misalnya, jika Anda menentukan <code>Memory Request=100MiB</code> dan <code>minLimitPercent=100</code> untuk kontainer, <code>nilai memory.min adalah 104857600</code>. </p></td> <td><p><img></p></td> <td><p><img></p></td> </tr> <tr> <td><p><code>lowLimitPercent</code></p></td> <td><p>Int</p></td> <td><p>0\~100</p></td> <td><p>Satuan: %. Nilai default: <code>0</code>. Nilai default menunjukkan bahwa parameter ini dinonaktifkan. </p><p>Parameter ini menentukan proporsi relatif memori request pod yang tidak dapat direclaim. Untuk informasi lebih lanjut, lihat topik Alibaba Cloud Linux <a href="https://www.alibabacloud.com/help/en/document_detail/169536.html#concept-2482889">Memcg QoS feature of the cgroup v1 interface</a>. </p><p>Jumlah memori yang relatif tidak dapat direclaim dihitung berdasarkan rumus berikut: <span><code>Nilai memory.low = Memory request × Nilai lowLimitPercent/100</code></span>. Misalnya, jika Anda menentukan <span><code>Memory Request=100MiB</code></span> dan <span><code>lowLimitPercent=100</code></span> untuk kontainer, <span><code>nilai memory.low adalah 104857600</code></span>. </p></td> <td><p><img></p></td> <td><p><img></p></td> </tr> <tr> <td><p><code>throttlingPercent</code></p></td> <td><p>Int</p></td> <td><p>0\~100</p></td> <td><p>Satuan: %. Nilai default: <code>0</code>. Nilai default menunjukkan bahwa parameter ini dinonaktifkan. </p><p>Parameter ini menentukan ambang batas throttling memori berdasarkan rasio penggunaan memori kontainer terhadap batas memori kontainer. Jika penggunaan memori kontainer melebihi ambang batas throttling memori, memori yang digunakan oleh kontainer akan direclaim. Parameter ini cocok untuk skenario overcommitment memori kontainer. Anda dapat menggunakan parameter ini untuk mencegah cgroup memicu OOM. Untuk informasi lebih lanjut, lihat topik Alibaba Cloud Linux <a href="https://www.alibabacloud.com/help/en/document_detail/169536.html#concept-2482889">Memcg QoS feature of the cgroup v1 interface</a>. </p><p>Ambang batas throttling memori untuk penggunaan memori dihitung berdasarkan rumus berikut: <code>Nilai memory.high = Memory limit × Nilai throttlingPercent/100</code>. Misalnya, jika Anda menentukan <code>Memory Limit=100MiB</code> dan <code>throttlingPercent=80</code> untuk kontainer, <code>nilai memory.high adalah 83886080(80 MiB)</code>. </p></td> <td><p><img></p></td> <td><p><img></p></td> </tr> <tr> <td><p><code>wmarkRatio</code></p></td> <td><p>Int</p></td> <td><p>0\~100</p></td> <td><p>Satuan: %. Nilai default: <code>95</code>. Nilai <code>0</code> menunjukkan bahwa parameter ini dinonaktifkan. Jika penggunaan memori melebihi ambang batas reclaim, fitur memcg backend asynchronous reclamation dipicu. </p><p>Parameter ini menentukan ambang batas reclaim memori asinkron berdasarkan rasio penggunaan memori terhadap batas memori atau penggunaan memori terhadap nilai <code>memory.high</code>. Untuk informasi lebih lanjut, lihat topik Alibaba Cloud Linux <a href="https://www.alibabacloud.com/help/en/document_detail/169535.html#task-2487938">Memcg backend asynchronous reclaim</a>. </p><p>Jika throttlingPercent dinonaktifkan, ambang batas reclaim memori untuk penggunaan memori dihitung berdasarkan rumus berikut: Nilai memory.wmark_high = Memory limit × wmarkRatio/100. Jika throttlingPercent diaktifkan, ambang batas reclaim memori untuk penggunaan memori dihitung berdasarkan rumus berikut: <code>Nilai memory.wmark_high = Nilai memory.high × wmarkRatio/100</code>. Misalnya, jika Anda menentukan <code>Memory Limit=100MiB</code> dan <code>wmarkRatio=95,throttlingPercent=80</code> untuk kontainer, ambang batas throttling memori yang ditentukan oleh <code>memory.high adalah 83886080 (80 MiB)</code>, rasio reclaim memori <code>memory.wmark_ratio adalah 95</code>, dan ambang batas reclaim memori yang ditentukan oleh <code>memory.wmark_high adalah 79691776 (76 MiB)</code>. </p></td> <td><p><img></p></td> <td><p><img></p></td> </tr> <tr> <td><p><code>wmarkMinAdj</code></p></td> <td><p>Int</p></td> <td><p>-25\~50</p></td> <td><p>Satuan: %. Nilai default adalah <code>-25</code> untuk kelas QoS <code>LS</code> dan <code>50</code> untuk kelas QoS <code>BE</code>. Nilai <code>0</code> menunjukkan bahwa parameter ini dinonaktifkan. </p><p>Parameter ini menentukan penyesuaian global minimum watermark untuk kontainer. Nilai negatif menurunkan global minimum watermark sehingga menunda reclaim memori untuk kontainer tersebut. Nilai positif meningkatkan global minimum watermark sehingga mempercepat reclaim memori untuk kontainer tersebut. Untuk informasi lebih lanjut, lihat topik Alibaba Cloud Linux <a href="https://www.alibabacloud.com/help/en/document_detail/169537.html#task-2492619">Memcg global minimum watermark rating</a>. </p><p>Misalnya, jika Anda membuat pod dengan kelas QoS LS, pengaturan default parameter ini adalah <code>memory.wmark_min_adj=-25</code>, yang menunjukkan bahwa minimum watermark diturunkan sebesar 25% untuk kontainer di pod tersebut. </p></td> <td><p><img></p></td> <td><p><img></p></td> </tr> </tbody> </table>
FAQ
Apakah konfigurasi QoS memori dari ack-slo-manager masih berlaku setelah upgrade ke ack-koordinator?
Ya. ack-koordinator kompatibel mundur dengan protokol berbasis anotasi yang digunakan di ack-slo-manager 0.8.0 dan sebelumnya:
-
alibabacloud.com/qosClass— menetapkan kelas QoS -
alibabacloud.com/memoryQOS— mengonfigurasi QoS memori
Tabel berikut menunjukkan protokol yang didukung setiap versi:
| Versi komponen | Protokol alibabacloud.com | Protokol koordinator.sh |
|---|---|---|
| ≥ 0.3.0 dan < 0.8.0 | ✓ | × |
| ≥ 0.8.0 | ✓ | ✓ |
Dukungan kompatibilitas untuk protokol alibabacloud.com berakhir pada 30 Juli 2023. Migrasikan konfigurasi Anda ke protokol koordinator.sh.
Penagihan
Tidak ada biaya untuk menginstal atau menggunakan komponen ack-koordinator. Namun, biaya mungkin berlaku dalam kasus berikut:
-
Penggunaan sumber daya node: ack-koordinator adalah komponen non-managed yang berjalan di node pekerja. Anda dapat mengonfigurasi permintaan sumber daya untuk setiap modul saat instalasi.
-
Metrik Prometheus: Jika Anda mengaktifkan metrik Prometheus untuk ack-koordinator dan menggunakan Managed Service for Prometheus, metrik tersebut dikenai biaya sebagai custom metrics. Sebelum mengaktifkan fitur ini, tinjau Managed Service for Prometheus billing rules. Untuk memantau penggunaan, lihat Query the amount of observable data and bills.
Langkah berikutnya
-
Overview of kernel features and interfaces — fitur kernel yang diperlukan oleh QoS memori ACK
-
Enable CPU QoS for containers — batasi dan evict sumber daya reclaimed untuk melindungi workload sensitif terhadap latensi