Container Compute Service (ACS) menggunakan mekanisme ResourceQuota dari Kubernetes open source untuk membatasi dan mengontrol penggunaan sumber daya dalam namespace. ResourceQuotas dapat digunakan untuk membatasi dan memantau penggunaan berbagai sumber daya dalam namespace, seperti penggunaan CPU, memori, dan penyimpanan, jumlah pod replika, serta jumlah Services. Hal ini membantu mencegah aplikasi lain menempati terlalu banyak sumber daya di namespace dan memastikan stabilitas serta keandalan aplikasi Anda.
ResourceQuota
Anda dapat menggunakan mekanisme ResourceQuota dari Kubernetes open source di kluster ACS untuk mengontrol total penggunaan sumber daya setiap namespace. Anda dapat mendefinisikan ResourceQuota guna membatasi batas atas suatu sumber daya dalam namespace, seperti CPU, memori, dan sumber daya tambahan. Saat membuat sumber daya Kubernetes seperti pod dan Services dalam namespace, sistem kuota Kubernetes melacak penggunaan sumber daya kluster dan memastikan bahwa total penggunaan tidak melebihi batas sumber daya keras yang didefinisikan dalam ResourceQuota namespace tersebut.
Saat menggunakan ResourceQuota, perhatikan hal-hal berikut:
Setiap tim atau aplikasi memerlukan namespace terpisah.
Administrator kluster perlu membuat satu atau lebih ResourceQuotas untuk setiap namespace.
Jika penggunaan sumber daya melebihi batas sumber daya keras dari ResourceQuota, permintaan pembuatan sumber daya Kubernetes berikutnya akan ditolak.
Jika Anda mengonfigurasi kuota CPU dan memori dalam ResourceQuota, Anda harus mengonfigurasi permintaan dan batas sumber daya untuk pod yang ingin dibuat. Jika tidak, pod tidak dapat dibuat.
Anda tidak perlu mengonfigurasi permintaan atau batas sumber daya untuk sumber daya lain, seperti sumber daya tambahan. Catatan: Anda dapat menggunakan pengontrol admission LimitRanger untuk mengonfigurasi batas sumber daya default bagi pod yang tidak dikonfigurasi dengan permintaan sumber daya.
Nama ResourceQuota harus merupakan DNS subdomain yang valid.
Setelah Anda memodifikasi ResourceQuota, modifikasi tersebut tidak berlaku untuk sumber daya yang sudah menggunakan ResourceQuota.
Aktifkan fitur ResourceQuota
Secara default, fitur ResourceQuota diaktifkan untuk kluster Container Service for Kubernetes (ACK) yang dibuat di konsol ACS. Anda hanya perlu membuat ResourceQuota di namespace, dan fitur ResourceQuota akan aktif untuk namespace tersebut.
Tipe sumber daya yang didukung
ACS sepenuhnya kompatibel dengan mekanisme ResourceQuota dari Kubernetes open source. Oleh karena itu, baik sumber daya standar maupun sumber daya tambahan mendukung ResourceQuotas.
Sumber daya standar
Sumber daya | Deskripsi |
limits.cpu | Penggunaan CPU pod yang tidak dalam status Terminated tidak boleh melebihi batas ini. |
limits.memory | Penggunaan memori pod yang tidak dalam status Terminated tidak boleh melebihi batas ini. |
requests.cpu | Permintaan CPU pod yang tidak dalam status Terminated tidak boleh melebihi batas ini. |
requests.memory | Permintaan memori pod yang tidak dalam status Terminated tidak boleh melebihi batas ini. |
enormouspages-<ukuran> | Ukuran permintaan EnormousPage pod yang tidak dalam status Terminated tidak boleh melebihi batas ini. |
cpu | Ekuivalen dengan |
memory | Ekuivalen dengan |
Sumber daya tambahan
Kubernetes tidak mendukung overcommitment sumber daya tambahan (limit > request). Oleh karena itu, Anda hanya perlu mengonfigurasi kuota sumber daya yang dimulai dengan requests.. Untuk informasi lebih lanjut, lihat Kuota Sumber Daya.
Contoh
Contoh ini menunjukkan cara menggunakan kubectl untuk melihat dan membuat ResourceQuotas.
Jalankan perintah berikut untuk membuat namespace bernama test:
Buat ResourceQuota untuk menetapkan batas CPU Namespace bernama test menjadi 4000 millicores.
Jalankan perintah berikut untuk menanyakan ResourceQuota:
kubectl -n test describe resourcequota test-quotaHasil yang Diharapkan:
Namespace: test Resource Used Hard -------- ---- ---- limits.cpu 0 4 requests.cpu 0 4Buat empat pod. Setiap pod dapat menggunakan hingga 1000 millicores.
Jalankan perintah berikut untuk menanyakan pod:
kubectl -n test get podHasil yang Diharapkan:
NAME READY STATUS RESTARTS AGE test-app-5ddxxxxx94-jdv4m 1/1 Running 0 35s test-app-5ddxxxxx94-jhmtb 1/1 Running 0 35s test-app-5ddxxxxx94-mr8vq 1/1 Running 0 35s test-app-5ddxxxxx94-pjdfn 1/1 Running 0 35sKeluaran menunjukkan bahwa keempat pod berada dalam status Running.
Jalankan perintah berikut untuk menanyakan status ResourceQuota:
kubectl -n test describe resourcequotaHasil yang Diharapkan:
Name: test-quota Namespace: test Resource Used Hard -------- ---- ---- limits.cpu 4 4 requests.cpu 4 4Nilai pada kolom Used sama dengan nilai pada kolom Hard.
Buat pod lain. Permintaan pembuatan pod dicegat oleh pengontrol admission ResourceQuota.
Buat pod.
kubectl -n test scale deploy test-app --replicas 5Tanyakan ReplicaSet. Kolom DESIRED menampilkan 5 tetapi kolom CURRENT menampilkan 4. Ini menunjukkan bahwa sebuah pod gagal dibuat.
kubectl -n test get rsHasil yang Diharapkan:
NAME DESIRED CURRENT READY AGE test-app-5ddxxxxx94 5 4 4 3m10sTanyakan peristiwa ReplicaSet. Keluaran menunjukkan bahwa pod baru dicegat oleh pengontrol admission ResourceQuota.
kubectl -n test describe rs test-app-5ddxxxxx94Hasil yang Diharapkan:
Name: test-app-5ddc68c994 Namespace: test Selector: app=test-app,pod-template-hash=5ddc68c994 Labels: app=test-app pod-template-hash=5ddc68c994 Annotations: deployment.kubernetes.io/desired-replicas: 5 deployment.kubernetes.io/max-replicas: 7 deployment.kubernetes.io/revision: 1 Controlled By: Deployment/test-app Replicas: 4 current / 5 desired Pods Status: 4 Running / 0 Waiting / 0 Succeeded / 0 Failed Pod Template: Labels: app=test-app pod-template-hash=5ddc68c994 Containers: test: Image: busybox:latest Port: <none> Host Port: <none> Command: sleep 360000000 Limits: cpu: 1 Environment: <none> Mounts: <none> Volumes: <none> Conditions: Type Status Reason ---- ------ ------ ReplicaFailure True FailedCreate Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulCreate 3m18s replicaset-controller Created pod: test-app-5ddc68c994-pjdfn Normal SuccessfulCreate 3m18s replicaset-controller Created pod: test-app-5ddc68c994-jdv4m Normal SuccessfulCreate 3m18s replicaset-controller Created pod: test-app-5ddc68c994-jhmtb Normal SuccessfulCreate 3m18s replicaset-controller Created pod: test-app-5ddc68c994-mr8vq Warning FailedCreate 3m18s replicaset-controller Error creating: pods "test-app-5ddc68c994-5s4ph" is forbidden: exceeded quota: test-quota, requested: limits.cpu=1,requests.cpu=1, used: limits.cpu=4,requests.cpu=4, limited: limits.cpu=4,requests.cpu=
kubectl create namespace testcat << EOF | kubectl apply -f -
apiVersion: v1
kind: ResourceQuota
metadata:
name: test-quota
namespace: test
spec:
hard:
requests.cpu: "4000m"
limits.cpu: "4000m"
EOFcat << EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: test-app
name: test-app
namespace: test
spec:
replicas: 5
selector:
matchLabels:
app: test-app
template:
metadata:
labels:
app: test-app
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2
imagePullPolicy: IfNotPresent
name: test
command:
- sleep
- "360000000"
resources:
limits:
cpu: "1"
EOF