Friday, October 23, 2020

What I learned about kubernetes - Kubernetes Cluster Upgrade

                 ဒီနေ့ article မှာတော့  Kubernetes cluster upgrading အကြောင်းဖြစ်ပါတယ်။ Upgrading ဆိုတာကတော့ kubernetes cluster မှာပါဝင်တဲ့ services and components တွေကို (ie. kube-controller, scheduller, kube-adm, kube-api, kubelet, etc..)  စတဲ့ components တွေကို upgrade ပြုလုပ်ရာမှာ ဘယ်လိုမျိုး properly လုပ်ဆောင်မလဲဆိုတာ ကို ပြောသွားမှာဖြစ်ပါတယ်။


Before that, What if a running kubernetes cluster node down?

             ပုံမှန်အရ cluster node တစ်ခု down သွားခဲ့လို့ "5" min ထက် မကျော်ပဲ ပြန်တက်လာခဲ့ရင် "kubelet" service ကနေ Pods တွေကို ပြန်လည်စတင်စေမှာဖြစ်ပါတယ်။ အကယ်၍ 5 min ထက်ကျော်သွားခဲ့ရင်တော့ Pods တွေမှာ replica-set ရှိမယ်ဆိုရင် other cluster node တွေပေါ်မှာ run မှာဖြစ်ပြီး replica-set အသုံးမပြုထားဘူးဆိုရင်တော့ Pods တွေ ရှိမှာမဟုတ်တော့ဘူးဖြစ်ပါတယ်။ Down သွားတဲ့ node က 5min ကျော်မှ ပြန်တက်လာခဲ့ရင်လဲ သူ့ပေါ်မှာ Pods တွေရှိမှာမဟုတ်တော့ဘူးဖြစ်ပါတယ်။


Why need to drain a node before cluster maintenance?

            Cluster node တစ်ခုကို maintenance မလုပ်ခင် (i.e patching, updating) အရင်ဆုံး "Drain" လုပ်တယ်ဆိုတာက လက်ရှိ node ပေါ်မှာ running ဖြစ်နေတဲ့ Podsတွေကို maintenance မစခင် "gracefully terminated" ဖြစ်စေပြီး တစ်ခြား cluster node တစ်ခုခုပေါ်မှာ သွား run စေတာဖြစ်ပါတယ်။ ထို့အပြင် "Drain" mode on ထားတဲ့ အခါမှာ node ပေါ်သို့ Pods တွေ whether new or existing လာပြီး  run လို့ မရတော့ဘူးဖြစ်ပါတယ်။ ဒါမှသာ maintenance လုပ်နေစဥ် အချိန်အတွင်း kubernetes cluster ကို မထိခိုက်စေမှာဖြစ်ပါတယ်။ Maintenance ပြီးသွားပြီဆိုရင်တော့ "drain" mode ကို manually ပြန်ဖြုတ်ပေးရမှဖြစ်ပြီး ဒါမှသာ နောက်ပိုင်း new pods တွေ ကို ပြန်လက်ခံပေးနိုင်မှာဖြစ်ပါတယ်။ Manually drain mode ကို ပြန်ဖြုတ်တာကိုတော့ "uncordon" လုပ်တယ်လို့ခေါ်ပါတယ်။

Commands Usage 

$kubectl drain node1 --ignore-daemonsets (Drain a node)

 $kubectl uncordon node1 (Remove the drain mode)


What is cordon mode?

            Cordon mode သည်လဲပဲ Drain mode နဲ့အတူတူပဲဖြစ်ပြီး $kubectl cordon node1 ဆိုပြီး အသုံးပြုလိုက်လျှင် node ပေါ်မှာ နောက်ထပ် new pods တွေလာရောက် run လို့ရမှာမဟုတ်တော့ပါဘူး။ "Drain" mode နဲ့ မတူညီတဲ့အချက်က "Cordon" mode က လက်ရှိ node ပေါ်မှာ running ဖြစ်နေတဲ့ Pods တွေကို delete မလုပ်ဘူးဖြစ်ပါတယ်။

Command Usage

