Menginstal kubeadm
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.
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 untuk detail lebih lanjut.
- Porta tertentu pada mesin. Lihat di sini untuk detail lebih lanjut.
- Swap dinonaktifkan. Kamu HARUS menonaktifkan swap agar kubelet dapat berfungsi dengan baik.
Memastikan alamat MAC dan product_uuid yang unik untuk setiap Node
- Kamu bisa mendapatkan alamat MAC dari antarmuka jaringan menggunakan perintah
ip link
atauifconfig -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.
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.
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.
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.
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 _runtime_ Container.
Secara bawaan, Kubernetes menggunakan Container Runtime Interface (CRI) sebagai perantara dengan runtime Container pilihanmu.
Jika kamu tidak menentukan runtime, kubeadm secara otomatis mencoba untuk mendeteksi runtime Container yang terinstal dengan memindai sekumpulan soket domain Unix yang umum digunakan. Tabel berikut menunjukkan runtime Container dan lokasi soketnya:
Runtime | Lokasi domain soket Unix |
---|---|
Docker | /var/run/docker.sock |
containerd | /run/containerd/containerd.sock |
CRI-O | /var/run/crio/crio.sock |
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.
Komponen kubelet berintegrasi dengan Docker melalui implementasi CRI dockershim
bawaannya.
Lihat runtime Container untuk informasi lebih lanjut.
Secara bawaan, kubeadm menggunakan Docker sebagai runtime Container.
Komponen kubelet berintegrasi dengan Docker melalui implementasi CRI dockershim
bawaannya.
Lihat runtime Container untuk informasi lebih lanjut.
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.
Untuk informasi lebih lanjut mengenai version skew, lihat:
- Kebijakan version-skew dan versi Kubernetes
- Kebijakan version skew yang spesifik untuk kubeadm
sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF
# Mengatur SELinux menjadi permissive mode (menonaktifkannya secara efektif)
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable --now kubelet
Catatan:
-
Mengatur SELinux menjadi permissive mode dengan menjalankan
setenforce 0
dansed ...
menonaktifkannya secara efektif. Hal ini diperlukan untuk mengizinkan Container untuk mengakses filesystem hos, yang dibutuhkan untuk jaringan Pod sebagai contoh. Kamu harus melakukan ini sampai dukungan SELinux ditingkatkan pada kubelet. -
Kamu dapat membiarkan SELinux aktif jika kamu mengetahui cara mengonfigurasinya, tetapi hal tersebut mungkin membutuhkan pengaturan yang tidak didukung oleh kubeadm.
Menginstal plugin CNI (dibutuhkan untuk kebanyakan jaringan Pod):
CNI_VERSION="v0.8.2"
ARCH="amd64"
mkdir -p /opt/cni/bin
curl -L "https://github.com/containernetworking/plugins/releases/download/${CNI_VERSION}/cni-plugins-linux-${ARCH}-${CNI_VERSION}.tgz" | tar -C /opt/cni/bin -xz
Menginstal crictl (dibutuhkan untuk kubeadm / Kubelet Container Runtime Interface (CRI))
CRICTL_VERSION="v1.22.0"
ARCH="amd64"
mkdir -p /opt/bin
curl -L "https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRICTL_VERSION}/crictl-${CRICTL_VERSION}-linux-${ARCH}.tar.gz" | sudo tar -C $DOWNLOAD_DIR -xz
Menginstal kubeadm
, kubelet
, kubectl
dan menambahkan systemd service kubelet
:
RELEASE="$(curl -sSL https://dl.k8s.io/release/stable.txt)"
mkdir -p /opt/bin
ARCH="amd64"
cd /opt/bin
curl -L --remote-name-all https://storage.googleapis.com/kubernetes-release/release/${RELEASE}/bin/linux/${ARCH}/{kubeadm,kubelet,kubectl}
chmod +x {kubeadm,kubelet,kubectl}
RELEASE_VERSION="v0.2.7"
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
mkdir -p /etc/systemd/system/kubelet.service.d
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
Mengaktifkan dan menjalankan kubelet
:
systemctl enable --now kubelet
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
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:
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.
--cgroup-driver
sudah dihilangkan pada kubelet, jika kamu memilikinya pada /var/lib/kubelet/kubeadm-flags.env
atau /etc/default/kubelet
(/etc/sysconfig/kubelet
untuk RPM), silakan hapus dan gunakan KubeletConfiguration
(secara bawaan disimpan di /var/lib/kubelet/config.yaml
).
Kamu harus melakukan restart pada kubelet:
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.