Gunakan ack-koordinator untuk memprioritaskan memori bagi kontainer yang sensitif terhadap latensi dan mengurangi error OOM saat terjadi persaingan sumber daya.
Cara kerja
Kubernetes menetapkan request dan limit memori untuk setiap pod. Dua mode kegagalan terjadi saat tekanan memori meningkat:
-
Tekanan tingkat kontainer: Ketika penggunaan memori kontainer (termasuk page cache) mendekati limit-nya, OS memicu reclamation langsung tingkat memcg, sehingga proses diblokir. Jika alokasi lebih cepat daripada reclamation, error OOM akan menghentikan pod tersebut.
-
Tekanan tingkat node: Ketika total limit memori kontainer melebihi kapasitas memori fisik node, kernel melakukan reclamation memori secara acak di seluruh kontainer, menurunkan kinerja, dan berpotensi memicu error OOM.
ack-koordinator mengatasi kedua masalah tersebut dengan mengonfigurasi memory control group (memcg) per kontainer, menggunakan tiga fitur kernel Alibaba Cloud Linux (Alinux):
-
Memcg QoS: mengunci jumlah minimum memori agar kontainer berprioritas tinggi tetap mempertahankan working set-nya
-
Memcg backend asynchronous reclamation: melakukan reclamation memori secara proaktif sebelum mencapai limit, sehingga menghindari reclamation langsung yang memblokir
-
Memcg global minimum watermark rating: menyesuaikan ambang batas reclamation per kontainer sehingga kontainer sensitif terhadap latensi (LS) menjadi yang terakhir direclaim
Hal ini menghasilkan distribusi memori yang lebih adil dan latensi lebih rendah saat terjadi overcommitment.
Keunggulan dibanding QoS memori Kubernetes open-source
Fitur memory QoS Kubernetes upstream (Kubernetes 1.22+) hanya mendukung cgroup v2, memerlukan konfigurasi kubelet manual, dan tidak memiliki granularitas per-pod atau per-namespace.
ack-koordinator meningkatkan implementasi upstream dalam dua aspek:
-
Kompatibilitas kernel yang lebih luas: Mendukung cgroup v1 dan v2, didukung oleh fitur-fitur kernel Alinux seperti memcg backend asynchronous reclamation dan minimum watermark rating. Lihat Overview of kernel features and interfaces.
-
Konfigurasi granular tingkat tinggi: Konfigurasikan QoS memori per pod, namespace, atau kluster melalui anotasi pod atau ConfigMap.
Mekanisme konfigurasi
ack-koordinator menggunakan empat parameter cgroup untuk QoS memori. Masing-masing dipetakan ke opsi konfigurasi dalam Advanced parameters:
| cgroup parameter | Kontrol | Dikonfigurasi oleh |
|---|---|---|
memory.limit_in_bytes |
Batas atas mutlak untuk kontainer | Kubernetes (dari limits.memory) |
memory.high |
Ambang batas throttling — reclamation dimulai di sini | throttlingPercent |
memory.wmark_high |
Pemicu reclamation asinkron | wmarkRatio |
memory.min |
Lantai memori yang tidak dapat direclaim | minLimitPercent / lowLimitPercent |
Prioritas konfigurasi
Saat beberapa sumber konfigurasi berlaku untuk pod yang sama, ack-koordinator menggunakan urutan prioritas berikut (tertinggi terlebih dahulu):
-
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 secara otomatis memetakan kelas QoS Kubernetes sebagai berikut:
| 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+. Lihat Manually update ACK clusters.
-
Alinux sebagai OS node. Beberapa parameter lanjutan bergantung pada fitur kernel Alinux. Lihat Advanced parameters.
-
ack-koordinator versi 0.8.0+ terinstal. Lihat ack-koordinator.
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 dalam kluster.
-
Buat file
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 untuk setiap pod menggunakan label
koordinator.sh/qosClass:apiVersion: v1 kind: Pod metadata: name: pod-demo labels: koordinator.sh/qosClass: 'LS' -
Terapkan ConfigMap tersebut:
-
Jika
ack-slo-configsudah ada dikube-system, perbarui agar pengaturan lain tetap terjaga: ``bash kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)"`` -
Jika belum ada, buat ConfigMap tersebut: ``
bash kubectl apply -f configmap.yaml``
-
-
(Opsional) Konfigurasikan advanced parameters.
Aktifkan QoS memori untuk namespace
Gunakan ConfigMap ack-slo-pod-config untuk mengaktifkan atau menonaktifkan QoS memori bagi pod di namespace tertentu.
-
Buat file
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 yang sebenarnya. -
Terapkan ConfigMap tersebut:
kubectl patch cm -n kube-system ack-slo-pod-config --patch "$(cat ack-slo-pod-config.yaml)" -
(Opsional) Konfigurasikan advanced parameters.
Contoh: Redis dalam kondisi overcommitment memori
Contoh ini menunjukkan bagaimana QoS memori mengurangi latensi Redis dan meningkatkan throughput dalam kondisi overcommitment memori. Pengujian menggunakan:
-
Kluster ACK Pro dengan dua node (masing-masing 8 vCPU, 32 GB)
-
Satu node untuk Redis, satu lagi untuk pengujian stres
Jalankan pengujian
-
Buat file
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 tempat Redis berjalan. --- 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
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, nilai global minimum watermark yang rendah menyebabkan OOM killer berjalan sebelum reclamation memori. Untuk node 32 GB, atur nilai ini minimal 4.000.000 KB.
cat /proc/sys/vm/min_free_kbytesOutput yang diharapkan:
4000000 -
Deploy 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 pengirim 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
Hasil hanya sebagai referensi. Nilai aktual bergantung pada konfigurasi kluster dan beban kerja.
| 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
Konfigurasikan parameter berikut melalui anotasi pod atau ConfigMap ack-slo-config. Anotasi pod memiliki prioritas lebih tinggi.
<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 dengan pengaturan memcg yang direkomendasikan.</p></li> <li><p><code>false</code>: menonaktifkan QoS memori untuk semua kontainer dan mengembalikan pengaturan memcg default.</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 dengan pengaturan yang direkomendasikan, menggantikan ConfigMap ack-slo-pod-config.</p></li> <li><p><code>default</code>: mewarisi pengaturan dari ConfigMap ack-slo-pod-config.</p></li> <li><p><code>none</code>: menonaktifkan QoS memori dan mengembalikan pengaturan memcg default, menggantikan 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> (dinonaktifkan). </p><p>Proporsi memori request pod yang tidak dapat direclaim. Gunakan ini untuk menyimpan cache file pada aplikasi yang sensitif terhadap page cache. Lihat<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>Rumus: <code>Nilai memory.min = Request memori × Nilai minLimitPercent/100</code>. Contohnya, dengan <code>Memory Request=100MiB</code> dan <code>minLimitPercent=100</code>, <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> (dinonaktifkan). </p><p>Proporsi relatif memori request pod yang tidak dapat direclaim. Lihat<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>Rumus: <span><code>Nilai memory.low = Request memori × Nilai lowLimitPercent/100</code></span>. Contohnya, dengan <span><code>Memory Request=100MiB</code></span> dan <span><code>lowLimitPercent=100</code></span>, <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> (dinonaktifkan). </p><p>Ambang batas throttling memori sebagai rasio penggunaan kontainer terhadap limit. Saat dilampaui, memori direclaim. Mencegah OOM tingkat cgroup dalam skenario overcommitment. Lihat<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>Rumus: <code>Nilai memory.high = Limit memori × Nilai throttlingPercent/100</code>. Contohnya, dengan <code>Memory Limit=100MiB</code> dan <code>throttlingPercent=80</code>, <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>. <code>0</code> menonaktifkan parameter ini. Saat penggunaan melebihi ambang batas, reclamation asinkron backend memcg dipicu. </p><p>Ambang batas reclamation asinkron: rasio penggunaan terhadap limit, atau penggunaan terhadap <code>memory.high</code>. Lihat<a href="https://www.alibabacloud.com/help/en/document_detail/169535.html#task-2487938">Memcg backend asynchronous reclaim</a>. </p><p>Jika throttlingPercent dinonaktifkan, rumusnya adalah: Nilai memory.wmark_high = Limit memori × wmarkRatio/100. Jika throttlingPercent diaktifkan, rumusnya adalah: <code>Nilai memory.wmark_high = Nilai memory.high × wmarkRatio/100</code>. Contohnya, dengan <code>Memory Limit=100MiB</code> dan <code>wmarkRatio=95,throttlingPercent=80</code>: <code>memory.high adalah 83886080 (80 MiB)</code>, <code>memory.wmark_ratio adalah 95</code>, dan <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>. <code>0</code> menonaktifkan parameter ini. </p><p>Menyesuaikan global minimum watermark per kontainer. Nilai negatif menunda reclamation; nilai positif mempercepatnya. Lihat<a href="https://www.alibabacloud.com/help/en/document_detail/169537.html#task-2492619">Memcg global minimum watermark rating</a>. </p><p>Contohnya, pod LS secara default menggunakan <code>memory.wmark_min_adj=-25</code>, mengurangi minimum watermark sebesar 25%. </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 oleh masing-masing versi:
| Versi komponen | Protokol alibabacloud.com | Protokol koordinator.sh |
|---|---|---|
| ≥ 0.3.0 dan < 0.8.0 | ✓ | × |
| ≥ 0.8.0 | ✓ | ✓ |
Dukungan untuk protokol alibabacloud.com berakhir pada 30 Juli 2023. Lakukan migrasi ke protokol koordinator.sh.
Penagihan
Tidak ada biaya untuk instalasi atau penggunaan 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 request 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 selanjutnya
-
Overview of kernel features and interfaces — fitur kernel yang diperlukan oleh QoS memori ACK
-
Enable CPU QoS for containers — batasi dan evict sumber daya yang direclaim untuk melindungi workload sensitif terhadap latensi