Portal/Notes πŸ“
Cka

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 enabled

Tunggu 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           2Mi

Menentukan 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_MESSAGE

resources.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


Edit on GitHub

Last updated on

Pod: Manajemen Resources | Faisal Affan