# Creating a cluster with kubeadm - Part 2

ဒီနေ့ထပ်ပြီးတော့ Sharing လုပ်မှာကတော့ kubeadm tool နဲ့ Kubernetes Cluster Setup လုပ်မှာကို ပြောပြပေးသွားမှာပဲဖြစ်ပါတယ်။ Part 1 မှာတုန်းကတော့ Kubernetes ဆိုတာဘာလဲရယ် Kubernetes Distribution အကြောင်း တွေကို အနည်းငယ်ရှင်းပြပေးခဲ့ပါတယ်။ Part 1 ကိုမဖတ်ရသေးရင်တော့ အောက်က Link ကိုနှိပ်ပြီးတော့ သွားရောက်ဖတ်ရှုနိုင်ပါတယ်။

%[https://blogs.vitaltechmyanmar.com/creating-a-cluster-with-kubeadm-part-1] 

## Installing and Configuring Prerequisites

Kubernetes Cluster Setup မလုပ်ခင်မှာ လိုအပ်တဲ့ Network Configuration တွေ Cluster အတွက် လိုအပ်သည့် Container Runtime တွေကို အရင်ဆုံးဆုံးအနေနဲ့ Installing လုပ်သွားမှာပဲဖြစ်ပါတယ်။

## Enable IPv4 packet forwarding

Network Config အနေနဲ့ကတော့ IPv4 packet forwarding ဆိုသည့် Kernel Option တစ်ခုကို Enable လုပ်ပေးဖို့လိုအပ်ပါတယ်။ IPv4 packet forwarding မရှိခဲ့ရင် network interfaces အမျိုးစုံအကြား network traffic တွေပေးပို့တဲ့အခါမှာ အဆင်မပြေနိုင်တာတွေရှိနိုင်ပါတယ်။ ဥပမာ အနေနဲ့ ပြောရရင် pod-to-pod communication လိုဟာမျိုးတွေပေါ့။ ကျွန်တော်တို့ Cluster ရဲ့ **Node A** ပေါ်မှာ pod တစ်ခုရှိတယ်ပဲထားပါတော့ဗျာ။ အဲ့ဒီ **Node A** ရဲ့ pod ကနေ တခြား **Node B** မှာရှိတယ့် pod ကို packet လေးတွေပို့ချင်တယ်ဆိုပါတော့။ ဒီ packet တွေရောက်ဖို့အတွက်က IPv4 packet forwarding ကို enable လုပ်ထားမှသာ **Node A** ရဲ့ physical network adapter ကနေတစ်ဆင့် **Node B** ရဲ့ Network Adapter ကိုဖျက်ပြီးတော့ **Node B** ရဲ့ pod ကို packet တွေရောက်မှာဖြစ်ပါတယ်။ ဒီ IPv4 packet forwarding kernel option ကို enable လုပ်ထားမှသာ Kubernetes ထဲမှာ အသုံးပြုမယ့် Network CNI Plugin တွေအတွက်လည်းကောင်းမွန်စွာအလုပ်လုပ်မှာ ဖြစ်ပါတယ်။

```bash
# sysctl params required by setup, params persist across reboots
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
EOF

# Apply sysctl params without reboot
sudo sysctl --system
```

net.ipv4.ip\_forward ကို 1 ဆိုပြီး setup လုပ်လိုက်တဲ့ ပြန်ခေါ်ကြည့်လို့ output က 1 ပြန်ရတယ်ဆိုရင်တော့ ipv4 packet forwarding enable ဖြစ်နေပါပြီ။

```bash
sysctl net.ipv4.ip_forward
```

**Output**

```bash
ubuntu@mdo25-master:~$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
```

နောက်ထပ်အနေနဲ့ cgroups drivers ကို သတ်မှတ်ရမယ်ပေါ့နော်။ ဒါပေမယ့် cgroups drivers ကိုသီးသန့်သွားပြီး လုပ်စရာမလိုတော့ပဲ Kubernetes ရဲ့ v1.22 version ကနေစပြီးတော့ cgroup drivers နေရာမှာ ဘာမှ မသတ်မှတ်ထားခဲ့ရင် kubeadm က default အနေနဲ့ systemd ကိုအသုံးပြုသွားမယ်ဆိုတာမျိုးက ရှိတယ့်အတွက် ထွေထွေထူးထူးတော့ ဘာမှလုပ်စရာမလိုတော့ပါဘူး။ ကျွန်တော်တို့ အသုံးပြုသွားမယ့် Ubuntu Linux Distribution ကလဲ cgroup drivers အနေနဲ့က systemd ကိုပဲသုံးထားတာပဲဖြစ်တယ်။ ဒါကြောင့် cgroup drivers နဲ့ပတ်သက်ပြီးတော့ ဘာမှမသတ်မှတ်တော့ပါဘူး။

# Container Runtimes

Container Runtimes အနေနဲ့ကတော့ ဒီ lab မှာ containerd ကိုအသုံးပြုမှာဖြစ်သည့်အတွက် containerd ကို installation လုပ်သွားမှာ ဖြစ်ပါတယ်။

## Containerd

Containerd ဆိုတာကတော့ ကျွန်တော်သိတယ့်အတိုင်းပဲ container တွေကို manage လုပ်ဖို့အတွက်သုံးတဲ့ tool တစ်ခုပဲဖြစ်ပါတယ်။ part 1 မှာပြောပြခဲ့အတိုင်း containerd manage လုပ်ဖို့အတွက် ctr ဆိုတယ့် cli tool နဲ့အသုံးပြုပါတယ်။ သူကတော့ docker command တွေနဲ့ အနည်းငယ် different ဖြစ်နေမည်ဖြစ်ပြီး docker က သုံးခဲ့သလိုမျိုးအသုံးပြုချင်ရင်တော့ nerdctl ဆိုတဲ့ cli tool ကိုအသုံးပြုလို့ရပါတယ်။ Kubernetes cluster တစ်ခုထဲမှာ kubelet က container runtime နဲ့ ချိတ်ဆက်ဖို့ **Container Runtime Interface (CRI)** ကိုသုံးပါတယ်။ အရင်တုန်းကတော့ docker ကို CRI အဖြစ် အသုံးပြုခဲ့တာဖြစ်ပြီးတော့ အခုနောက်ပိုင်းမှာတော့ containerd ကိုသာ CRI အဖြစ် native support လုပ်ပါတယ်။

```bash
sudo apt install containerd
```

containerd ကို install လုပ်တယ့်နေရာမှာ သူရဲ့ dependency ဖြစ်တယ့် runc ကိုပါတစ်ပါတည်း သွင်းသွားမည်ဖြစ်သည်။ containerd ကတော့ high-level runtime ဖြစ်ပြီးတော့ runc ကတော့ low-level runtime အနေနဲ့ ရှိပါတယ်။ containerd က စေခိုင်းသမျှကိုမှ runc အနေနဲ့ container တွေဖန်တီးတဲ့ ကိစ္စရပ်မျိုးတွေကို လုပ်ဆောင်ပေးတာပဲဖြစ်ပါတယ်။

```bash
ubuntu@mdo25-master:~$ sudo apt install containerd
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  runc
The following NEW packages will be installed:
  containerd runc
0 upgraded, 2 newly installed, 0 to remove and 62 not upgraded.
Need to get 45.7 MB of archives.
After this operation, 172 MB of additional disk space will be used.
Do you want to continue? [Y/n]
```

Installation လုပ်ပြီးသွားရင်တော့ containerd service လေးကောင်းမွန်စွာ အလုပ်လုပ်မလုပ်ကို စစ်ချင်သည့် အတွက်

```bash
systemctl status containerd
```

ဆိုပြီး စစ်ကြည့်ပါမယ်။

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753238827219/fc6b6aec-e400-4f56-a5c7-3881a40af8ec.png align="center")