$kubectl cordon node1 (restrict new pods running on node)


Is it a mandatory to have the same version in all kubernetes components?

              Kubernetes components တွေကို version upgrade လုပ်တဲ့အခါမှာ all components must be same version ရယ်လိုတော့ မလိုပေမယ့် kube-apiserver သည် အဓိက ဖြစ်သည့်အတွက် သူ့ version ထက်တော့ မြင့်နေလို့ မရဘူးဖြစ်ပါတယ်။ ဆိုတော့ theory အရ 

1. Controller Manager နဲ့ Kube-Scheduler သည် kube-Api server နဲ့ version တူရင်တူ မတူရင် သူ့ထက် တစ်ဆင့် နိမ့်တဲ့ version နဲ့ အသုံးပြုလို့ရပါတယ်။

2. kube-let and kube-proxy ကတော့ kube-api server နဲ့ ver sion တူရင်တူ မတူရင် သူ့ထက် နှစ်ဆင့် နိမ့်နဲ့ version နဲ့ အသုံးပြုနိုင်ပါတယ်။

3. kube-ctl ကတော့ kube-api server version နဲ့ တူရင်တူ မတူရင် တစ်ဆင့်မြင့် (or) တစ်ဆင့်နိမ့် သည့် version ဖြင့် အသုံးပြုနိုင်ပါတယ်။ 


When should you upgrade?

            Kubernetes lifecycle အရ အမြဲတမ်း release version 3 ခုကိုပဲ support ပေးပါတယ်။ Kubernetes ရဲ့ version format က ဥပမာ v1.18.10 ဆိုရင် Major version "1", minor version "1၈" and patch version က "10" ဆိုပြီး  သတ်မှတ်ပါတယ်။ အဲ့တော့ လက်ရှိ kubernetes support ပေးတဲ့ version ၃ ခုပြောပါဆိုရင် v1.17, v1.18 and v1.19  ဆိုတော့ လက်ရှိ မိမိ kubernetes environment က kubernetes support ပေးတဲ့ version ထက် နိမ့်နေပြီဆိုရင်တော့ upgrade လုပ်သင့်ပါတယ်။

            Upgrade လုပ်ရမှာလဲ version ကို latest version သို့ တိုက်ရိုက် ကျော်လို့မရပဲ တစ်ဆင့်ချင်းစီ upgrade လုပ်ရမှာဖြစ်ပါတယ်။


Any impact on worker nodes while upgrading master node?

                 Master node ပေါ်မှာ kubernetes components တွေကို upgrade လုပ်နေစဥ်မှာ Master node ပေါ်မှာ ရှိတဲ့ { kube-api server, controller manager, scheduler, etc } စတာတွေ ဘာတစ်ခုမှာ အလုပ်လုပ်မည်မဟုတ်ပါ။ အခုလိုမျိုး အလုပ်မလုပ်ပေမယ့်လဲ Worker node ပေါ်မှာ run နေတဲ့ existing pods တွေပေါ်မှာတော့ impact သွားမဖြစ်ပဲ Pod create/ delete/ modify စတာတွေ တော့ upgrad လုပ်နေစဥ် လုပ်လို့ရမှာမဟုတ်ပါဘူး။


How many strategy for upgrading worker nodes?

        Master node အပြင် Pods တွေ run နေတဲ့ Worker nodes တွေကို upgrade လုပ်ရာမှာတော့

1. Upgrade all at one ( downtime require )

2. Upgrade one node at a time

3. Add new node with newer version of cluster ဆိုပြီး ၃ မျိုး ရှိပါတယ်။


Upgrading Master Node

1. $kubeadm upgrade plan

                အရင်ဆုံး $kubectl upgrade plan ကို အသုံးပြုပြီး လက်ရှိ version နဲ့ upgrade လုပ်နိုင်မယ့် version တွေကို ကြည့်လိုရပါတယ်။



2. $kubectl drain master --ignore-daemonsets

            Upgrade မလုပ်ခင် master node ကို "drain" mode ပြုလုပ်ထားပါမယ်။ အောက်ပုံမှာ လက်ရှိ running pods တွေနဲ့ master node ကို drain mode လုပ်သွားတာကို ပြထားပါတယ်။ 



