Kubernetes Lab With KVM

ကျွန်တော် sharing လုပ်ချင်တာက Kubernetes cluster ( single control-plane ) Lab တစ်ခုကို KVM ( Virtualization ) ပေါ်မှာ ဘယ်လို Deploy လုပ်ရမလဲ ကို sharing လုပ်ချင်ပါတယ်. အခြား Virtualization ( VMWare, VirtualBox, Red Hat Virtualization, oVirt ) ကိုသုံး လဲ အဆင်ပြေပါတယ်.

အရင်ဆုံး ကျွန်တော်တို့ High Level Design ကို ကြည့်ရအောင်.

*Prerequisites*

  • KVM Installation
  • Kubernetes Cluster Resource Requirement for Lab
  • Install Require Package and Dependency for Lab
  • Initialize Kubernetes Cluster with kubeadm
  • Linux, Mac, or WSL Terminal with Bash, Z Shell
  • Microsoft VSCode For Kubernetes Cluster Management
  • Sample YAML File for Kubernetes

*KVM Installation*

အရင်ဆုံးကျွန်တော်တို့ KVM ကို Install လုပ်ပါ. အခြား Virtualization ကိုသုံးလဲအဆင်ပြေပါတယ်.

https://www.linux-kvm.org

*Kubernetes Cluster Resource Requirement for Lab*

Kubernetes cluster ( single control-plane ) တစ်ခု deploy လုပ်ဖို့ node ( Physical or Virtual Machine ) သုံးလုံး လောက် ဆိုရင်အဆင်ပြေပါတယ်.

control node အနေနဲ့ 2 cpu & 2 GB memory ရှိဖို့ လိုအပ်ပါတယ်.

ကျွန်တော် က control node တစ်လုံး, worker node သုံးလုံးသုံးထားပါတယ်.

control node = 2 vCPU & 2 GB Memory

worker node = 1 vCPU & 2 GB Memory ( for each VM )

vCPU ကို အောက်ပါနည်းအတိုင်တွက်လို့ ရပါတယ်.

(Threads x Cores) x Physical CPU = Number vCPU

control and worker node အတွက် ubuntu server 20.04 LTS ကို သုံးထားပါတယ်. CentOS ကိုသုံးလဲရပါတယ်.

https://ubuntu.com/download/server

https://www.centos.org/

အရင် ဆုံး control and worker node VM တွေကို KVM မှာ create လုပ်ပါ.

* kubernetes user *

kubernetes cluster lab အတွက် user account တစ်ခု create လုပ်ပါ.

% sudo useradd -mG sudo -s /bin/bash devops
% sudo passwd devops

အရင်ဆုံး ubuntu server ကို update လုပ်ပါ. swap space ကို disable လုပ်ပါ.

% sudo apt update
% sudo apt full-upgrade
% sudo vim /etc/fstab
% sudo mount -a
% sudo swapoff -a
% free -m      

ကျွန်တော် က k8s cluster network ကို 172.25.250.0/24 subnet range သုံးထားပါတယ်.

cluster nodes တွေရဲ FQDN and IP ကို /etc/hosts file မှာ map လုပ်ပါ.

worker and control nodes များရဲ MAC Address & System UUID ကို check လုပ်ပါ.

% ip link  
% sudo cat /sys/class/dmi/id/product_uuid

nodes တွေရဲ MAC Address & System UUID တွေ duplicate ဖြစ္်နေရင် cluster join ရင် error တက်ပါတယ်. Virtual Machines တွေမှာဖြစ်တတ်ပါတယ်.

Linux iptables အတွက် လိုအပ်တဲ့ Linux Kernel Module ကို Install လုပ်ပါ.

% lsmod | grep br_netfilter
% sudo modprobe br_netfilter

Linux iptables bridge traffic အတွက် sysctl config file ကို ပြင်ပါ.

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

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

shell script file အနေနဲ့ save ပါ. worker node တွေကို shell script file ကို copy လုပ်ပါ.

% for i in worker{1..3}; do scp bridge.sh devops@$i.example.com:~/; done

control and worker nodes မှာ လိုအပ်တဲ့ ports တွေဖွင့်ပါ.

လိုအပ်တဲ့ ports တွေ check လုပ်ပါ.

% sudo iptables -L

*Install Require Package and Dependency for Lab*

Kubernetes Cluster အတွက် လိုအပ်တဲ့ packages များ ကို control and worker nodes များမှာ install လုပ်ပါ.

*Container Runtime*

kubernetes cluster အတွက် ကိုကြိုက်ရာ container runtime ကို control and worker nodes များမှာ install လုပ်ပါ.

https://kubernetes.io/docs/setup/production-environment/container-runtimes/

ကျွန်တော်က Docker ကိုသုံးထားပါတယ်. ကိုယ်ကြိုက်ရာ container runtime ကိုသုံးပါ.

