Pod: Manajemen Resources
Versi Bahasa Indonesia. Baca dalam Bahasa Inggris
Di Kubernetes, kita dapat menentukan request dan limit CPU serta memory untuk setiap container menggunakan field resources dalam spesifikasi Deployment atau Pod.
Mengapa Ini Penting?
Jika kita tidak menentukan batasan CPU dan Memory, Container tidak memiliki batas atas pada resource yang dapat digunakan. Container dapat menggunakan semua sumber daya CPU dan Memory yang tersedia pada Node tempat ia berjalan.
Jika Container berjalan di namespace yang memiliki batasan CPU atau Memory default, Container secara otomatis akan mendapatkan limit default. Administrator klaster dapat menggunakan LimitRange untuk menentukan nilai default untuk batasan CPU dan Memory.
Bayangkan kita memiliki beberapa service, dan salah satu service kita sedang mengalami serangan DDoS. Jika kita tidak membatasi resource, pod service tersebut akan mengonsumsi semua resource yang tersedia dan mengganggu service lain yang kita miliki di node tersebut.
Mengaktifkan Metrics Server
Pertama, kita perlu mengaktifkan minikube metrics server menggunakan perintah ini.
β minikube addons enable metrics-server
π‘ metrics-server is an addon maintained by Kubernetes. For any concerns contact minikube on GitHub.
You can view the list of minikube maintainers at: https://github.com/kubernetes/minikube/blob/master/OWNERS
βͺ Using image registry.k8s.io/metrics-server/metrics-server:v0.7.2
π The 'metrics-server' addon is enabledTunggu beberapa detik hingga data metrics terisi. Kita dapat memeriksa penggunaan resource pod menggunakan perintah ini.
β kubectl top pod
NAME CPU(cores) MEMORY(bytes)
simple-go-685974475c-7484x 1m 2Mi
simple-go-685974475c-87ccm 1m 2Mi
simple-go-685974475c-d2kdv 1m 2MiMenentukan Batasan Resource
Anda mendefinisikan request dan limit resource dalam spesifikasi container di dalam Pod atau Deployment. Mari kita buka file deployment deployment.yaml. Tambahkan bagian resources di container server seperti ini.
apiVersion: apps/v1
kind: Deployment
metadata:
name: simple-go
labels:
app: simple-go
spec:
replicas: 3
selector:
matchLabels:
app: simple-go
template:
metadata:
labels:
app: simple-go
spec:
containers:
- name: server
image: simple-go:latest
imagePullPolicy: Never
resources:
requests:
memory: "16Mi" # Minimum memory guaranteed
cpu: "10m" # Minimum CPU guaranteed
limits:
memory: "64Mi" # Maximum memory allowed
cpu: "30m" # Maximum CPU allowed
ports:
- containerPort: 8080
env:
- name: DEFAULT_MESSAGE
valueFrom:
configMapKeyRef:
name: simple-go-config
key: DEFAULT_MESSAGEresources.requests
- Kubernetes menjamin jumlah resource ini untuk container.
- Digunakan untuk penjadwalan Pod (yaitu, untuk memutuskan node mana yang dapat menjalankan Pod).
resources.limits
- Mendefinisikan resource maksimum yang dapat digunakan container.
- Jika container mencoba melebihi batas ini:
- Memory: Container dihentikan dengan error OutOfMemory (OOM).
- CPU: Container dibatasi (dithrottle ke CPU yang ditentukan).
Menerapkan dan Memvalidasi
Mari kita terapkan deployment lagi menggunakan kubectl apply -f deployment.yaml. Kumpulan pod baru akan berjalan. Kemudian kita dapat memvalidasi apakah pod kita memiliki limit yang benar menggunakan perintah describe.
β kubectl describe pods simple-go-685974475c-7484x
Name: simple-go-685974475c-7484x
Namespace: default
Priority: 0
Service Account: default
Node: minikube/192.168.49.2
Start Time: Mon, 27 Jan 2025 21:41:50 +0700
Labels: app=simple-go
pod-template-hash=685974475c
Annotations: <none>
Status: Running
IP: 10.244.0.35
IPs:
IP: 10.244.0.35
Controlled By: ReplicaSet/simple-go-685974475c
Containers:
server:
Container ID: docker://abcf9833e078e1af850ffd2e26ffcc32edd42b48ba653fe0e9c0861b769a9f6b
Image: simple-go:latest
Image ID: docker://sha256:534128017b433fa09e637cb2d943f7057a809c244632390bc75378a32dc3b12e
Port: 8080/TCP
Host Port: 0/TCP
State: Running
Started: Mon, 27 Jan 2025 21:41:52 +0700
Ready: True
Restart Count: 0
Limits:
cpu: 30m
memory: 64Mi
Requests:
cpu: 10m
memory: 16Mi
Environment:
DEFAULT_MESSAGE: <set to the key 'DEFAULT_MESSAGE' of config map 'simple-go-config'> Optional: false
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-rznfx (ro)
Conditions:
Type Status
PodReadyToStartContainers True
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
kube-api-access-rznfx:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: Burstable
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events: <none>Kita dapat melihat di atas bahwa request dan limit resource sudah diatur dengan benar. Selanjutnya kita akan belajar tentang horizontal pod scaling (HPA) sehingga service kita dapat membuat pod baru jika kita mendapatkan peningkatan traffic yang tidak dapat ditangani oleh pod yang ada.
Pod Resource
Di Kubernetes versi v1.32 (masih dalam alpha) kita dapat menentukan alokasi resource di tingkat Pod alih-alih Container. Ini sangat berguna jika kita memiliki beberapa container, sehingga kita hanya perlu menentukan alokasi resource sekali di tingkat Pod. Anda dapat membaca lebih lanjut tentang ini di sini.
Referensi
- https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
- https://kubernetes.io/docs/tasks/configure-pod-container/assign-cpu-resource/
Last updated on