Skip to content

Commit

Permalink
ID localization for configure pod and container - assign memory resou…
Browse files Browse the repository at this point in the history
…rces
  • Loading branch information
ariscahyadi committed Sep 12, 2020
1 parent 564a49a commit 22da0fa
Show file tree
Hide file tree
Showing 4 changed files with 415 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -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/)





16 changes: 16 additions & 0 deletions content/id/examples/pods/resource/memory-request-limit-2.yaml
Original file line number Diff line number Diff line change
@@ -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"]
Loading

0 comments on commit 22da0fa

Please sign in to comment.