active (running) ဖြစ်နေပြီ ဖြစ်သည့်အတွက် containerd service က ကောင်းမွန်စွာအလုပ်လုပ်နေပြီလို့ သတ်မှတ်လို့ရပါတယ်။ containerd ကို installation လုပ်ပြီးသွားပြီဆိုတော့ နောက်ထပ်အနေနဲ့ cgroup driver တွေကို configure လုပ်ပေးဖို့လိုအပ်ပါတယ်။

## Configuring cgroup driver

cgroup driver ကို configuring လုပ်တဲ့နေရာမှာ ကျွန်တော်တို့ အသုံးပြုထားတဲ့ Ubuntu Linux Distribution က systemd ကိုအသုံးပြုထားတယ့်အတွက် **systemd** cgroup driver ကို configure လုပ်မှာပဲဖြစ်ပါတယ်။ သူရဲ့ config file လေးကတော့ **/etc/containerd/config.toml** ဆိုပြီးတော့သွားဆောက်ပေးမှာပဲဖြစ်ပါတယ်။ အရင်ဆုံးအနေနဲ့ /etc အောက်ထဲမှာ containerd ဆိုတယ့် directory တစ်ခုဆောက်ပေးရမှာပဲဖြစ်ပါတယ်။

```bash
sudo mkdir /etc/containerd
```

ပြီးရင်တော့ containerd config ကို create လုပ်ပါမယ်။

```bash
containerd config default > /etc/containerd/config.toml
```

အထက်ပါ command ကိုအသုံးပြုပြီးသွားတဲ့ အခါမှာ /etc/containerd/config.toml ထဲမှာ config တွေ ရောက်နေမည်ဖြစ်ပါသည်။ အဲ့ထဲမှာမှ အောက်ပါပြထားတဲ့အတိုင်း SystemdCgroup နေရာမှာ false ကို true ဆိုပြီး ပြောင်းပေးရမည်ဖြစ်ပါသည်။

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753240227278/19ad7103-a360-483b-8729-902c2391c40c.png align="center")

ပြီးသွားရင်တော့ config changes ကို containerd ကသိအောင်လို့ containerd service ကို restart ချပေးရပါမယ်။

```bash
systemctl restart containerd
```

