ID localization for configure pod and container - assign memory resources
parent
564a49af07
commit
22da0faae1
|
@ -0,0 +1,367 @@
|
|||
---
|
||||
title: Menetapkan Sumber Daya Memori untuk Container dan Pod
|
||||
content_type: task
|
||||
weight: 10
|
||||
---
|
||||
|
||||
<!-- overview -->
|
||||
|
||||
Laman ini menunjukkan bagaimana menetapkan permintaan dan batasan memori untuk Container.
|
||||
Container dijamin memiliki memori sebanyak yang diminta,
|
||||
tetapi tidak diperbolehkan untuk menggunakan memori melebihi batas.
|
||||
|
||||
|
||||
|
||||
|
||||
## {{% heading "prerequisites" %}}
|
||||
|
||||
|
||||
{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}
|
||||
|
||||
Setiap Node pada klaster kamu harus memiliki memori setidaknya 300 MiB.
|
||||
|
||||
Beberapa langkah pada laman ini mengharuskan kamu menjalankan Service
|
||||
[_metrics-server_](https://github.com/kubernetes-incubator/metrics-server)
|
||||
pada klaster kamu. Jika kamu memiliki _metrics-server_
|
||||
yang sudah berjalan, kamu dapat melewati langkah-langkah berikut ini.
|
||||
|
||||
Jika kamu menjalankan Minikube, jalankan perintah berikut untuk mengaktifkan
|
||||
_metrics-server_:
|
||||
|
||||
```shell
|
||||
minikube addons enable metrics-server
|
||||
```
|
||||
|
||||
Untuk melihat apakah _metrics-server_ sudah berjalan, atau penyedia lain dari API metrik sumber daya
|
||||
(`metrics.k8s.io`), jalankan perintah berikut ini:
|
||||
|
||||
```shell
|
||||
kubectl get apiservices
|
||||
```
|
||||
|
||||
Jika API metrik sumber daya telah tersedia, keluarannya meliputi seperti
|
||||
acuan pada `metrics.k8s.io`.
|
||||
|
||||
```shell
|
||||
NAME
|
||||
v1beta1.metrics.k8s.io
|
||||
```
|
||||
|
||||
|
||||
|
||||
<!-- steps -->
|
||||
|
||||
## Membuat Namespace
|
||||
|
||||
Buat Namespace sehingga sumber daya yang kamu buat dalam latihan ini
|
||||
terisolasi dari klaster kamu yang lain.
|
||||
|
||||
```shell
|
||||
kubectl create namespace mem-example
|
||||
```
|
||||
|
||||
## Menentukan permintaan memori dan batasan memori
|
||||
|
||||
Untuk menentukan permintaan memori untuk Container, sertakan _field_ `resources:requests`
|
||||
pada manifes sumber daya dari Container. Untuk menentukan batasan memori, sertakan `resources:limits`.
|
||||
|
||||
Dalam latihan ini, kamu akan membuat Pod yang memiliki satu Container. Container memiliki permintaan memori
|
||||
sebesar 100 MiB dan batasan memori sebesar 200 MiB. Berikut berkas konfigurasi
|
||||
untuk Pod:
|
||||
|
||||
{{< codenew file="pods/resource/memory-request-limit.yaml" >}}
|
||||
|
||||
Bagian `args` dalam berkas konfigurasi memberikan argumen untuk Container pada saat dimulai.
|
||||
Argumen`"--vm-bytes", "150M"` memberi tahu Container agar mencoba mengalokasikan memori sebesar 150 MiB.
|
||||
|
||||
Buatlah Pod:
|
||||
|
||||
```shell
|
||||
kubectl apply -f https://k8s.io/examples/pods/resource/memory-request-limit.yaml --namespace=mem-example
|
||||
```
|
||||
|
||||
Verifikasi apakah Container dalam Pod sudah berjalan:
|
||||
|
||||
```shell
|
||||
kubectl get pod memory-demo --namespace=mem-example
|
||||
```
|
||||
|
||||
Lihat informasi mendetil tentang Pod:
|
||||
|
||||
```shell
|
||||
kubectl get pod memory-demo --output=yaml --namespace=mem-example
|
||||
```
|
||||
|
||||
Keluarannya menunjukkan bahwa satu Container dalam Pod memiliki permintaan memori sebesar 100 MiB
|
||||
dan batasan memori sebesar 200 MiB.
|
||||
|
||||
```yaml
|
||||
...
|
||||
resources:
|
||||
limits:
|
||||
memory: 200Mi
|
||||
requests:
|
||||
memory: 100Mi
|
||||
...
|
||||
```
|
||||
|
||||
Jalankan `kubectl top` untuk mengambil metrik dari Pod:
|
||||
|
||||
```shell
|
||||
kubectl top pod memory-demo --namespace=mem-example
|
||||
```
|
||||
|
||||
Keluarannya menunjukkan bahwa Pod menggunakan memori sekitar 162.900.000 byte, dimana
|
||||
sekitar 150 MiB. Ini lebih besar dari permintaannya sebesar 100 MiB Pod, tetapi masih di dalam
|
||||
batasan Pod sebesar 200 MiB.
|
||||
|
||||
|
||||
```
|
||||
NAME CPU(cores) MEMORY(bytes)
|
||||
memory-demo <something> 162856960
|
||||
```
|
||||
|
||||
Hapuslah Pod:
|
||||
|
||||
```shell
|
||||
kubectl delete pod memory-demo --namespace=mem-example
|
||||
```
|
||||
|
||||
## Melebihi batasan memori dari Container
|
||||
|
||||
Container dapat melebihi permintaan memorinya jika Node memiliki memori yang tersedia. Tapi sebuah Container
|
||||
tidak diperbolehkan untuk menggunakan lebih dari batasan memorinya. Jika Container mengalokasikan lebih banyak memori daripada
|
||||
batasannya, Container menjadi kandidat untuk dihentikan. Jika Container terus berlanjut
|
||||
mengkonsumsi memori melebihi batasnya, maka Container akan diakhiri. Jika Container dihentikan dan bisa
|
||||
di mulai ulang, kubelet akan memulai ulang, sama seperti jenis kegagalan _runtime_ yang lainnya.
|
||||
|
||||
Dalam latihan ini, kamu membuat Pod yang mencoba mengalokasikan lebih banyak memori dari batasannya.
|
||||
Berikut adalah berkas konfigurasi untuk Pod yang memiliki satu Container dengan berkas
|
||||
permintaan memori sebesar 50 MiB dan batasan memori sebesar 100 MiB:
|
||||
|
||||
{{< codenew file="pods/resource/memory-request-limit-2.yaml" >}}
|
||||
|
||||
Dalam bagian `args` dari berkas konfigurasi, kamu dapat melihat bahwa Container tersebut
|
||||
akan mencoba mengalokasikan memori sebesar 250 MiB, yang jauh di atas batas yaitu 100 MiB.
|
||||
|
||||
Buatlah Pod:
|
||||
|
||||
```shell
|
||||
kubectl apply -f https://k8s.io/examples/pods/resource/memory-request-limit-2.yaml --namespace=mem-example
|
||||
```
|
||||
|
||||
Lihat informasi mendetail tentang Pod:
|
||||
|
||||
```shell
|
||||
kubectl get pod memory-demo-2 --namespace=mem-example
|
||||
```
|
||||
|
||||
Sampai sini, Container mungkin sedang berjalan atau dimatikan. Ulangi perintah sebelumnya hingga Container dimatikan:
|
||||
|
||||
```shell
|
||||
NAME READY STATUS RESTARTS AGE
|
||||
memory-demo-2 0/1 OOMKilled 1 24s
|
||||
```
|
||||
|
||||
Dapatkan tampilan yang lebih mendetail tentang status Container:
|
||||
|
||||
```shell
|
||||
kubectl get pod memory-demo-2 --output=yaml --namespace=mem-example
|
||||
```
|
||||
|
||||
Keluarannya menunjukkan bahwa Container dimatikan karena kehabisan memori (OOM):
|
||||
|
||||
```shell
|
||||
lastState:
|
||||
terminated:
|
||||
containerID: docker://65183c1877aaec2e8427bc95609cc52677a454b56fcb24340dbd22917c23b10f
|
||||
exitCode: 137
|
||||
finishedAt: 2017-06-20T20:52:19Z
|
||||
reason: OOMKilled
|
||||
startedAt: null
|
||||
```
|
||||
|
||||
Container dalam latihan ini dapat dimulai ulang, sehingga kubelet akan memulai ulangnya. Ulangi
|
||||
perintah ini beberapa kali untuk melihat bahwa Container berulang kali dimatikan dan dimulai ulang:
|
||||
|
||||
```shell
|
||||
kubectl get pod memory-demo-2 --namespace=mem-example
|
||||
```
|
||||
|
||||
Keluarannya menunjukkan bahwa Container dimatikan, dimulai ulang, dimatikan lagi, dimulai ulang lagi, dan seterusnya:
|
||||
|
||||
```
|
||||
kubectl get pod memory-demo-2 --namespace=mem-example
|
||||
NAME READY STATUS RESTARTS AGE
|
||||
memory-demo-2 0/1 OOMKilled 1 37s
|
||||
```
|
||||
```
|
||||
|
||||
kubectl get pod memory-demo-2 --namespace=mem-example
|
||||
NAME READY STATUS RESTARTS AGE
|
||||
memory-demo-2 1/1 Running 2 40s
|
||||
```
|
||||
|
||||
Lihat informasi mendetail tentang riwayat Pod:
|
||||
|
||||
```
|
||||
kubectl describe pod memory-demo-2 --namespace=mem-example
|
||||
```
|
||||
|
||||
|
||||
Keluarannya menunjukkan bahwa Container dimulai dan gagal berulang kali:
|
||||
|
||||
```
|
||||
... Normal Created Created container with id 66a3a20aa7980e61be4922780bf9d24d1a1d8b7395c09861225b0eba1b1f8511
|
||||
... Warning BackOff Back-off restarting failed container
|
||||
```
|
||||
|
||||
Lihat informasi mendetail tentang Node klaster Anda:
|
||||
|
||||
```
|
||||
kubectl describe nodes
|
||||
```
|
||||
|
||||
Keluarannya mencakup rekaman Container yang dimatikan karena kondisi kehabisan memori:
|
||||
|
||||
|
||||
```
|
||||
Warning OOMKilling Memory cgroup out of memory: Kill process 4481 (stress) score 1994 or sacrifice child
|
||||
```
|
||||
|
||||
Hapus Pod kamu:
|
||||
|
||||
```shell
|
||||
kubectl delete pod memory-demo-2 --namespace=mem-example
|
||||
```
|
||||
|
||||
## Menentukan permintaan memori yang terlalu besar untuk Node kamu
|
||||
|
||||
Permintaan dan batasan memori yang dikaitkan dengan Container, berguna untuk berpikir
|
||||
apakah sebuah Pod yang memiliki permintaan dan batasan memori. Permintaan memori untuk Pod tersebut adalah
|
||||
jumlah permintaan memori untuk semua Container dalam Pod. Begitu juga dengan batasan memori
|
||||
untuk Pod adalah jumlah batasan memori dari semua Container di dalam Pod.
|
||||
|
||||
Penjadwalan Pod didasarkan pada permintaan. Sebuah Pod dijadwalkan untuk berjalan di sebuah Node hanya jika sebuah Node
|
||||
memiliki cukup memori yang tersedia untuk memenuhi permintaan memori dari Pod tersebut.
|
||||
|
||||
Dalam latihan ini, kamu membuat Pod yang memiliki permintaan memori yang sangat besar sehingga melebihi
|
||||
kapasitas dari Node mana pun dalam klaster kamu. Berikut adalah berkas konfigurasi untuk Pod yang memiliki
|
||||
Container dengan permintaan memori 1000 GiB, yang kemungkinan besar melebihi kapasitas
|
||||
dari setiap Node dalam klaster kamu.
|
||||
|
||||
{{< codenew file="pods/resource/memory-request-limit-3.yaml" >}}
|
||||
|
||||
Buatlah Pod:
|
||||
|
||||
```shell
|
||||
kubectl apply -f https://k8s.io/examples/pods/resource/memory-request-limit-3.yaml --namespace=mem-example
|
||||
```
|
||||
|
||||
Lihat status Pod:
|
||||
|
||||
```shell
|
||||
kubectl get pod memory-demo-3 --namespace=mem-example
|
||||
```
|
||||
|
||||
Keluarannya menunjukkan bahwa status Pod adalah PENDING. Artinya, Pod tidak dijadwalkan untuk berjalan di Node mana pun, dan Pod akan tetap dalam status PENDING tanpa batas waktu:
|
||||
|
||||
```
|
||||
kubectl get pod memory-demo-3 --namespace=mem-example
|
||||
NAME READY STATUS RESTARTS AGE
|
||||
memory-demo-3 0/1 Pending 0 25s
|
||||
```
|
||||
|
||||
Lihat informasi mendetail tentang Pod, termasuk _event_:
|
||||
|
||||
```shell
|
||||
kubectl describe pod memory-demo-3 --namespace=mem-example
|
||||
```
|
||||
|
||||
Keluarannya menunjukkan bahwa Container tidak dapat dijadwalkan karena memori yang tidak cukup pada Node:
|
||||
|
||||
```shell
|
||||
Events:
|
||||
... Reason Message
|
||||
------ -------
|
||||
... FailedScheduling No nodes are available that match all of the following predicates:: Insufficient memory (3).
|
||||
```
|
||||
|
||||
## Satuan Memori
|
||||
|
||||
Sumber daya memori diukur dalam satuan _byte_. Kamu dapat mengekspresikan memori sebagai bilangan bulat biasa atau
|
||||
bilangan bulan _fixed-point_ dengan salah satu akhiran ini: E, P, T, G, M, K, Ei, Pi, Ti, Gi, Mi, Ki.
|
||||
Contoh berikut ini mewakili nilai yang kira-kira sama:
|
||||
|
||||
```shell
|
||||
128974848, 129e6, 129M , 123Mi
|
||||
```
|
||||
|
||||
Hapuslah Pod kamu:
|
||||
|
||||
```shell
|
||||
kubectl delete pod memory-demo-3 --namespace=mem-example
|
||||
```
|
||||
|
||||
## Jika kamu tidak menentukan batasan memori
|
||||
|
||||
Jika kamu tidak menentukan batasan memori untuk sebuah Container, salah satu dari situasi berikut ini berlaku:
|
||||
|
||||
* Container tidak memiliki batasan maksimum jumlah memori yang digunakannya. Container
|
||||
dapat menggunakan semua memori yang tersedia dalam Node dimana Container itu berjalan yang pada gilirannya dapat memanggil penyetop OOM (_out-of-memory_).
|
||||
Lebih lanjut, dalam kasus menghentikan OOM, Container tanpa batas sumber daya akan memiliki peluang lebih besar untuk dihentikan.
|
||||
|
||||
* Container berjalan pada Namespace yang memiliki batasan bawaan memori, dan
|
||||
Container secara otomatis menetapkan batasan bawaan. Administrator klaster dapat menggunakan
|
||||
[LimitRange](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#limitrange-v1-core)
|
||||
untuk menentukan batasan memori secara bawaan.
|
||||
|
||||
## Motivasi untuk permintaan dan batasan memori
|
||||
|
||||
Dengan mengonfigurasi permintaan dan batasan memori untuk Container yang berjalan pada berkas
|
||||
klaster, kamu dapat menggunakan sumber daya memori yang tersedia pada Node klaster kamu secara efisien.
|
||||
Dengan menjaga permintaan memori pada Pod tetap rendah, kamu memberikan kesempatan yang baik untuk Pod tersebut
|
||||
dijadwalkan. Dengan memiliki batas memori yang lebih besar dari permintaan memori, Anda mencapai dua hal:
|
||||
|
||||
* Pod dapat memiliki aktivitas yang bersifat _burst_ dengan memanfaatkan memori yang kebetulan tersedia.
|
||||
* Jumlah memori yang dapat digunakan Pod selama keadaan _burst_ dibatasi pada jumlah yang wajar.
|
||||
|
||||
## Membersihkan
|
||||
|
||||
Hapus Namespace kamu. Ini akan menghapus semua Pod yang kamu buat untuk tugas ini:
|
||||
|
||||
```shell
|
||||
kubectl delete namespace mem-example
|
||||
```
|
||||
|
||||
|
||||
|
||||
## {{% heading "whatsnext" %}}
|
||||
|
||||
|
||||
### Untuk pengembang aplikasi
|
||||
|
||||
* [Menetapkan sumber daya CPU ke Container dan Pod](/docs/tasks/configure-pod-container/assign-cpu-resource/)
|
||||
|
||||
* [Mengonfigurasi _Quality of Service_ untuk Pod](/docs/tasks/configure-pod-container/quality-service-pod/)
|
||||
|
||||
### Untuk administrator klaster
|
||||
|
||||
* [Mengonfigurasi permintaan dan batasan bawaan memori untuk Namespace](/id/docs/tasks/administer-cluster/manage-resources/memory-default-namespace/)
|
||||
|
||||
* [Mengonfigurasi permintaan dan batasan bawaan CPU untuk Namespace](/id/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace/)
|
||||
|
||||
* [Mengonfigurasi batasan memori minimum dan maksimum untuk Namespace](/id/docs/tasks/administer-cluster/manage-resources/memory-constraint-namespace/)
|
||||
|
||||
* [Mengonfigurasi batasan CPU minimum dan maksimum untuk Namespace](/id/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace/)
|
||||
|
||||
* [Mengonfigurasi kuota CPU dan memori untuk Namespace](/id/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/)
|
||||
|
||||
* [Mengonfigurasi kuota Pod untuk Namespace](/id/docs/tasks/administer-cluster/manage-resources/quota-pod-namespace/)
|
||||
|
||||
* [Mengonfigurasi kuota untuk objek API](/id/docs/tasks/administer-cluster/quota-api-object/)
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: memory-demo-2
|
||||
namespace: mem-example
|
||||
spec:
|
||||
containers:
|
||||
- name: memory-demo-2-ctr
|
||||
image: polinux/stress
|
||||
resources:
|
||||
requests:
|
||||
memory: "50Mi"
|
||||
limits:
|
||||
memory: "100Mi"
|
||||
command: ["stress"]
|
||||
args: ["--vm", "1", "--vm-bytes", "250M", "--vm-hang", "1"]
|
|
@ -0,0 +1,16 @@
|
|||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: memory-demo-3
|
||||
namespace: mem-example
|
||||
spec:
|
||||
containers:
|
||||
- name: memory-demo-3-ctr
|
||||
image: polinux/stress
|
||||
resources:
|
||||
limits:
|
||||
memory: "1000Gi"
|
||||
requests:
|
||||
memory: "1000Gi"
|
||||
command: ["stress"]
|
||||
args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]
|
|
@ -0,0 +1,16 @@
|
|||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: memory-demo
|
||||
namespace: mem-example
|
||||
spec:
|
||||
containers:
|
||||
- name: memory-demo-ctr
|
||||
image: polinux/stress
|
||||
resources:
|
||||
limits:
|
||||
memory: "200Mi"
|
||||
requests:
|
||||
memory: "100Mi"
|
||||
command: ["stress"]
|
||||
args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]
|
Loading…
Reference in New Issue