Docker ကို အောက်ပါ links မှာ install လုပ်ပါ.

https://docs.docker.com/engine/install/#server

ကျွန်တော် တို့ shell script ကို သုံးလို့ရပါတယ်.

nodes တွေကို kubernetes cluster မ join ခင် cgroup driver ကို သတ်မှတ်ပါ.

https://kubernetes.io/docs/setup/production-environment/container-runtimes/

kubernetes cluster အတွက်လိုအပ်တဲ့ packages များကို control and worker nodes မှာ install လုပ်ပါ.

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

worker nodes များကို ကိုယ် create လုပ်ထားတဲ့ shell script file များကို scp သုံးပြီး copy လုပ်ပါ.

% for worker{1..3}; do scp docker.sh cgroup.sh kube.sh devops@$i.example.com:~/; done

ပြီးရင် shell script တွေကို run ပါ.

% chmod +x docker.sh kube.sh cgroup.sh
% ./docker.sh
% ./kube.sh
% ./cgroup.sh

အားလုံပြီးရင်တော့ ကျွန်တော်တို့ single control-plane kubernetes cluster တစ်ခု deploy လုပ်ဖို့ ready ဖြစ်ပါပြီး.

*Initialize k8s cluster with kubeadm*

kubeadm init command ကို သုံးပြီး single control-plane kubernetes cluster ကို setup လုပ်ပါ. ကျွန်တော်က default option ကို သုံးတားပါတယ်. ကိုယ်ကြိုက်ရာ container runtime ( cri ), pod network cidr ကိုသုံးလိုရပါတယ်.

kubeadm init run ခင် kubeadm config images pull ကို အရင် run ပါ. gcr.io container registry နဲ့ connectivity စမ်းကြည့်ပါ.

kubeadm init ကို root user အနေနဲ့ run ပါ.

# kubeadm config images pull
# kubeadm init

Highly Available Cluster ကို upgrade လုပ်ချင်ရင် –control-plane-endpoint ကို define လုပ်ပါ.

kubeadm init ကရတဲ့ kubeadm join and token ကို shell scipt file အနေနဲ့သိမ်းပါ.

save ထားတဲ့ shell script file ကို worker nodes ကို copy ကူးပါ.

% for i in worker{1..3}; do scp kube_join.sh devops@$i.example.com:~/; done

shell script file ကို worker nodes မှာ run ပါ. root user or sudo privilege အနေနဲ့ run ပါ.

# chmod +x kube_join.sh
# ./kube_join.sh

kubernetes cluster nodes တွေကို check လုပ်ပါ. control node မှာ run ပါ.

% kubectl get nodes

*pods network plugin*

ကိုယ်ကြိုက်ရာ pods network plugin ကို သုံးပါ.

https://github.com/containernetworking/cni

ကျွန်တော်က calico plugin ကိုသုံးထားပါတယ်.

https://docs.projectcalico.org/about/about-calico

https://docs.projectcalico.org/getting-started/kubernetes/self-managed-onprem/onpremises

calico plugin yaml file ကို download ဆွဲပါ. control node မှာ run ပါ.

% curl https://docs.projectcalico.org/manifests/calico.yaml -O
% kubectl apply -f calico.yaml

calico pods network plugin ရဲ့ config file ကို check လုပ်ပါ.

kubernetes cluster မှာရှိတဲ့ pods တွေကို check လုပ်ပါ.

kubernetes cluster ကို အခြား host ကနေ manage လုပ်ချင်ရင် /etc/kubernetes/admin.conf file ကို manage လုပ်ချင်တဲ့ host ရဲ့ /home/user/.kube/config file ကို copy ကူးပါ. admin.conf file ကို သုံးလဲရပါတယ်.

scp root@<control-plane-host>:/etc/kubernetes/admin.conf .
kubectl --kubeconfig ./admin.conf get nodes

*Linux, Mac, or WSL Terminal with Bash, Z Shell*

ကျွန်တော်က ubuntu 20.04 LTS နဲ့ Z Shell ကို သုံးထားပါတယ်. ကိုယ်ကြိုက်ရာ shell ကို သုံးပါ.

*Microsoft VSCode For Kubernetes Cluster Management*

Microsoft VSCode kubernetes Extension ကို သုံးပြီး kubernetes cluster ကို manage လုပ်လို့ရပါတယ်.

*Sample YAML File for Kubernetes*

ကျွန်တော်တို့ kubernetes deployment yaml file တစ်ခု run ကြည့်ပါ.

kubernetes yaml file

kubernetes ကို ဆက်လေ့လာလို လျှင်.

https://learning.oreilly.com/videos/certified-kubernetes-administrator/9780136677482

“Thanks For Your Time, Mate”

Leave a Reply

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