0

Belajar Kubernetes di EC2 – Setup manual kubernetes di EC2 (part 1)

Belajar Kubernetes di EC2
Belajar Kubernetes di EC2

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:

setup manual kubernetes di EC2

Penjelasan:

  1. Jadi didalam cluster akan ada 1 master node, dan 2 worker node
  2. Masing-masing node akan dibuatkan instancenya, jadi total ada 3 instance
  3. Di master node akan kita install control plane yang bertugas untuk mengelola clusternya, termasuk mengelola worker nodenya.
  4. Dan worker node nanti akan kita isi dengan aplikasinya (nanti di part 2).
  5. 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)

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

setup manual kubernetes di EC2


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

setup manual kubernetes di EC2


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

setup manual kubernetes di EC2

Lalu tambahkan sebagai kernel module

sudo modprobe overlay
sudo modprobe br_netfilter
setup manual kubernetes di EC2


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

setup manual kubernetes di EC2

Kemudain reload perubahannya dengan command berikut:

sudo sysctl --system
setup manual kubernetes di EC2

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

setup manual kubernetes di EC2

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
setup manual kubernetes di EC2

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

portprotocolpurpose
8285UDPflannel overlay network – udp backend. This is the default network configuration (only required if using flannel)
8472UDPflannel overlay network – vxlan backend (only required if using flannel)

tambahkan pada security group -> inbound rules


#worker node

portprotocolpurpose
8285UDPflannel overlay network – udp backend. This is the default network configuration (only required if using flannel)
8472UDPflannel overlay network – vxlan backend (only required if using flannel)
30000 – 32767TCPDefault 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.
10250TCPWorker 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
setup manual kubernetes di EC2

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.

Ambar Hasbiyatmoko

Hello, I'm web developer. Passionate about programming, web server, and networking.

Leave a Reply

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload the CAPTCHA.