Hi, ditutorial ini kita akan setup manual kubernetes di EC2. Buat yang belum tahu apa itu kubernetes, saya kutip dari websitenya:
Kubernetes merupakan platform open-source yang digunakan untuk melakukan manajemen workloads aplikasi yang dikontainerisasi, serta menyediakan konfigurasi dan otomatisasi secara deklaratif. Kubernetes berada di dalam ekosistem yang besar dan berkembang cepat. Service, support, dan perkakas Kubernetes tersedia secara meluas.
Simpelnya kubernetes adalah sistem untuk mengelola dan meng-orkestrasi kontainer.
Dengan kubernetes, aplikasi kita bisa discale secara otomatis (scale in/out) sesuai kebutuhan/demand, kubernetes bisa me-restart aplikasi jika terjadi crash, memindahkan aplikasi ke node yang lain jika node lamanya down, melakukan load balancing, kubernetes juga memiliki fitur resource
dimana kita bisa menentukan resource CPU dan RAM pada aplikasi, dan masih banyak lagi 🙂 .
Oke segitu aja intronya, langsung aja mari kita mulai………..
Kita akan buat clusternya kira-kira seperti ini:
Penjelasan:
- Jadi didalam cluster akan ada 1 master node, dan 2 worker node
- Masing-masing node akan dibuatkan instancenya, jadi total ada 3 instance
- Di master node akan kita install control plane yang bertugas untuk mengelola clusternya, termasuk mengelola worker nodenya.
- Dan worker node nanti akan kita isi dengan aplikasinya (nanti di part 2).
- Kemudian kita gunakan flannel untuk networking di clusternya, supaya komponen didalam clusternya bisa berkomunikasi 1 sama lain. FYI, sebenarnya ada banyak jenis networking selain flannel, misal calico, dll. Anda bisa lihat di kubenetes network
Berikut spek instance yang saya gunakan:
- master node -> t3.small (2GB, 2vCPUs) -> ubuntu 20.04
- 2 worker node -> masing-masing t3.micro (1GB, 2vCPUs) -> ubuntu 20.04
*note: jangan gunakan ubuntu 22.04, karena saya pernah coba tapi gagal (API servernya nge-crash crashloopbackoff)
Dan berikut rangkuman step-stepnya untuk setup manual kubernetes di EC2:
- Membuat 3 instance (node)
- Install kubernetes di semua instance
- Install containerd di semua instance
- Setting swap dan kernel di semua instance
- Setup Control Plane di master node
- Install Flannel dari master node
- Gabungkan worker node ke cluster
Membuat 3 Instance (node)
Kita akan buat 3 buah instance EC2 disini (1 master node, 2 worker node).
Pertama-tama kita buat instance untuk master nodenya dulu. Masuk ke EC2, klik launch instances. Disini saya beri nama test-k8s-master, pilih ubuntu 20.04 dan instance typenya t3.small
Lalu create new key pair seperti gambar dibawah (supaya nanti bisa connect ke servernya)
Kebagian networking, diatas saya menggunakan VPC default (dengan CIDR 172.31.0.0/16), untuk security groups kita biarkan seperti itu dulu, nanti kita modify di step berikutnya. Kemudian storagenya saya set default 8GB.
Click Launch instance, maka akan ter-create 1 instance baru
Kemudian kita akan buat 2 worker node.
Ulangi langkah diatas untuk membuat 2 worker node lainnya (bedakan nama & tipe instancenya: t3.micro, availibility zonenya & key pairnya).
Oke sekarang kita sudah punya 3 instance:
Kalu dilihat diatas, untuk test-k8s-worker-2 saya tempatkan di Availability Zone yang berbeda (ap-southeast-1b), kenapa? Supaya kita ada backup semisal datacenter di ap-southeast-1c sedang bermasalah, kita masih punya backup ap-southeast-1b, jadi aplikasi kita tidak akan down.
Install kubernetes di semua instance
Selanjutnya, kita perlu menginstall kubernetesnya di semua instance (master node & 2 worker node), supaya antar node bisa ngobrol.
Jadi login ke masing-masing instance menggunakan key pair yang sudah dibuat sebelumnya, misal:
ssh -i <nama keypairnya.pem> ubuntu@<ip public instancenya>
Lalu install kubernetes:
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add
sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
sudo apt-get install kubeadm kubelet kubectl
sudo apt-mark hold kubeadm kubelet kubectl
kubeadm version
kubectl version
Nanti outputnya seperti ini di master node:
worker node 1
worker node 2
Install containerd di semua instance
Karena kubernetes memerlukan container runtime, jadi kita install containerd terlebih dahulu
Jalankan command berikut disemua instance (master node dan 2 worker node)
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt install -y containerd.io
Outputnya kira-kira seperti ini :
Selanjutnya kita konfigurasikan containerd nya disemua instance
containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
Kemudian kita restart dan enable-kan service containerd-nya
sudo systemctl restart containerd
sudo systemctl enable containerd
Kalau kita lihat, sekarang di masing-masing instance sudah mempunyai config containerdnya
Oke nice, lanjut ..
Setting swap dan kernel di semua instance
Ada beberapa config di ubuntu yang harus kita setting terlebih dahulu sebelum lanjut ke step berikutnya, yaitu swap dan kernel. Untuk swap kita harus matikan swapnya, karena berkaitan dengan performance. Dan untuk kernel mengacu ke dokumentasi kubernetes
Jadi, kita harus matikan semua swapnya disemua instance :
swapoff -a
Setelah itu setting kernelnya untuk containerd, kita buat file baru:
sudo vi /etc/modules-load.d/containerd.conf
Isi containerd.conf dengan berikut:
overlay
br_netfilter
Lalu tambahkan sebagai kernel module
sudo modprobe overlay
sudo modprobe br_netfilter
Untuk kubernetes, kita tambahkan file baru juga
sudo vi /etc/sysctl.d/kubernetes.conf
Isi kubernetes.conf dengan berikut:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
Kemudain reload perubahannya dengan command berikut:
sudo sysctl --system
Ok good, lanjut ..
Setup Control Plane di Master Node
Berikutnya, kita perlu menginstall control plane di master node. Seperti yang sudah dibahas diawal, jadi control plane ini tugasnya mengatur dan memanage worker node dan pods. FYI, didalam control plane terdapat beberapa komponen, salah satunya API server. Distep berikutnya kita akan berinteraksi dengan API server kubernetes.
Oke back to the topic.. jadi, sebelum kita menginstall control plane, kita harus dapatkan dulu IP private master nodenya karena IPnya akan didaftarkan di control plane.
Untuk IP privatenya bisa dilihat di dashboard instance, pilih instance test-k8s-master, klik tab detail :
Private IPv4 addresses: 172.31.13.186
Sekarang kita tinggal install control-plane nya di master node dengan command berikut (harus menggunakan user root), dan kita disini menggunakan CIDR default dari flannelnya (10.244.0.0/16)
kubeadm init --control-plane-endpoint=172.31.13.186 --pod-network-cidr=10.244.0.0/16
Setelah itu control plane berhasil diinstal
Sesuai instruksi pada gambar diatas kita perlu jalankan command tersebut di user ubuntu
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Oke sekarang control plane dan clusternya sudah berhasil diinstall.
Kita bisa lihat detail control planenya menggunakan command berikut:
kubectl get nodes -o wide
Kita juga bisa cek clusternya bisa menggunakan command berikut:
kubectl cluster-info
Oke lanjut …
Install flannel dari master node
Masih di dalam instance master node, langkah selanjutnya kita perlu menginstall flannel untuk networkingnya, jalankan command berikut:
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
Oke kita bisa cek sekarang ada namespace baru untuk flannel
kubectl get ns
Oke, sampai sini flannel sudah terinstall, namun belum bisa digunakan karena ada beberapa port yang harus ditambahkan/diallow pada master node dan worker node. Mengacu dari sini kubernetes networking kita akan tambahkan beberapa port :
#master node
port | protocol | purpose |
8285 | UDP | flannel overlay network – udp backend. This is the default network configuration (only required if using flannel) |
8472 | UDP | flannel overlay network – vxlan backend (only required if using flannel) |
tambahkan pada security group -> inbound rules
#worker node
port | protocol | purpose |
8285 | UDP | flannel overlay network – udp backend. This is the default network configuration (only required if using flannel) |
8472 | UDP | flannel overlay network – vxlan backend (only required if using flannel) |
30000 – 32767 | TCP | Default port range for external service ports. Typically, these ports would need to be exposed to external load-balancers, or other external consumers of the application itself. |
10250 | TCP | Worker node Kubelet API for exec and logs. |
tambahkan pada security group -> inbound rules
*Note: di master node dan worker node saya tulis IPnya 172.31.0.0/16 karena saya menggunakan VPC default maka IP depannya adalah 172.31, dan /16 agar bisa diakses dari instance lainnya didalam VPC.
Oke klo kita sudah tambahkan security groupnya, kita bisa lanjut …
Gabungkan Worker Node ke Cluster
Sejauh ini kita belum menggabungkan / join-kan worker node ke cluster, jadi master node dan worker node belum bisa terhubung.
Untuk menjoinkannya kita perlu create token dulu di master node, kemudian copy tokennya dan paste kan di masing-masing worker node. Jadi jalankan command berikut di master node :
kubeadm token create --print-join-command
Hasilnya seperti ini:
kubeadm join 172.31.13.186:6443 --token m60aip.28i5anv4aah7g9ot --discovery-token-ca-cert-hash sha256:9c63fc4a0093ba438e6740d19ffd37e0cd5b5e65ef3cc4e7821ed6dffb419a37
Bisa diperhatikan, terdapat port 6443 yang merupakan port API server kubernetes yang ada dimaster node. Port tersebut harus kita daftarkan/allow di master node, supaya worker node bisa call API server tersebut untuk request gabung ke cluster.
Jadi sebelum menjalankan kubeadm join
diatas, kita tambahkan dulu port 6443 nya.
Pilih instance test-k8s-master
pada halaman Instance > tab security > klik security groups -> inbound rules > Edit inboud rules > tambahkan port 6443 , dengan source 172.31.0.0/16
Oke setelah kita tambahkan portnya, sekarang tinggal jalankan command kubeadm join
tadi dimasing-masing worker node (harus menggunakan user root ya)
worker node 1
worker node 2
Bagus, 2 worker node sudah berhasil join, sekarang kita tinggal cek di master nodenya apakah sudah benar-benar join.
kubectl get nodes -o wide
Good, worker node dengan IP belakang 235 dan 20 sudah berhasil join. Ok berarti cluster kita sudah ada 3 node (1 master node dan 2 worker node)
Oke guys ditutorial ini kita sudah setup manual kubernetes di EC2, di part 2 nanti kita akan coba untuk membuat pod di cluster.