Skip to content

Commit

Permalink
ID localization for administer cluster - sysctl
Browse files Browse the repository at this point in the history
  • Loading branch information
ariscahyadi committed Jul 31, 2020
1 parent e04381a commit 83c4b60
Showing 1 changed file with 210 additions and 0 deletions.
210 changes: 210 additions & 0 deletions content/id/docs/tasks/administer-cluster/sysctl-cluster.md
@@ -0,0 +1,210 @@
---
title: Menggunakan sysctl dalam Sebuah Klaster Kubernetes
content_type: task
---

<!-- overview -->
{{< feature-state for_k8s_version="v1.12" state="beta" >}}

Dokumen ini menjelaskan tentang cara mengonfigurasi dan menggunakan parameter kernel dalam sebuah
klaster Kubernetes dengan menggunakan antarmuka {{< glossary_tooltip term_id="sysctl" >}}.



## {{% heading "prerequisites" %}}


{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}



<!-- steps -->

## Melihat Daftar Semua Parameter Sysctl

Dalam Linux, antarmuka sysctl memungkinkan administrator untuk memodifikasi kernel
parameter pada _runtime_. Parameter tersedia melalui sistem file virtual dari proses `/proc/sys/`.
Parameter mencakup berbagai subsistem seperti:

- kernel (dengan prefiks umum: `kernel.`)
- networking (dengan prefiks umum: `net.`)
- virtual memory (dengan prefiks umum: `vm.`)
- MDADM (dengan prefiks umum: `dev.`)
- subsistem yang lainnya dideskripsikan pada [dokumentasi Kernel](https://www.kernel.org/doc/Documentation/sysctl/README).

Untuk mendapatkan daftar semua parameter, kamu bisa menjalankan perintah:

```shell
sudo sysctl -a
```

## Mengaktifkan Sysctl _Unsafe_

Sysctl dikelompokkan menjadi sysctl _safe_ dan sysctl _unsafe_. Sebagai tambahan untuk
pengaturan _Namespace_ yang benar, sebuah sysctl _safe_ harus diisolasikan dengan benar diantara Pod dalam Node yang sama.
Hal ini berarti mengatur sysctl _safe_ dalam satu Pod:

- tidak boleh mempengaruhi Pod lain dalam Node
- tidak boleh membahayakan kesehatan dari Node
- tidak mengizinkan untuk mendapatkan sumber daya CPU atau memori di luar batas sumber daya dari sebuah Pod.


Sejauh ini, sebagian besar sysctl yang diatur sebagai Namespace belum tentu dianggap sysctl _safe_.
Sysctl berikut ini didukung dalam kelompok _safe_:

- `kernel.shm_rmid_forced`,
- `net.ipv4.ip_local_port_range`,
- `net.ipv4.tcp_syncookies`,
- `net.ipv4.ping_group_range` (sejak Kubernetes 1.18).

{{< note >}}
Contoh `net.ipv4.tcp_syncookies` bukan merupakan Namespace pada kernel Linux versi 4.4 atau lebih rendah.

Daftar ini akan terus dikembangkan dalam versi Kubernetes berikutnya ketika kubelet
mendukung mekanisme isolasi yang lebih baik.

Semua sysctl _safe_ diaktifkan secara bawaan.

Semua sysctl _unsafe_ dinon-aktifkan secara bawaan dan harus diizinkan secara manual oleh
administrator klaster untuk setiap Node. Pod dengan sysctl _unsafe_ yang dinon-aktifkan akan dijadwalkan,
tetapi akan gagal untuk dijalankan.

Dengan mengingat peringatan di atas, administrator klaster dapat mengizinkan sysctl _unsafe_ tertentu
untuk situasi yang sangat spesial seperti pada saat kinerja tinggi atau
penyetelan aplikasi secara _real-time_. _Unsafe_ syctl diaktifkan Node demi Node melalui
_flag_ pada kubelet; sebagai contoh:

```shell
kubelet --allowed-unsafe-sysctls \
'kernel.msg*,net.core.somaxconn' ...
```

Untuk {{< glossary_tooltip term_id="minikube" >}}, ini dapat dilakukan melalui _flag_ `extra-config`:

```shell
minikube start --extra-config="kubelet.allowed-unsafe-sysctls=kernel.msg*,net.core.somaxconn"...
```

Hanya sysctl yang diatur sebagai Namespace dapat diaktifkan dengan cara ini.

## Mnegatur Sysctl untuk Pod

Sejumlah sysctl adalah diatur sebagai Namespace dalam Kernel Linux hari ini. Ini berarti
mereka dapat diatur secara independen untuk setiap Pod dalam sebuah Node. Hanya sysctl dengan Namespace
yang dapat dikonfigurasi melalui Pod securityContext dalam Kubernetes.

Sysctl berikut dikenal sebagai Namespace. Daftar ini dapat berubah
pada versi kernel Linux yang akan datang.

- `kernel.shm*`,
- `kernel.msg*`,
- `kernel.sem`,
- `fs.mqueue.*`,
- Parameter dibawah `net.*` dapat diatur sebagai Namespace dari _container networking_
Namun, ada beberapa perkecualian (seperti
`net.netfilter.nf_conntrack_max` dan `net.netfilter.nf_conntrack_expect_max`
yang dapat diatur dalam Namespace _container networking_ padahal bukan merupakan Namespace).

Sysctl tanpa Namespace disebut dengan sysctl _node-level_. Jika kamu perlu mengatur
mereka, kamu harus secara manual mengonfigurasi mereka pada sistem operasi setiap Node, atau dengan
menggunakan DaemonSet melalui Container yang berwenang.

Gunakan securityContext dari Pod untuk mengonfigurasi sysctl Namespace. securityContext
berlaku untuk semua Container dalam Pod yang sama.


Contoh ini menggunakan securityContext dari Pod untuk mengatur sebuah sysctl _safe_
`kernel.shm_rmid_forced`, dan dua buah sysctl _unsafe_ `net.core.somaxconn` dan
`kernel.msgmax`. Tidak ada perbedaan antara sysctl _safe_ dan sysctl _unsafe_ dalam
spesifikasi tersebut.

{{< warning >}}
Hanya modifikasi parameter sysctl setelah kamu memahami efeknya, untuk menghindari
gangguan pada kestabilan sistem operasi kamu.
{{< /warning >}}

```yaml
apiVersion: v1
kind: Pod
metadata:
name: sysctl-example
spec:
securityContext:
sysctls:
- name: kernel.shm_rmid_forced
value: "0"
- name: net.core.somaxconn
value: "1024"
- name: kernel.msgmax
value: "65536"
...
```


<!-- discussion -->

{{< warning >}}
Karena sifat alami dari sysctl _unsafe_, penggunaan sysctl _unsafe_
merupakan resiko kamu sendiri dan dapat menyebabkan masalah parah seperti perilaku yang salah
pada Container, kekurangan sumber daya, atau kerusakan total dari Node.
{{< /warning >}}

Merupakan sebuah praktik yang baik untuk mempertimbangkan Node dengan pengaturan sysctl khusus sebagai
Node yang tercemar (_tainted_) dalam sebuah cluster, dan hanya menjadwalkan Pod yang membutuhkan pengaturan sysctl.
Sangat disarankan untuk menggunakan Kubernetes [fitur _taints and toleration_](/docs/reference/generated/kubectl/kubectl-commands/#taint) untuk mengimplementasikannya.

Pod dengan sysctl _unsafe_ akan gagal diluncurkan pada sembarang Node yang belum
mengaktifkan kedua sysctl _unsafe_ secara eksplisit. Seperti halnya sysctl _node-level_ sangat
disarankan untuk menggunakan [fitur _taints and toleration_](/docs/reference/generated/kubectl/kubectl-commands/#taint) atau
[pencemaran dalam Node](/docs/concepts/scheduling-eviction/taint-and-toleration/)
untuk Pod dalam Node yang tepat.

## PodSecurityPolicy

Kamu selanjutnya dapat mengontrol sysctl mana saja yang dapat diatur dalam Pod dengan menentukan daftar
sysctl atau pola (_pattern_) sysctl dalam `forbiddenSysctls` dan/atau _field_
`allowedUnsafeSysctls` dari PodSecurityPolicy. Pola sysctl diakhiri
dengan karakter `*`, seperti `kernel.*`. Karakter `*` saja akan mencakup
semua sysctl.

Secara bawaan, semua sysctl _safe_ diizinkan.

Kedua `forbiddenSysctls` dan `allowedUnsafeSysctls` merupakan daftar dari nama sysctl
atau pola sysctl yang polos (yang diakhiri dengan karakter `*`). Karakter `*` saja berarti sesuai dengan semua sysctl.

_Field_ `forbiddenSysctls` tidak memasukkan sysctl tertentu. Kamu dapat melarang
kombinasi sysctl _safe_ dan sysctl _unsafe_ dalam daftar tersebut. Untuk melarang pengaturan
sysctl, hanya gunakan `*` saja.

Jika kamu menyebutkan sysctl _unsafe_ pada _field_ `allowedUnsafeSysctls` dan
tidak ada pada _field_ `forbiddenSysctls`, maka sysctl dapat digunakan pada Pod
dengan menggunakan PodSecurityPolicy ini. Untuk mengizinkan semua sysctl _unsafe_ diatur dalam
PodSecurityPolicy, gunakan karakter `*` saja.

Jangan mengonfigurasi kedua _field_ ini sampai tumpang tindih, dimana
sysctl yang diberikan akan diperbolehkan dan dilarang sekaligus.

{{< warning >}}
Jika kamu mengizinkan sysctl _unsafe_ melalui _field_ `allowUnsafeSysctls`
pada PodSecurityPolicy, Pod apa pun yang menggunakan sysctl seperti itu akan gagal dimulai
jika sysctl _unsafe_ tidak diperbolehkan dalam _flag_ kubelet `--allowed-unsafe-sysctls`
pada Node tersebut.
{{< /warning >}}

Ini merupakan contoh sysctl _unsafe_ yang diawali dengan `kernel.msg` yang diperbolehkan dan
sysctl `kernel.shm_rmid_forced` yang dilarang.

```yaml
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: sysctl-psp
spec:
allowedUnsafeSysctls:
- kernel.msg*
forbiddenSysctls:
- kernel.shm_rmid_forced
...
```


0 comments on commit 83c4b60

Please sign in to comment.