Kubernetes memungkinkan Anda menentukan permintaan dan batas sumber daya kontainer. Memori yang tersedia untuk aplikasi bergantung pada berbagai faktor, seperti pengambilan kembali cache halaman dan konsumsi memori berlebih oleh aplikasi lain. Dalam kasus ekstrem, kesalahan out of memory (OOM) terjadi karena memori pada node tidak mencukupi, sehingga menurunkan kinerja aplikasi pada node tersebut. Komponen ack-koordinator menyediakan fitur kualitas layanan memori (QoS) untuk kontainer. Anda dapat menggunakan komponen ini untuk menetapkan kelas QoS yang berbeda ke kontainer berdasarkan kebutuhan bisnis Anda. Ini memungkinkan Anda memprioritaskan permintaan memori aplikasi dengan kelas QoS tinggi sambil memastikan alokasi memori yang adil.
Untuk membantu Anda lebih memahami dan menggunakan fitur memory QoS, kami sarankan Anda terlebih dahulu membaca topik-topik berikut dalam dokumentasi resmi Kubernetes: Kelas Kualitas Layanan Pod dan Tetapkan Sumber Daya Memori ke Kontainer dan Pod.
Pengenalan Fitur
Mengapa memory QoS?
Untuk memastikan bahwa pod dapat berjalan secara efisien dan aman di kluster Kubernetes, Kubernetes memungkinkan Anda menentukan permintaan dan batas sumber daya pod. Gambar berikut menunjukkan permintaan memori dan batas memori sebuah pod.
Permintaan Memori (requests.memory): Permintaan memori pod berlaku selama proses penjadwalan pod. Sistem menjadwalkan pod ke node yang memenuhi permintaan memori pod.
Batas Memori (limits.memory): Batas memori pod membatasi jumlah memori yang dapat digunakan pod pada node. Parameter memory.limit_in_bytes dalam file cgroup menentukan batas atas memori yang dapat digunakan oleh pod.
Penggunaan memori kontainer bergantung pada batas memori kontainer dan kapasitas memori node:
Batas Memori Kontainer: Jika jumlah memori yang digunakan oleh kontainer, termasuk cache halaman, hampir mencapai batas memori kontainer, pengambilan kembali memori tingkat memcg langsung dipicu untuk pod. Akibatnya, proses dalam pod diblokir. Dalam kasus ini, jika pod mengajukan permintaan memori dengan laju lebih cepat daripada memori diambil kembali, kesalahan OOM terjadi dan pod dihentikan.
Kapasitas Memori Node: Batas memori kontainer bisa lebih besar dari permintaan memori kontainer. Saat beberapa kontainer ditempatkan pada node, jumlah batas memori kontainer mungkin melebihi kapasitas memori node. Jika penggunaan memori keseluruhan pada node terlalu tinggi, kernel OS dapat mengambil kembali memori dari kontainer. Akibatnya, kinerja aplikasi Anda menurun. Dalam kasus ekstrem, kesalahan OOM terjadi karena memori pada node tidak mencukupi, dan aplikasi Anda dihentikan.
Deskripsi Fitur
Untuk meningkatkan kinerja aplikasi dan stabilitas node, ack-koordinator menyediakan fitur memory QoS untuk kontainer yang berjalan pada versi kernel Alibaba Cloud Linux yang berbeda. ack-koordinator secara otomatis mengonfigurasi memcg berdasarkan konfigurasi kontainer untuk mengaktifkan fitur lain seperti Memcg QoS, Pengambilan Kembali Asinkron Memcg Backend, dan Penilaian Watermark Minimum Global Memcg. Ini mengoptimalkan kinerja aplikasi sensitif memori sambil memastikan penjadwalan memori yang adil di antara kontainer.
Kebijakan Pengambilan Kembali Memori dan Kunci Memori
Fitur memory QoS memerlukan Anda mengonfigurasi beberapa parameter cgroup.
memory.limit_in_bytes: batas atas memori yang dapat digunakan oleh pod.
memory.high: ambang batas throttling memori. Kernel OS mengambil kembali memori untuk mencegah penggunaan memori melebihi nilai ini.
memory.wmark_high: ambang batas pengambilan kembali memori (
wmarkRatio). Pengambilan kembali asinkron dilakukan pada memori yang dapat diambil kembali untuk memastikan penggunaan memori tetap di bawah ambang batas.memory.min: ambang batas kunci memori. Anda dapat mengonfigurasi ambang batas kunci absolut (
minLimitPercent) dan ambang batas kunci relatif (lowLimitPercent).
Untuk informasi lebih lanjut tentang parameter di atas, lihat Parameter Lanjutan.
Fitur memory QoS memberikan manfaat berikut:
Saat memori yang digunakan oleh pod hampir mencapai batas memori pod, memcg melakukan pengambilan kembali asinkron untuk jumlah memori tertentu. Ini mencegah pengambilan kembali semua memori yang digunakan oleh pod dan dengan demikian meminimalkan dampak buruk pada kinerja aplikasi yang disebabkan oleh pengambilan kembali memori langsung.
Pengambilan kembali memori dilakukan lebih adil di antara pod. Saat memori yang tersedia pada node menjadi tidak cukup, pengambilan kembali memori pertama kali dilakukan pada pod yang menggunakan lebih banyak memori daripada permintaan memori mereka. Ini memastikan memori yang cukup pada node saat pod mengajukan permintaan memori dalam jumlah besar.
Saat sistem mengambil kembali memori, sistem memprioritaskan permintaan memori pod sensitif latensi (LS), termasuk pod Guaranteed dan Burstable.
Konfigurasi Fleksibel dan Kompatibilitas Multi-Lingkungan
Fitur memory QoS didukung di Kubernetes 1.22 dan hanya mendukung cgroup v2. Untuk mengaktifkan memory QoS, Anda harus mengonfigurasi kubelet secara manual. Memory QoS berlaku untuk semua pod dan node dalam kluster dan oleh karena itu tidak mendukung konfigurasi granular halus. Dibandingkan dengan fitur memory QoS yang disediakan oleh Kubernetes open source, fitur memory QoS yang disediakan oleh ack-koordinator dioptimalkan dari perspektif berikut:
Menyediakan fitur lanjutan seperti pengambilan kembali asinkron backend memcg dan penilaian watermark minimum berdasarkan Alibaba Cloud Linux dan kompatibel dengan antarmuka cgroup v1 dan cgroup v2. Untuk informasi lebih lanjut tentang fitur kernel OS yang diperlukan oleh fitur memory QoS Container Service for Kubernetes (ACK), lihat Ikhtisar Fitur dan Antarmuka Kernel.
Memungkinkan Anda menggunakan anotasi atau ConfigMaps untuk dengan mudah dan fleksibel mengonfigurasi memory QoS granular halus untuk kontainer dalam pod, namespace, atau kluster tertentu.
Prasyarat
Sebuah kluster ACK yang memenuhi persyaratan berikut telah dibuat:
Versi Kubernetes: 1.18 atau lebih baru. Untuk informasi lebih lanjut tentang cara memperbarui kluster ACK, lihat Tingkatkan Kluster ACK Secara Manual.
OS: Alibaba Cloud Linux. Beberapa parameter yang diperlukan oleh fitur memory QoS bergantung pada Alibaba Cloud Linux. Untuk informasi lebih lanjut, lihat Parameter Lanjutan.
ack-koordinator 0.8.0 atau lebih baru telah diinstal. Untuk informasi lebih lanjut, lihat ack-koordinator (FAK ack-slo-manager).
Tagihan
Tidak ada biaya yang dikenakan saat Anda menginstal atau menggunakan komponen ack-koordinator. Namun, biaya mungkin dikenakan dalam skenario berikut:
ack-koordinator adalah komponen non-managed yang menggunakan sumber daya node pekerja setelah diinstal. Anda dapat menentukan jumlah sumber daya yang diminta oleh setiap modul saat menginstal komponen.
Secara default, ack-koordinator mengekspos metrik pemantauan fitur seperti profiling sumber daya dan penjadwalan granular halus sebagai metrik Prometheus. Jika Anda mengaktifkan metrik Prometheus untuk ack-koordinator dan menggunakan Managed Service for Prometheus, metrik ini dianggap metrik kustom dan biaya akan dikenakan untuk metrik ini. Biaya tergantung pada faktor-faktor seperti ukuran kluster Anda dan jumlah aplikasi. Sebelum mengaktifkan metrik Prometheus, kami sarankan Anda membaca topik Tagihan Managed Service for Prometheus untuk mempelajari tentang kuota gratis dan aturan tagihan metrik kustom. Untuk informasi lebih lanjut tentang cara memantau dan mengelola penggunaan sumber daya, lihat Kueri Jumlah Data Observabel dan Tagihan.
Catatan Penggunaan
Saat Anda mengaktifkan fitur memory QoS untuk pod, parameter cgroup dikonfigurasi secara otomatis berdasarkan rasio yang ditentukan dan parameter pod. Bagian ini menjelaskan cara mengaktifkan memory QoS untuk kontainer dalam pod, namespace, atau kluster tertentu.
Gunakan Anotasi untuk Mengaktifkan memory QoS untuk Kontainer dalam Pod Tertentu
Anda dapat menggunakan anotasi pod berikut untuk mengaktifkan memory QoS untuk kontainer dalam pod tertentu.
annotations:
# Untuk mengaktifkan memory QoS untuk kontainer dalam pod, atur nilainya menjadi auto.
koordinator.sh/memoryQOS: '{"policy": "auto"}'
# Untuk menonaktifkan memory QoS untuk kontainer dalam pod, atur nilainya menjadi none.
koordinator.sh/memoryQOS: '{"policy": "none"}'Gunakan ConfigMaps untuk Mengaktifkan memory QoS untuk Kontainer dalam Kluster Tertentu
Anda dapat mengonfigurasi ConfigMap untuk mengaktifkan memory QoS untuk semua kontainer dalam kluster tertentu. Anda dapat menggunakan label pod koordinator.sh/qosClass untuk mengelola parameter memory QoS secara terpusat berdasarkan karakteristik aplikasi. Jika Anda menetapkan nilai label koordinator.sh/qosClass menjadi LS atau BE, tidak diperlukan anotasi untuk mengaktifkan memory QoS.
Contoh ConfigMap berikut memberikan contoh cara mengaktifkan memory QoS untuk kontainer dalam kluster tertentu:
apiVersion: v1 data: resource-qos-config: |- { "clusterStrategy": { "lsClass": { "memoryQOS": { "enable": true } }, "beClass": { "memoryQOS": { "enable": true } } } } kind: ConfigMap metadata: name: ack-slo-config namespace: kube-systemGunakan template YAML pod untuk menetapkan kelas QoS menjadi
LSatauBE.CatatanJika pod tidak memiliki label
koordinator.sh/qosClass, ack-koordinator mengonfigurasi parameter memory QoS berdasarkan kelas QoS asli pod. PodGuaranteeddiberi pengaturan memory QoS default. Pod Burstable diberi pengaturan memory QoS default untuk kelas QoSLS. Pod BestEffort diberi pengaturan memory QoS default untuk kelas QoSBE.apiVersion: v1 kind: Pod metadata: name: pod-demo labels: koordinator.sh/qosClass: 'LS' # Tetapkan kelas QoS pod menjadi LS.Periksa apakah ConfigMap
ack-slo-configada di namespacekube-system.Jika ConfigMap ack-slo-config ada, kami sarankan Anda menjalankan perintah kubectl patch untuk memperbarui ConfigMap. Ini menghindari perubahan pengaturan lain dalam ConfigMap.
kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)"Jika ConfigMap ack-slo-config tidak ada, jalankan perintah berikut untuk membuat ConfigMap:
kubectl apply -f configmap.yaml
Opsional. Konfigurasikan parameter lanjutan.
Gunakan ConfigMaps untuk Mengaktifkan memory QoS untuk Kontainer dalam Namespace Tertentu
Jika Anda ingin mengaktifkan atau menonaktifkan memory QoS untuk pod kelas QoS LS dan BE dalam namespace tertentu, tentukan namespace dalam ConfigMap.
Contoh ConfigMap berikut memberikan contoh cara mengaktifkan memory QoS untuk kontainer dalam kluster tertentu:
apiVersion: v1 data: resource-qos-config: |- { "clusterStrategy": { "lsClass": { "memoryQOS": { "enable": true } }, "beClass": { "memoryQOS": { "enable": true } } } } kind: ConfigMap metadata: name: ack-slo-config namespace: kube-systemBuat file bernama ack-slo-pod-config.yaml dan salin konten berikut ke file tersebut.
Blok kode berikut digunakan untuk mengaktifkan atau menonaktifkan memory QoS untuk kontainer dalam namespace kube-system:
apiVersion: v1 kind: ConfigMap metadata: name: ack-slo-pod-config namespace: kube-system # Anda perlu membuat namespace secara manual pada waktu pertama. data: # Aktifkan atau nonaktifkan memory QoS untuk kontainer dalam namespace tertentu. memory-qos: | { "enabledNamespaces": ["allow-ns"], "disabledNamespaces": ["block-ns"] }Jalankan perintah berikut untuk memperbarui ConfigMap:
kubectl patch cm -n kube-system ack-slo-pod-config --patch "$(cat ack-slo-pod-config.yaml)"Opsional. Konfigurasikan parameter lanjutan.
Contoh
Dalam bagian ini, pod Redis digunakan sebagai contoh. Kondisi berikut digunakan untuk membandingkan latensi dan throughput pod sebelum memory QoS diaktifkan dan setelah memory QoS diaktifkan dalam skenario overcommitment memori:
Sebuah kluster ACK Pro digunakan.
Kluster berisi 2 node, masing-masing memiliki 8 vCPU dan 32 GB memori. Satu node digunakan untuk melakukan uji stres. Node lain menjalankan beban kerja dan berfungsi sebagai mesin yang diuji.
Prosedur
Buat file bernama redis-demo.yaml dan salin konten berikut ke file tersebut:
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' # Tetapkan kelas QoS pod Redis menjadi LS. annotations: koordinator.sh/memoryQOS: '{"policy": "auto"}' # Tambahkan anotasi ini untuk mengaktifkan memory QoS. 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 nodeName ke nama node yang diuji. --- apiVersion: v1 kind: Service metadata: name: redis-demo spec: ports: - name: redis-port port: 6379 protocol: TCP targetPort: 6379 selector: name: redis-demo type: ClusterIPJalankan perintah berikut untuk menyebarkan Redis Server sebagai aplikasi uji.
Anda dapat mengakses layanan redis-demo dari dalam kluster.
kubectl apply -f redis-demo.yamlSimulasikan overcommitment memori.
Gunakan alat Stress untuk meningkatkan beban pada memori dan memicu pengambilan kembali memori. Jumlah batas memori semua pod pada node melebihi memori fisik node.
Buat file bernama stress-demo.yaml dan salin konten berikut ke file tersebut:
apiVersion: v1 kind: Pod metadata: name: stress-demo labels: koordinator.sh/qosClass: 'BE' # Tetapkan kelas QoS pod Stress menjadi BE. annotations: koordinator.sh/memoryQOS: '{"policy": "auto"}' # Tambahkan anotasi ini untuk mengaktifkan memory QoS. 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 nodeName ke nama node yang diuji, yaitu node tempat pod Redis ditempatkan.Jalankan perintah berikut untuk menyebarkan stress-demo:
kubectl apply -f stress-demo.yaml
Jalankan perintah berikut untuk memeriksa watermark minimum global node:
CatatanDalam skenario overcommitment memori, jika watermark minimum global node diatur ke nilai rendah, OOM killer mungkin dipicu untuk semua pod pada node bahkan sebelum pengambilan kembali memori dilakukan. Oleh karena itu, kami sarankan Anda menetapkan watermark minimum global ke nilai tinggi. Dalam contoh ini, watermark minimum global diatur ke 4.000.000 KB untuk node yang diuji dengan memori 32 GiB.
cat /proc/sys/vm/min_free_kbytesOutput yang diharapkan:
4000000Gunakan template YAML berikut untuk menyebarkan alat memtier-benchmark untuk mengirim permintaan ke node yang diuji:
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 nodeName ke nama node yang digunakan untuk mengirim permintaan.Jalankan perintah berikut untuk memeriksa hasil tes dari memtier-benchmark:
kubectl logs -f memtier-demoGunakan template YAML berikut untuk menonaktifkan memory QoS untuk pod Redis dan pod Stress. Kemudian lakukan uji stres lagi dan bandingkan hasilnya.
apiVersion: v1 kind: Pod metadata: name: redis-demo labels: koordinator.sh/qosClass: 'LS' annotations: koordinator.sh/memoryQOS: '{"policy": "none"}' # Nonaktifkan memory QoS. spec: ... --- apiVersion: v1 kind: Pod metadata: name: stress-demo labels: koordinator.sh/qosClass: 'BE' annotations: koordinator.sh/memoryQOS: '{"policy": "none"}' # Nonaktifkan memory QoS.
Analisis Hasil
Tabel berikut menjelaskan hasil uji stres saat memory QoS diaktifkan dan dinonaktifkan.
Dinonaktifkan: Kebijakan memory QoS pod diatur ke
none.Diaktifkan: Kebijakan memory QoS pod diatur ke
autodan pengaturan memory QoS yang direkomendasikan digunakan.
Data dalam tabel berikut hanya untuk referensi. Data aktual yang dihasilkan dalam lingkungan pengujian Anda yang berlaku.
Metrik | Dinonaktifkan | Diaktifkan |
| 51,32 ms | 47,25 ms |
| 149,0 MB/s | 161,9 MB/s |
Tabel tersebut menunjukkan bahwa dalam skenario overcommitment memori, mengaktifkan fitur memory QoS mengurangi latensi aplikasi Redis sebesar 7,9% dan meningkatkan throughput sebesar 8,7%, dengan semua metrik menunjukkan peningkatan yang signifikan.
Parameter Lanjutan
Anda dapat mengaktifkan memory QoS untuk kontainer dalam pod atau kluster tertentu. Jika anotasi pod dan ConfigMaps digunakan untuk mengonfigurasi parameter memory QoS, anotasi pod akan didahulukan. Jika tidak ada anotasi pod yang ditambahkan untuk mengonfigurasi memory QoS, ack-koordinator mengambil parameter memory QoS dari ConfigMaps di namespace tertentu. Jika tidak ada konfigurasi yang ada di ConfigMaps dalam namespace, ack-koordinator mengambil parameter memory QoS dari ConfigMaps di kluster tertentu.
Kolom Anotasi dan ConfigMap menunjukkan apakah Anda dapat mengonfigurasi parameter menggunakan anotasi dan ConfigMap.
menunjukkan didukung dan
menunjukkan tidak didukung.
Parameter | Tipe | Rentang nilai | Deskripsi | Anotasi Pod | ConfigMap |
| Boolean |
|
|
|
|
| String |
|
|
|
|
| Int | 0~100 | Satuan: %. Nilai default: Parameter ini menentukan proporsi permintaan memori pod yang tidak dapat diambil kembali. Parameter ini cocok untuk skenario di mana aplikasi sensitif terhadap cache halaman. Anda dapat menggunakan parameter ini untuk menyimpan file ke cache untuk mengoptimalkan kinerja baca dan tulis. Untuk informasi lebih lanjut, lihat topik Alibaba Cloud Linux Fitur Memcg QoS antarmuka cgroup v1. Jumlah memori yang tidak dapat diambil kembali dihitung berdasarkan rumus berikut: |
|
|
| Int | 0~100 | Satuan: %. Nilai default: Parameter ini menentukan proporsi permintaan memori pod yang relatif tidak dapat diambil kembali. Untuk informasi lebih lanjut, lihat topik Alibaba Cloud Linux Fitur Memcg QoS antarmuka cgroup v1. Jumlah memori yang relatif tidak dapat diambil kembali dihitung berdasarkan rumus berikut: |
|
|
| Int | 0~100 | Satuan: %. Nilai default: Parameter ini menentukan ambang batas throttling memori untuk rasio penggunaan memori kontainer terhadap batas memori kontainer. Jika penggunaan memori kontainer melebihi ambang batas throttling memori, memori yang digunakan oleh kontainer akan diambil kembali. Parameter ini cocok untuk skenario overcommitment memori kontainer. Anda dapat menggunakan parameter ini untuk mencegah cgroups memicu OOM. Untuk informasi lebih lanjut, lihat topik Alibaba Cloud Linux Fitur Memcg QoS antarmuka cgroup v1. Ambang batas throttling untuk penggunaan memori dihitung berdasarkan rumus berikut: |
|
|
| Int | 0~100 | Satuan: %. Nilai default: Parameter ini menentukan ambang batas pengambilan kembali asinkron penggunaan memori terhadap batas memori atau penggunaan memori terhadap nilai Jika throttlingPercent dinonaktifkan, ambang batas pengambilan kembali untuk penggunaan memori dihitung berdasarkan rumus berikut: Nilai memory.wmark_high = Batas Memori × wmarkRatio/100. Jika throttlingPercent diaktifkan, ambang batas pengambilan kembali untuk penggunaan memori dihitung berdasarkan rumus berikut: |
|
|
| Int | -25~50 | Satuan: %. Nilai default adalah Parameter ini menentukan penyesuaian terhadap watermark minimum global untuk sebuah kontainer. Nilai negatif menurunkan watermark minimum global dan dengan demikian menunda pengambilan kembali memori untuk kontainer. Nilai positif meningkatkan watermark minimum global dan dengan demikian mempercepat pengambilan kembali memori untuk kontainer. Untuk informasi lebih lanjut, lihat topik Alibaba Cloud Linux Penilaian Watermark Minimum Global Memcg. Sebagai contoh, jika Anda membuat pod dengan kelas QoS LS, pengaturan default parameter ini adalah |
|
|
FAQ
Apakah fitur memory QoS yang diaktifkan berdasarkan versi lama protokol ack-slo-manager masih didukung setelah saya memutakhirkan dari ack-slo-manager ke ack-koordinator?
Dalam versi ack-slo-manager 0.8.0 dan sebelumnya, konfigurasi pod berikut digunakan:
Tetapkan kelas QoS melalui anotasi pod
alibabacloud.com/qosClassKonfigurasikan memory QoS melalui anotasi pod
alibabacloud.com/memoryQOS
ack-koordinator mempertahankan kompatibilitas mundur dengan protokol berbasis anotasi yang digunakan dalam ack-slo-manager. Anda dapat memutakhirkan dari ack-slo-manager ke ack-koordinator secara mulus. Namun, dukungan kompatibilitas berakhir pada 30 Juli 2023. Kami sarankan Anda memigrasikan parameter sumber daya ke yang baru.
Tabel berikut menjelaskan kompatibilitas antara versi komponen yang berbeda dan fitur memory QoS.
Versi Komponen | Protokol alibabacloud.com | Protokol koordinator.sh |
≥ 0.3.0 dan < 0.8.0 | ✓ | × |
≥ 0.8.0 | ✓ | ✓ |