ပြီးသွားရင်တော့ containerd service proper ပြန်အလုပ်လုပ်မလုပ်လုပ်ကို **systemctl status containerd** နဲ့တစ်ချက်စစ်ကြည့်ချင်ရင် စစ်ကြည့်လို့ရပါသည်။ ဘာလို့ပြန်စစ်ခိုင်းတာလဲဆိုတော့ best practice အနေနဲ့လဲ ဖြစ်အောင်တစ်ခုခု changes လုပ်ပြီးတိုင်း restart ချတဲ့အခါ service က ကောင်းမွန်စွာ အလုပ်လုပ် မလုပ်ကို သိစေနိုင်ရန်အတွက်ကြောင့် ဖြစ်ပါတယ်။

## Disable Swap

Swap Configuration အနေနဲ့ကတော့ swap ကို disable လုပ်ပေးရမှာပဲဖြစ်ပါတယ်။ node မှာ swap ကိုသာ disable မလုပ်ခဲ့ရင် kubelet service ကို run လိုက်ပြီဆိုတာနဲ့ swap memory ကို detected ဖြစ်နေတဲ့အခါ kubelet service ဟာ ကောင်းကောင်းအလုပ်မလုပ်နိုင်ပဲ fail သွားတာမျိုးတွေ ရှိတတ်ပါတယ်။ အရင်ဆုံးအနေနဲ့ swap က အလုပ်လုပ်နေလားတစ်ချက်အရင်စစ်ကြည့်ပါမယ်။

```bash
free -m
```

Output

```bash
root@mdo25-master:~# free -m
               total        used        free      shared  buff/cache   available
Mem:            7936         478        6866           4         843        7457
Swap:              0           0           0
```

လက်ရှိ ကျွန်တော့်ရဲ့ vm ထဲမှာတော့ swap က မသုံးထားတဲ့အတွက် ထွေထွေထူးထူး ပိတ်စရာတော့မလိုပါဘူး။ တကယ်လို့ Swap ကိုအသုံးပြုထားတယ်ဆိုရင်တော့

```bash
swap off -a
```

အထက်ပါ command ကိုအသုံးပြုပြီး swap ကို disable လုပ်နိုင်သလို **/etc/fstab** ထဲမှာလည်း swap memory ကို အလုပ်မလုပ်အောင် comment သွားပိတ်ပေးရပါမယ်။

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1753241036883/4fb49e97-6ce0-459d-abd1-3a8b84c3765b.png align="center")

# Installing kubeadm, kubelet and kubectl

ဒီအဆင့်မှာတော့ Kubernetes အတွက် လိုအပ်မည့် package ကို စတင် install လုပ်မှာပဲဖြစ်ပါတယ်။

* kubeadm - ကတော့ cluster ကို bootstrap လုပ်ဖို့အတွက်အသုံးပြုရမည့် command ဖြစ်ပါတယ်။
    
* kubelet - ကတော့ Kubernetes Cluster တစ်ခုလုံးရဲ့ အရေးကြီးဆုံးအစိတ်အပိုင်းတွေထဲက တစ်ခုဖြစ်ပြီး Node တိုင်းမှာ အလုပ်လုပ်တဲ့ service တစ်ခုဖြစ်ပါတယ်။
    
* kubectl - ကတော့ kubernetes cluster ကို manage လုပ်ဖို့ command line utility tool ပဲဖြစ်ပါတယ်။
    

ကျွန်တော်တို့က Kubernetes Cluster ကို Ubuntu Linux Distribution ကိုအသုံးပြုမှာဆိုတော့ Debian-based distributions တွေအတွက် Kubernetes Repo တွေကို add ပေးရပါမယ်။ ဒီ Lab မှာတော့ Kubernetes ရဲ့ latest version ဖြစ်တဲ့ v1.33 ကို အသုံးပြုမည်ဖြစ်ပါတယ်။

Update the `apt` package index and install packages needed to use the Kubernetes `apt` repository

```bash
sudo apt-get update
# apt-transport-https may be a dummy package; if so, you can skip that package
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
```

Download the public signing key for the Kubernetes package repositories.

```bash
# If the directory `/etc/apt/keyrings` does not exist, it should be created before the curl command, read the note below.
# sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.33/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
```

Add Kubernetes apt repository

```bash
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.33/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
```

Update the `apt` package index, install kubelet, kubeadm and kubectl, and pin their version:

```bash
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
```

Enable the kubelet service before running kubeadm:

```bash
sudo systemctl enable --now kubelet
```

အဲ့တာဆိုရင်တော့ Kubernetes Cluster Setup လုပ်ဖို့အတွက် လိုအပ်တာတွေအကုန် installation လုပ်ပြီးပြီဖြစ်သည့်အတွက် Part 3 မှာတော့ Cluster Setup လုပ်တဲ့ဟာကို ထပ်မံရေးသားပေးသွားပါမယ်။

အချိန်ပေးပြီးဖတ်ရှုပေးတဲ့အတွက်ကျေးဇူးတင်ပါတယ်။
