# Menginstal kubeadm

LLMS index: [llms.txt](/llms.txt)

---

<!-- overview -->

<img src="/images/kubeadm-stacked-color.png" align="right" width="150px">Laman ini menunjukkan cara untuk menginstal `kubeadm`.
Untuk informasi mengenai cara membuat sebuah klaster dengan kubeadm setelah kamu melakukan proses instalasi ini, lihat laman [Menggunakan kubeadm untuk Membuat Sebuah Klaster](/id/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/).



## Sebelum kamu memulai


* Satu mesin atau lebih yang menjalankan:
  - Ubuntu 16.04+
  - Debian 9+
  - CentOS 7
  - Red Hat Enterprise Linux (RHEL) 7
  - Fedora 25+
  - HypriotOS v1.0.1+
  - Container Linux (teruji pada versi 1800.6.0)
* 2 GB RAM atau lebih per mesin (kurang dari nilai tersebut akan menyisakan sedikit ruang untuk
   aplikasi-aplikasimu)
* 2 CPU atau lebih
* Koneksi internet pada seluruh mesin pada klaster (kamu dapat menggunakan internet
  publik ataupun pribadi)
* _Hostname_ yang unik, alamat MAC, dan product_uuid untuk setiap Node. Lihat [di sini](#memastikan-alamat-mac) untuk detail lebih lanjut.
* Porta tertentu pada mesin. Lihat [di sini](#memeriksa-porta-yang-dibutuhkan) untuk detail lebih lanjut.
* _Swap_ dinonaktifkan. Kamu **HARUS** menonaktifkan _swap_ agar kubelet dapat berfungsi dengan baik.



<!-- steps -->

## Memastikan alamat MAC dan product_uuid yang unik untuk setiap Node {#memastikan-alamat-mac}

* Kamu bisa mendapatkan alamat MAC dari antarmuka jaringan menggunakan perintah `ip link` atau `ifconfig -a`
* product_uuid didapatkan dengan perintah `sudo cat /sys/class/dmi/id/product_uuid`

Sangat memungkinkan bagi perangkat keras untuk memiliki alamat yang unik, namun beberapa mesin virtual bisa memiliki
nilai yang identik. Kubernetes menggunakan nilai-nilai tersebut untuk mengidentifikasi Node-Node secara unik pada klaster.
Jika nilai-nilai tersebut tidak unik pada tiap Node, proses instalasi
bisa saja [gagal](https://github.com/kubernetes/kubeadm/issues/31).

## Memeriksa adaptor jaringan 

Jika kamu memiliki lebih dari satu adaptor jaringan, dan komponen Kubernetes tidak dapat dijangkau melalui rute bawaan (_default route_),
kami merekomendasikan kamu untuk menambahkan rute IP sehingga alamat-alamat klaster Kubernetes melewati adaptor yang tepat.

## Membuat iptables melihat _bridged traffic_

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.

```bash
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
```

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

Untuk detail lebih lanjut, silakan lihat laman [Persyaratan _Plugin_ Jaringan](/id/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/#persyaratan-plugin-jaringan).

## Memeriksa porta yang dibutuhkan

### Node _control-plane_

| Protokol | Arah | Rentang Porta | Kegunaan                 | Digunakan oleh                   |
|----------|-----------|------------|-------------------------|---------------------------|
| TCP      | Inbound   | 6443*      | Kubernetes API server   | All                       |
| TCP      | Inbound   | 2379-2380  | etcd server client API  | kube-apiserver, etcd      |
| TCP      | Inbound   | 10250      | Kubelet API             | Self, Control plane       |
| TCP      | Inbound   | 10251      | kube-scheduler          | Self                      |
| TCP      | Inbound   | 10252      | kube-controller-manager | Self                      |

### Node pekerja (_worker_)

| Protokol | Arah | Rentang Porta  | Kegunaan               | Digunakan oleh                 |
|----------|-----------|-------------|-----------------------|-------------------------|
| TCP      | Inbound   | 10250       | Kubelet API           | Self, Control plane     |
| TCP      | Inbound   | 30000-32767 | NodePort Services†    | All                     |

† Jangkauan porta bawaan untuk [Service NodePort](/id/docs/concepts/services-networking/service/).

Angka porta yang ditandai dengan * dapat diganti (_overrideable_), sehingga kamu harus memastikan porta khusus lainnya yang kamu sediakan juga terbuka.

Meskipun porta etcd turut dituliskan pada Node _control-plane_, kamu juga bisa menghos klaster etcd-mu sendiri
secara eksternal atau pada porta _custom_.

_Plugin_ jaringan Pod yang kamu gunakan (lihat di bawah) juga mungkin membutuhkan porta tertentu untuk terbuka.
Karena hal ini dapat berbeda pada setiap _plugin_ jaringan Pod, silakan lihat
dokumentasi _plugin_ mengenai porta yang dibutuhkan.

## Menginstal _runtime_ 

Untuk menjalankan Container pada Pod, Kubernetes menggunakan
<a class='glossary-tooltip' title='Runtime Container adalah perangkat lunak yang bertanggung jawab untuk menjalankan Container.' data-bs-toggle='tooltip' data-bs-placement='top' href='/id/docs/setup/production-environment/container-runtimes' target='_blank' aria-label='_runtime_ Container'>_runtime_ Container</a>.

<ul class="nav nav-tabs" id="tabs-container-runtime" role="tablist"><li class="nav-item"><a data-bs-toggle="tab" class="nav-link active" href="#tabs-container-runtime-0" role="tab" aria-controls="tabs-container-runtime-0" aria-selected="true">Linux nodes</a></li>
	  
		<li class="nav-item"><a data-bs-toggle="tab" class="nav-link" href="#tabs-container-runtime-1" role="tab" aria-controls="tabs-container-runtime-1">sistem operasi lainnya</a></li></ul>

<div class="tab-content" id="tabs-container-runtime-content"><div class="tab-body tab-pane fadeshow active"
        id="tabs-container-runtime-0" role="tabpanel" aria-labelledby="tabs-container-runtime-0-tab" tabindex="container-runtime"><p>Secara bawaan, Kubernetes menggunakan
<a class='glossary-tooltip' title='Sebuah API untuk mengintegrasikan runtime Container dengan kubelet.' data-bs-toggle='tooltip' data-bs-placement='top' href='/id/docs/concepts/overview/components/#container-runtime' target='_blank' aria-label='Container Runtime Interface'>Container Runtime Interface</a> (CRI)
sebagai perantara dengan <em>runtime</em> Container pilihanmu.</p>
<p>Jika kamu tidak menentukan <em>runtime</em>, kubeadm secara otomatis mencoba untuk mendeteksi
<em>runtime</em> Container yang terinstal dengan memindai sekumpulan soket domain Unix yang umum digunakan.
Tabel berikut menunjukkan <em>runtime</em> Container dan lokasi soketnya:</p>
<table><caption style="display: none;">_Runtime_ Container dan lokasi soketnya</caption>
	<thead>
			<tr>
					<th><em>Runtime</em></th>
					<th>Lokasi domain soket Unix</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Docker</td>
					<td><code>/var/run/docker.sock</code></td>
			</tr>
			<tr>
					<td>containerd</td>
					<td><code>/run/containerd/containerd.sock</code></td>
			</tr>
			<tr>
					<td>CRI-O</td>
					<td><code>/var/run/crio/crio.sock</code></td>
			</tr>
	</tbody>
</table>
<br />
Jika ditemukan Docker dan containerd secara bersamaan, Docker akan terpilih. Hal ini diperlukan
karena Docker 18.09 dirilis dengan containerd dan keduanya dapat ditemukan meskipun kamu
hanya menginstal Docker.
Jika ditemukan selain dari kedua _runtime_ Container tersebut, kubeadm akan berhenti dengan kegagalan.
<p>Komponen kubelet berintegrasi dengan Docker melalui implementasi CRI <code>dockershim</code> bawaannya.</p>
<p>Lihat <a href="/id/docs/setup/production-environment/container-runtimes/"><em>runtime</em> Container</a>
untuk informasi lebih lanjut.</p>
</div><div class="tab-body tab-pane fade"
        id="tabs-container-runtime-1" role="tabpanel" aria-labelledby="tabs-container-runtime-1-tab" tabindex="container-runtime"><p>Secara bawaan, kubeadm menggunakan <a class='glossary-tooltip' title='Docker merupakan suatu teknologi perangkat lunak yang menyediakan virtualisasi pada level sistem operasi yang juga dikenal sebagai Container.' data-bs-toggle='tooltip' data-bs-placement='top' href='https://docs.docker.com/engine/' target='_blank' aria-label='Docker'>Docker</a> sebagai <em>runtime</em> Container.
Komponen kubelet berintegrasi dengan Docker melalui implementasi CRI <code>dockershim</code> bawaannya.</p>
<p>Lihat <a href="/id/docs/setup/production-environment/container-runtimes/"><em>runtime</em> Container</a>
untuk informasi lebih lanjut.</p>
</div></div>



## Menginstal kubeadm, kubelet, dan kubectl

Kamu akan menginstal _package_ berikut pada semua mesinmu:

* `kubeadm`: alat untuk mem-_bootstrap_ klaster.

* `kubelet`: komponen yang berjalan pada seluruh mesin pada klaster
    dan memiliki tugas seperti menjalankan Pod dan Container.

* `kubectl`: alat untuk berinteraksi dengan klastermu.

Alat kubeadm **tidak akan** menginstal atau mengelola `kubelet` ataupun `kubectl` untukmu, jadi kamu harus memastikan
keduanya memiliki versi yang cocok dengan _control plane_ Kubernetes yang akan kamu instal
dengan kubeadm. Jika tidak, ada risiko _version skew_ yang dapat terjadi dan
dapat berujung pada perangai yang bermasalah dan tidak terduga. Namun, _satu_ _version skew_ minor antara
kubelet dan _control plane_ masih diperbolehkan, tetapi versi kubelet tidak boleh melebihi versi API
Server. Sebagai contoh, kubelet yang berjalan pada versi 1.7.0 akan kompatibel dengan API Server versi 1.8.0, tetapi tidak sebaliknya.

Untuk informasi mengenai instalasi `kubectl`, lihat [Menginstal dan mengatur kubectl](/id/docs/tasks/tools/install-kubectl/).

<div class="alert alert-danger" role="note"><h4 class="alert-heading">Peringatan:</h4>Instruksi ini membuat seluruh <em>package</em> Kubernetes keluar dari <em>system upgrade</em>.
Hal ini karena kubeadm dan Kubernetes membutuhkan
<a href="/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/">perhatian khusus untuk pembaharuan</a>.</div>


Untuk informasi lebih lanjut mengenai _version skew_, lihat:

* [Kebijakan _version-skew_ dan versi Kubernetes](/docs/setup/release/version-skew-policy/)
* [Kebijakan _version skew_](/id/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#version-skew-policy) yang spesifik untuk kubeadm

<ul class="nav nav-tabs" id="tabs-k8s-install" role="tablist"><li class="nav-item"><a data-bs-toggle="tab" class="nav-link active" href="#tabs-k8s-install-0" role="tab" aria-controls="tabs-k8s-install-0" aria-selected="true">Ubuntu, Debian atau HypriotOS</a></li>
	  
		<li class="nav-item"><a data-bs-toggle="tab" class="nav-link" href="#tabs-k8s-install-1" role="tab" aria-controls="tabs-k8s-install-1">CentOS, RHEL atau Fedora</a></li>
		<li class="nav-item"><a data-bs-toggle="tab" class="nav-link" href="#tabs-k8s-install-2" role="tab" aria-controls="tabs-k8s-install-2">Container Linux</a></li></ul>

<div class="tab-content" id="tabs-k8s-install-content"><div class="tab-body tab-pane fadeshow active"
        id="tabs-k8s-install-0" role="tabpanel" aria-labelledby="tabs-k8s-install-0-tab" tabindex="k8s-install"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt-get update <span class="o">&amp;&amp;</span> sudo apt-get install -y apt-transport-https curl
</span></span><span class="line"><span class="cl">curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg <span class="p">|</span> sudo apt-key add -
</span></span><span class="line"><span class="cl">cat <span class="s">&lt;&lt;EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
</span></span></span><span class="line"><span class="cl"><span class="s">deb https://apt.kubernetes.io/ kubernetes-xenial main
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span>
</span></span><span class="line"><span class="cl">sudo apt-get update
</span></span><span class="line"><span class="cl">sudo apt-get install -y kubelet kubeadm kubectl
</span></span><span class="line"><span class="cl">sudo apt-mark hold kubelet kubeadm kubectl
</span></span></code></pre></div></div><div class="tab-body tab-pane fade"
        id="tabs-k8s-install-1" role="tabpanel" aria-labelledby="tabs-k8s-install-1-tab" tabindex="k8s-install"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cat <span class="s">&lt;&lt;EOF &gt; /etc/yum.repos.d/kubernetes.repo
</span></span></span><span class="line"><span class="cl"><span class="s">[kubernetes]
</span></span></span><span class="line"><span class="cl"><span class="s">name=Kubernetes
</span></span></span><span class="line"><span class="cl"><span class="s">baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
</span></span></span><span class="line"><span class="cl"><span class="s">enabled=1
</span></span></span><span class="line"><span class="cl"><span class="s">gpgcheck=1
</span></span></span><span class="line"><span class="cl"><span class="s">repo_gpgcheck=1
</span></span></span><span class="line"><span class="cl"><span class="s">gpgkey=https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
</span></span></span><span class="line"><span class="cl"><span class="s">exclude=kubelet kubeadm kubectl
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Mengatur SELinux menjadi permissive mode (menonaktifkannya secara efektif)</span>
</span></span><span class="line"><span class="cl">setenforce <span class="m">0</span>
</span></span><span class="line"><span class="cl">sed -i <span class="s1">&#39;s/^SELINUX=enforcing$/SELINUX=permissive/&#39;</span> /etc/selinux/config
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">yum install -y kubelet kubeadm kubectl --disableexcludes<span class="o">=</span>kubernetes
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">systemctl <span class="nb">enable</span> --now kubelet
</span></span></code></pre></div><p><strong>Catatan:</strong></p>
<ul>
<li>
<p>Mengatur SELinux menjadi <em>permissive mode</em> dengan menjalankan <code>setenforce 0</code> dan <code>sed ...</code> menonaktifkannya secara efektif.
Hal ini diperlukan untuk mengizinkan Container untuk mengakses <em>filesystem</em> hos, yang dibutuhkan untuk jaringan Pod sebagai contoh.
Kamu harus melakukan ini sampai dukungan SELinux ditingkatkan pada kubelet.</p>
</li>
<li>
<p>Kamu dapat membiarkan SELinux aktif jika kamu mengetahui cara mengonfigurasinya, tetapi hal tersebut mungkin membutuhkan pengaturan yang tidak didukung oleh kubeadm.</p>
</li>
</ul>
</div><div class="tab-body tab-pane fade"
        id="tabs-k8s-install-2" role="tabpanel" aria-labelledby="tabs-k8s-install-2-tab" tabindex="k8s-install"><p>Menginstal <em>plugin</em> CNI (dibutuhkan untuk kebanyakan jaringan Pod):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">CNI_VERSION</span><span class="o">=</span><span class="s2">&#34;v0.8.2&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">ARCH</span><span class="o">=</span><span class="s2">&#34;amd64&#34;</span>
</span></span><span class="line"><span class="cl">mkdir -p /opt/cni/bin
</span></span><span class="line"><span class="cl">curl -L <span class="s2">&#34;https://github.com/containernetworking/plugins/releases/download/</span><span class="si">${</span><span class="nv">CNI_VERSION</span><span class="si">}</span><span class="s2">/cni-plugins-linux-</span><span class="si">${</span><span class="nv">ARCH</span><span class="si">}</span><span class="s2">-</span><span class="si">${</span><span class="nv">CNI_VERSION</span><span class="si">}</span><span class="s2">.tgz&#34;</span> <span class="p">|</span> tar -C /opt/cni/bin -xz
</span></span></code></pre></div><p>Menginstal crictl (dibutuhkan untuk kubeadm / Kubelet Container Runtime Interface (CRI))</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">CRICTL_VERSION</span><span class="o">=</span><span class="s2">&#34;v1.22.0&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">ARCH</span><span class="o">=</span><span class="s2">&#34;amd64&#34;</span>
</span></span><span class="line"><span class="cl">mkdir -p /opt/bin
</span></span><span class="line"><span class="cl">curl -L <span class="s2">&#34;https://github.com/kubernetes-sigs/cri-tools/releases/download/</span><span class="si">${</span><span class="nv">CRICTL_VERSION</span><span class="si">}</span><span class="s2">/crictl-</span><span class="si">${</span><span class="nv">CRICTL_VERSION</span><span class="si">}</span><span class="s2">-linux-</span><span class="si">${</span><span class="nv">ARCH</span><span class="si">}</span><span class="s2">.tar.gz&#34;</span> <span class="p">|</span> sudo tar -C <span class="nv">$DOWNLOAD_DIR</span> -xz
</span></span></code></pre></div><p>Menginstal <code>kubeadm</code>, <code>kubelet</code>, <code>kubectl</code> dan menambahkan <em>systemd service</em> <code>kubelet</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">RELEASE</span><span class="o">=</span><span class="s2">&#34;</span><span class="k">$(</span>curl -sSL https://dl.k8s.io/release/stable.txt<span class="k">)</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">mkdir -p /opt/bin
</span></span><span class="line"><span class="cl"><span class="nv">ARCH</span><span class="o">=</span><span class="s2">&#34;amd64&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> /opt/bin
</span></span><span class="line"><span class="cl">curl -L --remote-name-all https://dl.k8s.io/release/<span class="si">${</span><span class="nv">RELEASE</span><span class="si">}</span>/bin/linux/<span class="si">${</span><span class="nv">ARCH</span><span class="si">}</span>/<span class="o">{</span>kubeadm,kubelet,kubectl<span class="o">}</span>
</span></span><span class="line"><span class="cl">chmod +x <span class="o">{</span>kubeadm,kubelet,kubectl<span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">RELEASE_VERSION</span><span class="o">=</span><span class="s2">&#34;v0.2.7&#34;</span>
</span></span><span class="line"><span class="cl">curl -sSL <span class="s2">&#34;https://raw.githubusercontent.com/kubernetes/release/</span><span class="si">${</span><span class="nv">RELEASE_VERSION</span><span class="si">}</span><span class="s2">/cmd/kubepkg/templates/latest/deb/kubelet/lib/systemd/system/kubelet.service&#34;</span> <span class="p">|</span> sed <span class="s2">&#34;s:/usr/bin:/opt/bin:g&#34;</span> &gt; /etc/systemd/system/kubelet.service
</span></span><span class="line"><span class="cl">mkdir -p /etc/systemd/system/kubelet.service.d
</span></span><span class="line"><span class="cl">curl -sSL <span class="s2">&#34;https://raw.githubusercontent.com/kubernetes/release/</span><span class="si">${</span><span class="nv">RELEASE_VERSION</span><span class="si">}</span><span class="s2">/cmd/kubepkg/templates/latest/deb/kubeadm/10-kubeadm.conf&#34;</span> <span class="p">|</span> sed <span class="s2">&#34;s:/usr/bin:/opt/bin:g&#34;</span> &gt; /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
</span></span></code></pre></div><p>Mengaktifkan dan menjalankan <code>kubelet</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">systemctl <span class="nb">enable</span> --now kubelet
</span></span></code></pre></div></div></div>



Sekarang kubelet akan melakukan _restart_ setiap beberapa detik, sambil menunggu dalam kondisi _crashloop_ sampai kubeadm memberikan instruksi yang harus dilakukan.

## Mengonfigurasi _driver_ cgroup yang digunakan oleh kubelet pada Node _control-plane_ {#mengonfigurasi-cgroup-untuk-kubelet-pada-node-control-plane}

Ketika menggunakan Docker, kubeadm akan mendeteksi secara otomatis _driver_ cgroup untuk kubelet
dan mengaturnya pada berkas `/var/lib/kubelet/config.yaml` pada saat _runtime_.

Jika kamu menggunakan CRI yang berbeda, kamu harus memodifikasi berkasnya dengan nilai `cgroupDriver` yang kamu gunakan, seperti berikut:

```yaml
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: <value>
```

Harap diperhatikan, kamu **hanya** perlu melakukannya jika _driver_ cgroup dari CRI pilihanmu
bukanlah `cgroupfs`, karena nilai tersebut merupakan nilai bawaan yang digunakan oleh kubelet.


<div class="alert alert-info" role="note"><h4 class="alert-heading">Catatan:</h4>Karena opsi <code>--cgroup-driver</code> sudah dihilangkan pada kubelet, jika kamu memilikinya pada <code>/var/lib/kubelet/kubeadm-flags.env</code>
atau <code>/etc/default/kubelet</code>(<code>/etc/sysconfig/kubelet</code> untuk RPM), silakan hapus dan gunakan KubeletConfiguration
(secara bawaan disimpan di <code>/var/lib/kubelet/config.yaml</code>).</div>


Kamu harus melakukan _restart_ pada kubelet:

```bash
sudo systemctl daemon-reload
sudo systemctl restart kubelet
```

Deteksi _driver_ cgroup secara otomatis untuk _runtime_ Container lainnya
seperti CRI-O dan containerd masih dalam proses pengembangan.


## Penyelesaian masalah

Jika kamu menemui kesulitan dengan kubeadm, silakan merujuk pada [dokumen penyelesaian masalah](/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm/).

## Selanjutnya


* [Menggunakan kubeadm untuk Membuat Sebuah Klaster](/id/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/)
