0

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

Hi, ditutorial ini kita akan setup manual kubernetes di EC2.


Kita akan buat seperti ini:

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 berfungsi untuk mengelola clusternya, termasuk mengelola worker nodenya.
  4. Dan worker node 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:

  • 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 master node


Mari kita mulai ..


Membuat 3 Instance

Pertama 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, saya menggunakan VPC default, 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


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), jadi login ke masing-masing instance menggunakan key pair yang sudah dibuat sebelumnya:

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. 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 privatenya dari si master nodenya karena IPnya nanti akan didaftarkan di control plane.

Untuk IP privatenya bisa dilihat di dashboard instance:


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

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 Master Node

Sejauh ini kita belum menjoin-kan worker node ke master node, jadi 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 untuk API server kubernetes. Jadi untuk menjoinkan worker node ke master node kita memerlukan API server kubernetes.

Jadi sebelum menjalankan kubeadm join, port 6443 tersebut harus kita allow/tambahkan dulu di security group di master nodenya, agar worker node nya bisa connect dengan master nodenya melalui port tersebut.

tambahkan pada security groups -> inbound rules


Oke setelah kita tambahkan portnya, sekarang tinggal jalankan command kubeadm join tadi di masing-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, di part 2 nanti kita akan coba untuk membuat pod didalam 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.