|
| 1 | +--- |
| 2 | +title: Menginstal kubeadm |
| 3 | +content_type: task |
| 4 | +weight: 10 |
| 5 | +card: |
| 6 | + name: setup |
| 7 | + weight: 20 |
| 8 | + title: Menginstal alat persiapan kubeadm |
| 9 | +--- |
| 10 | + |
| 11 | +<!-- overview --> |
| 12 | + |
| 13 | +<img src="https://raw.githubusercontent.com/kubernetes/kubeadm/master/logos/stacked/color/kubeadm-stacked-color.png" align="right" width="150px">Laman ini menunjukkan cara untuk menginstal `kubeadm`. |
| 14 | +Untuk informasi mengenai cara membuat sebuah klaster dengan kubeadm setelah kamu melakukan proses instalasi ini, lihat laman [Menggunakan kubeadm untuk Membuat Sebuah Klaster](/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/). |
| 15 | + |
| 16 | + |
| 17 | + |
| 18 | +## {{% heading "prerequisites" %}} |
| 19 | + |
| 20 | + |
| 21 | +* Satu mesin atau lebih yang menjalankan: |
| 22 | + - Ubuntu 16.04+ |
| 23 | + - Debian 9+ |
| 24 | + - CentOS 7 |
| 25 | + - Red Hat Enterprise Linux (RHEL) 7 |
| 26 | + - Fedora 25+ |
| 27 | + - HypriotOS v1.0.1+ |
| 28 | + - Container Linux (teruji pada versi 1800.6.0) |
| 29 | +* 2 GB RAM atau lebih per mesin (kurang dari nilai tersebut akan menyisakan sedikit ruang untuk |
| 30 | + aplikasi-aplikasimu) |
| 31 | +* 2 CPU atau lebih |
| 32 | +* Koneksi internet pada seluruh mesin pada klaster (kamu dapat menggunakan internet |
| 33 | + publik ataupun pribadi) |
| 34 | +* _Hostname_ yang unik, alamat MAC, dan product_uuid untuk setiap Node. Lihat [di sini](#memastikan-alamat-mac) untuk detail lebih lanjut. |
| 35 | +* Porta tertentu pada mesin. Lihat [di sini](#memeriksa-porta-yang-dibutuhkan) untuk detail lebih lanjut. |
| 36 | +* _Swap_ dinonaktifkan. Kamu **HARUS** menonaktifkan _swap_ agar kubelet dapat berfungsi dengan baik. |
| 37 | + |
| 38 | + |
| 39 | + |
| 40 | +<!-- steps --> |
| 41 | + |
| 42 | +## Memastikan alamat MAC dan product_uuid yang unik untuk setiap Node {#memastikan-alamat-mac} |
| 43 | + |
| 44 | +* Kamu bisa mendapatkan alamat MAC dari antarmuka jaringan menggunakan perintah `ip link` atau `ifconfig -a` |
| 45 | +* product_uuid didapatkan dengan perintah `sudo cat /sys/class/dmi/id/product_uuid` |
| 46 | + |
| 47 | +Sangat memungkinkan bagi perangkat keras untuk memiliki alamat yang unik, namun beberapa mesin virtual bisa memiliki |
| 48 | +nilai yang identik. Kubernetes menggunakan nilai-nilai tersebut untuk mengidentifikasi Node-Node secara unik pada klaster. |
| 49 | +Jika nilai-nilai tersebut tidak unik pada tiap Node, proses instalasi |
| 50 | +bisa saja [gagal](https://github.com/kubernetes/kubeadm/issues/31). |
| 51 | + |
| 52 | +## Memeriksa adaptor jaringan |
| 53 | + |
| 54 | +Jika kamu memiliki lebih dari satu adaptor jaringan, dan komponen Kubernetes tidak dapat dijangkau melalui rute bawaan (_default route_), |
| 55 | +kami merekomendasikan kamu untuk menambahkan rute IP sehingga alamat-alamat klaster Kubernetes melewati adaptor yang tepat. |
| 56 | + |
| 57 | +## Membuat iptables melihat _bridged traffic_ |
| 58 | + |
| 59 | +Agar iptables pada Node Linux dapat melihat _bridged traffic_ dengan benar, kamu harus memastikan `net.bridge.bridge-nf-call-iptables` bernilai 1 pada pengaturan `sysctl`, misalnya. |
| 60 | + |
| 61 | +```bash |
| 62 | +cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf |
| 63 | +net.bridge.bridge-nf-call-ip6tables = 1 |
| 64 | +net.bridge.bridge-nf-call-iptables = 1 |
| 65 | +EOF |
| 66 | +sudo sysctl --system |
| 67 | +``` |
| 68 | + |
| 69 | +Pastikan modul `br_netfilter` sudah dimuat sebelum melakukan langkah ini. Hal ini dilakukan dengan menjalankan `lsmod | grep br_netfilter`. Untuk memuatnya secara eksplisit gunakan `sudo modprobe br_netfilter`. |
| 70 | + |
| 71 | +Untuk detail lebih lanjut, silakan lihat laman [Persyaratan _Plugin_ Jaringan](/id/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/#persyaratan-plugin-jaringan). |
| 72 | + |
| 73 | +## Memeriksa porta yang dibutuhkan |
| 74 | + |
| 75 | +### Node _control-plane_ |
| 76 | + |
| 77 | +| Protokol | Arah | Rentang Porta | Kegunaan | Digunakan oleh | |
| 78 | +|----------|-----------|------------|-------------------------|---------------------------| |
| 79 | +| TCP | Inbound | 6443* | Kubernetes API server | All | |
| 80 | +| TCP | Inbound | 2379-2380 | etcd server client API | kube-apiserver, etcd | |
| 81 | +| TCP | Inbound | 10250 | Kubelet API | Self, Control plane | |
| 82 | +| TCP | Inbound | 10251 | kube-scheduler | Self | |
| 83 | +| TCP | Inbound | 10252 | kube-controller-manager | Self | |
| 84 | + |
| 85 | +### Node pekerja (_worker_) |
| 86 | + |
| 87 | +| Protokol | Arah | Rentang Porta | Kegunaan | Digunakan oleh | |
| 88 | +|----------|-----------|-------------|-----------------------|-------------------------| |
| 89 | +| TCP | Inbound | 10250 | Kubelet API | Self, Control plane | |
| 90 | +| TCP | Inbound | 30000-32767 | NodePort Services† | All | |
| 91 | + |
| 92 | +† Jangkauan porta bawaan untuk [Service NodePort](/id/docs/concepts/services-networking/service/). |
| 93 | + |
| 94 | +Angka porta yang ditandai dengan * dapat diganti (_overrideable_), sehingga kamu harus memastikan porta khusus lainnya yang kamu sediakan juga terbuka. |
| 95 | + |
| 96 | +Meskipun porta etcd turut dituliskan pada Node _control-plane_, kamu juga bisa menghos klaster etcd-mu sendiri |
| 97 | +secara eksternal atau pada porta _custom_. |
| 98 | + |
| 99 | +_Plugin_ jaringan Pod yang kamu gunakan (lihat di bawah) juga mungkin membutuhkan porta tertentu untuk terbuka. |
| 100 | +Karena hal ini dapat berbeda pada setiap _plugin_ jaringan Pod, silakan lihat |
| 101 | +dokumentasi _plugin_ mengenai porta yang dibutuhkan. |
| 102 | + |
| 103 | +## Menginstal _runtime_ |
| 104 | + |
| 105 | +Untuk menjalankan Container pada Pod, Kubernetes menggunakan |
| 106 | +{{< glossary_tooltip term_id="container-runtime" text="_runtime_ Container" >}}. |
| 107 | + |
| 108 | +{{< tabs name="container_runtime" >}} |
| 109 | +{{% tab name="Linux nodes" %}} |
| 110 | + |
| 111 | +Secara bawaan, Kubernetes menggunakan |
| 112 | +{{< glossary_tooltip term_id="cri" text="Container Runtime Interface">}} (CRI) |
| 113 | +sebagai perantara dengan _runtime_ Container pilihanmu. |
| 114 | + |
| 115 | +Jika kamu tidak menentukan _runtime_, kubeadm secara otomatis mencoba untuk mendeteksi |
| 116 | +_runtime_ Container yang terinstal dengan memindai sekumpulan soket domain Unix yang umum digunakan. |
| 117 | +Tabel berikut menunjukkan _runtime_ Container dan lokasi soketnya: |
| 118 | + |
| 119 | +{{< table caption = "_Runtime_ Container dan lokasi soketnya" >}} |
| 120 | +| _Runtime_ | Lokasi domain soket Unix | |
| 121 | +|------------|-----------------------------------| |
| 122 | +| Docker | `/var/run/docker.sock` | |
| 123 | +| containerd | `/run/containerd/containerd.sock` | |
| 124 | +| CRI-O | `/var/run/crio/crio.sock` | |
| 125 | +{{< /table >}} |
| 126 | + |
| 127 | +<br /> |
| 128 | +Jika ditemukan Docker dan containerd secara bersamaan, Docker akan terpilih. Hal ini diperlukan |
| 129 | +karena Docker 18.09 dirilis dengan containerd dan keduanya dapat ditemukan meskipun kamu |
| 130 | +hanya menginstal Docker. |
| 131 | +Jika ditemukan selain dari kedua _runtime_ Container tersebut, kubeadm akan berhenti dengan kegagalan. |
| 132 | + |
| 133 | +Komponen kubelet berintegrasi dengan Docker melalui implementasi CRI `dockershim` bawaannya. |
| 134 | + |
| 135 | +Lihat [_runtime_ Container](/docs/setup/production-environment/container-runtimes/) |
| 136 | +untuk informasi lebih lanjut. |
| 137 | +{{% /tab %}} |
| 138 | +{{% tab name="sistem operasi lainnya" %}} |
| 139 | +Secara bawaan, kubeadm menggunakan {{< glossary_tooltip term_id="docker" >}} sebagai _runtime_ Container. |
| 140 | +Komponen kubelet berintegrasi dengan Docker melalui implementasi CRI `dockershim` bawaannya. |
| 141 | + |
| 142 | +Lihat [_runtime_ Container](/docs/setup/production-environment/container-runtimes/) |
| 143 | +untuk informasi lebih lanjut. |
| 144 | +{{% /tab %}} |
| 145 | +{{< /tabs >}} |
| 146 | + |
| 147 | + |
| 148 | +## Menginstal kubeadm, kubelet, dan kubectl |
| 149 | + |
| 150 | +Kamu akan menginstal _package_ berikut pada semua mesinmu: |
| 151 | + |
| 152 | +* `kubeadm`: alat untuk mem-_bootstrap_ klaster. |
| 153 | + |
| 154 | +* `kubelet`: komponen yang berjalan pada seluruh mesin pada klaster |
| 155 | + dan memiliki tugas seperti menjalankan Pod dan Container. |
| 156 | + |
| 157 | +* `kubectl`: alat untuk berinteraksi dengan klastermu. |
| 158 | + |
| 159 | +Alat kubeadm **tidak akan** menginstal atau mengelola `kubelet` ataupun `kubectl` untukmu, jadi kamu harus memastikan |
| 160 | +keduanya memiliki versi yang cocok dengan _control plane_ Kubernetes yang akan kamu instal |
| 161 | +dengan kubeadm. Jika tidak, ada risiko _version skew_ yang dapat terjadi dan |
| 162 | +dapat berujung pada perangai yang bermasalah dan tidak terduga. Namun, _satu_ _version skew_ minor antara |
| 163 | +kubelet dan _control plane_ masih diperbolehkan, tetapi versi kubelet tidak boleh melebihi versi API |
| 164 | +Server. Sebagai contoh, kubelet yang berjalan pada versi 1.7.0 akan kompatibel dengan API Server versi 1.8.0, tetapi tidak sebaliknya. |
| 165 | + |
| 166 | +Untuk informasi mengenai instalasi `kubectl`, lihat [Menginstal dan mengatur kubectl](/id/docs/tasks/tools/install-kubectl/). |
| 167 | + |
| 168 | +{{< warning >}} |
| 169 | +Instruksi ini membuat seluruh _package_ Kubernetes keluar dari _system upgrade_. |
| 170 | +Hal ini karena kubeadm dan Kubernetes membutuhkan |
| 171 | +[perhatian khusus untuk pembaharuan](/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/). |
| 172 | +{{</ warning >}} |
| 173 | + |
| 174 | +Untuk informasi lebih lanjut mengenai _version skew_, lihat: |
| 175 | + |
| 176 | +* [Kebijakan _version-skew_ dan versi Kubernetes](/docs/setup/release/version-skew-policy/) |
| 177 | +* [Kebijakan _version skew_](/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#version-skew-policy) yang spesifik untuk kubeadm |
| 178 | + |
| 179 | +{{< tabs name="k8s_install" >}} |
| 180 | +{{% tab name="Ubuntu, Debian atau HypriotOS" %}} |
| 181 | +```bash |
| 182 | +sudo apt-get update && sudo apt-get install -y apt-transport-https curl |
| 183 | +curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - |
| 184 | +cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list |
| 185 | +deb https://apt.kubernetes.io/ kubernetes-xenial main |
| 186 | +EOF |
| 187 | +sudo apt-get update |
| 188 | +sudo apt-get install -y kubelet kubeadm kubectl |
| 189 | +sudo apt-mark hold kubelet kubeadm kubectl |
| 190 | +``` |
| 191 | +{{% /tab %}} |
| 192 | +{{% tab name="CentOS, RHEL atau Fedora" %}} |
| 193 | +```bash |
| 194 | +cat <<EOF > /etc/yum.repos.d/kubernetes.repo |
| 195 | +[kubernetes] |
| 196 | +name=Kubernetes |
| 197 | +baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch |
| 198 | +enabled=1 |
| 199 | +gpgcheck=1 |
| 200 | +repo_gpgcheck=1 |
| 201 | +gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg |
| 202 | +exclude=kubelet kubeadm kubectl |
| 203 | +EOF |
| 204 | + |
| 205 | +# Mengatur SELinux menjadi permissive mode (menonaktifkannya secara efektif) |
| 206 | +setenforce 0 |
| 207 | +sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config |
| 208 | + |
| 209 | +yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes |
| 210 | + |
| 211 | +systemctl enable --now kubelet |
| 212 | +``` |
| 213 | + |
| 214 | + **Catatan:** |
| 215 | + |
| 216 | + - Mengatur SELinux menjadi _permissive mode_ dengan menjalankan `setenforce 0` dan `sed ...` menonaktifkannya secara efektif. |
| 217 | + Hal ini diperlukan untuk mengizinkan Container untuk mengakses _filesystem_ hos, yang dibutuhkan untuk jaringan Pod sebagai contoh. |
| 218 | + Kamu harus melakukan ini sampai dukungan SELinux ditingkatkan pada kubelet. |
| 219 | + |
| 220 | + - Kamu dapat membiarkan SELinux aktif jika kamu mengetahui cara mengonfigurasinya, tetapi hal tersebut mungkin membutuhkan pengaturan yang tidak didukung oleh kubeadm. |
| 221 | + |
| 222 | +{{% /tab %}} |
| 223 | +{{% tab name="Container Linux" %}} |
| 224 | +Menginstal _plugin_ CNI (dibutuhkan untuk kebanyakan jaringan Pod): |
| 225 | + |
| 226 | +```bash |
| 227 | +CNI_VERSION="v0.8.2" |
| 228 | +mkdir -p /opt/cni/bin |
| 229 | +curl -L "https://github.com/containernetworking/plugins/releases/download/${CNI_VERSION}/cni-plugins-linux-amd64-${CNI_VERSION}.tgz" | tar -C /opt/cni/bin -xz |
| 230 | +``` |
| 231 | + |
| 232 | +Menginstal crictl (dibutuhkan untuk kubeadm / Kubelet Container Runtime Interface (CRI)) |
| 233 | + |
| 234 | +```bash |
| 235 | +CRICTL_VERSION="v1.17.0" |
| 236 | +mkdir -p /opt/bin |
| 237 | +curl -L "https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRICTL_VERSION}/crictl-${CRICTL_VERSION}-linux-amd64.tar.gz" | tar -C /opt/bin -xz |
| 238 | +``` |
| 239 | + |
| 240 | +Menginstal `kubeadm`, `kubelet`, `kubectl` dan menambahkan _systemd service_ `kubelet`: |
| 241 | + |
| 242 | +```bash |
| 243 | +RELEASE="$(curl -sSL https://dl.k8s.io/release/stable.txt)" |
| 244 | + |
| 245 | +mkdir -p /opt/bin |
| 246 | +cd /opt/bin |
| 247 | +curl -L --remote-name-all https://storage.googleapis.com/kubernetes-release/release/${RELEASE}/bin/linux/amd64/{kubeadm,kubelet,kubectl} |
| 248 | +chmod +x {kubeadm,kubelet,kubectl} |
| 249 | + |
| 250 | +RELEASE_VERSION="v0.2.7" |
| 251 | +curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/kubepkg/templates/latest/deb/kubelet/lib/systemd/system/kubelet.service" | sed "s:/usr/bin:/opt/bin:g" > /etc/systemd/system/kubelet.service |
| 252 | +mkdir -p /etc/systemd/system/kubelet.service.d |
| 253 | +curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/kubepkg/templates/latest/deb/kubeadm/10-kubeadm.conf" | sed "s:/usr/bin:/opt/bin:g" > /etc/systemd/system/kubelet.service.d/10-kubeadm.conf |
| 254 | +``` |
| 255 | + |
| 256 | +Mengaktifkan dan menjalankan `kubelet`: |
| 257 | + |
| 258 | +```bash |
| 259 | +systemctl enable --now kubelet |
| 260 | +``` |
| 261 | +{{% /tab %}} |
| 262 | +{{< /tabs >}} |
| 263 | + |
| 264 | + |
| 265 | +Sekarang kubelet akan melakukan _restart_ setiap beberapa detik, sambil menunggu dalam kondisi _crashloop_ sampai kubeadm memberikan instruksi yang harus dilakukan. |
| 266 | + |
| 267 | +## Mengonfigurasi _driver_ cgroup yang digunakan oleh kubelet pada Node _control-plane_ |
| 268 | + |
| 269 | +Ketika menggunakan Docker, kubeadm akan mendeteksi secara otomatis _driver_ cgroup untuk kubelet |
| 270 | +dan mengaturnya pada berkas `/var/lib/kubelet/config.yaml` pada saat _runtime_. |
| 271 | + |
| 272 | +Jika kamu menggunakan CRI yang berbeda, kamu harus memodifikasi berkasnya dengan nilai `cgroupDriver` yang kamu gunakan, seperti berikut: |
| 273 | + |
| 274 | +```yaml |
| 275 | +apiVersion: kubelet.config.k8s.io/v1beta1 |
| 276 | +kind: KubeletConfiguration |
| 277 | +cgroupDriver: <value> |
| 278 | +``` |
| 279 | +
|
| 280 | +Harap diperhatikan, kamu **hanya** perlu melakukannya jika _driver_ cgroup dari CRI pilihanmu |
| 281 | +bukanlah `cgroupfs`, karena nilai tersebut merupakan nilai bawaan yang digunakan oleh kubelet. |
| 282 | + |
| 283 | +{{< note >}} |
| 284 | +Karena opsi `--cgroup-driver` sudah dihilangkan pada kubelet, jika kamu memilikinya pada `/var/lib/kubelet/kubeadm-flags.env` |
| 285 | +atau `/etc/default/kubelet`(`/etc/sysconfig/kubelet` untuk RPM), silakan hapus dan gunakan KubeletConfiguration |
| 286 | +(secara bawaan disimpan di `/var/lib/kubelet/config.yaml`). |
| 287 | +{{< /note >}} |
| 288 | + |
| 289 | +Kamu harus melakukan _restart_ pada kubelet: |
| 290 | + |
| 291 | +```bash |
| 292 | +systemctl daemon-reload |
| 293 | +systemctl restart kubelet |
| 294 | +``` |
| 295 | + |
| 296 | +Deteksi _driver_ cgroup secara otomatis untuk _runtime_ Container lainnya |
| 297 | +seperti CRI-O dan containerd masih dalam proses pengembangan. |
| 298 | + |
| 299 | + |
| 300 | +## Penyelesaian masalah |
| 301 | + |
| 302 | +Jika kamu menemui kesulitan dengan kubeadm, silakan merujuk pada [dokumen penyelesaian masalah](/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm/). |
| 303 | + |
| 304 | +## {{% heading "whatsnext" %}} |
| 305 | + |
| 306 | + |
| 307 | +* [Menggunakan kubeadm untuk Membuat Sebuah Klaster](/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/) |
0 commit comments