3. $apt install kubeadm=1.19.0-00 

            အရင်ဆုံး kubeadm ကို upgrade ပြုလုပ်ပါမယ်။ $apt install kubeadm အသုံးပြုရာမှာ installation error တက်နေရင် $apt update ကို အရင်run ပေးလိုက်ပါ။ Kubernetes cluster တစ်ခုကို တည်ဆောက်ရာမှာ manually (hard way) တည်ဆောက်သလို kubeadm ဖြင့်လဲ​တည်ဆောက်ပါတယ်။ ဒီမှာက kubeadm way ဖြင့် တည်ဆာက်ထားသောကြောင့် အရင်ဆုံး kubernetes cluster upgrade မလုပ်ခင် kubeadm ကို upgrade အရင်လုပ်ပါတယ် ပြီးမှ $kubeadm ကို အသုံးပြုပြီး kubernetes components တွေကို upgrade လုပ်မှာဖြစ်ပါတယ်။  



4. $kubeadm upgrade apply v1.19.0

                    apt install ဖြင့် kubeadm upgrade ပြီးရင်တော့ $kubeadm upgrade apply ဖြင့် kubernetes components တွေကို upgrade လုပ်မှာဖြစ်ပါတယ်။



5. $apt install kubelet=1.19.0-00

             kubeadm upgrade apply ဖြင့် kubernetes components တွေကို upgrade လုပ်ပြီးနောက် kubelet component ကိုတော့ သတ်သတ် upgrade လုပ်ပေးရပါမယ်။



6. Uncordon master node

            နောက်ဆုံးအဆင့်ဖြစ်တဲ့ kubelet ကို upgrade ပြီးသွားရင်တော့ master node ကို "drain" mode ဖြုတ်ဖို့အတွက် "uncordon" mode ပြန်လုပ်ပါမယ်။ ပြီးနောက် kubernetes version သည် upgraded ဖြစ်သွားတာကို $kubeadm upgrade plan command ဖြင့် တွေ့ နိုင်ပါတယ်။



Upgrading on worker node

1. $kubectl drain node01

            ထုံးစံအတိုင်းပဲ worker node ကို အရင်ဆုံး master node ကနေ "drain" လုပ်ပါမယ်။ 



2. ssh and apt update

              Worker node "drain" ဖြစ်ပြီးနောက် worker node ဆီသို့ ssh ဖြင့် ဝင်ရောက်မယ် kubeadm upgrade မလုပ်ခင် အရင်ဆုံး $apt update အရင်လုပ်ပါမယ်။



3. $apt install kubeadm=1.19.0-00

            apt update ပြီးရင်တော့ kubeadm ကို စတင် upgrade လုပ်ပါမယ်။ 



4. $apt install kubelet=1.19.0-00

                kubeadm upgrade လုပ်ပြီးရင် kubelet ကို upgrade လုပ်ပါမယ်။



5. $kubeadm upgrade node

            နောက်ဆုံးအဆင့်အနေနဲ့ kubeadm ဖြင့် worker node ကို upgrade လုပ်ပါမယ်။



6. $kubectl uncordon node01

                Worker node upgrade ပြီးရင်တော့ master node ကနေ worker node ကို "drain" mode remove လုပ်ဖို့အတွက် "uncordon" ပြန်လုပ်ပါမယ်။ 



            

အခုဆိုရင်တော့ Kubernetes cluster တစ်ခုမှာ cluster node တွေကို ဘယ်လို properly down ပြီး kubernetes components တွေကို ဘယ်လို properly upgrade လုပ်မလဲဆိုတာ ပြောပြပေးသွားတာဖြစ်ပါတယ်။

That's it 😊


Pls Like and Subscribe Our Root Of Info FB Page and Youtube Channel


https://www.facebook.com/rootofinfo


https://www.youtube.com/channel/UCkOi7WxhUBKONv3uD0CvuWw?view_as=subscriber


Thank you!!!


Share:

0 comments:

Post a Comment