Docker, Container, Microservice and Kubernetes ဘာတွေလဲ?

Cloud Computing ကိုဆွေးနွေးတော့မည်ဆိုပါက Containers အကြောင်းမပါလျင် မပြည့်စုံတော့ဘူးလို့ပြောရလောက်အောင် Modern IT လောကမှာမှာ အစွမ်းပကား ကြီးမှားလာပါပြီ။ Trend change လာတဲ့ IT မှာလည်း ကျနော်တို့အနေဖြင့် Container ဆိုတာကြီးကို လေ့လာဖို့ လိုအပ်လာပါသည်။ နယ်ပယ်အသီးသီးက Banks တွေ Financial Services တွေ e-commerce sites တွေ တည်ဆောက်ဖို့ Container ဆိုတာ ဘာလဲ နားလည်ဖို့ လိုအပ်လာသလို Cloud မှာရှိတဲ့ Applications တွေက သူတို့ရဲ့ Business Development ဖြစ်လာစေဖို့ ဘယ်လောက်ထိ အထောက်အကူပြုနိုင်မလဲဆိုတာ ရှင်းရှင်းလင်းလင်း သိဖို့ လိုအပ်လာပါပြီ။ အခြေခံအားဖြင့် Container ဘယ်လို အလုပ်လုပ်သလဲ၊ ဘာကြောင့် တစ်ခြားနိုင်ငံတွေမှာ အဲလောက် ကျယ်ကျယ်ပြန့်ပြန့် လက်ခံလာကြတာလဲ ဆိုတာကို သိနိုင်ဖို့ ကျနော် သိသလောက် မှတ်သလောက် ရှဲပေးလိုက်ပါတယ်။ ကျနော်လဲ လေ့လာဆဲဖြစ်လို့ DevOps Engineer တွေအနေနဲ့ အမှားပါရင် နားလည်ပေးဖို့ အရင်တောင်းဆိုပါတယ်။

(၁) Container Overview

ကျနော်တို့သိခဲ့တဲ့ Computing ဆိုတာ Physical Server ကနေ Resources တွေဖြစ်တဲ့ CPU, RAM, Disk, Network တွေကိုသုံးပြီး ကျတော်တို့လိုချင်တဲ့ အလုပ်တွေကို လုပ်နိုင်ဖို့ Function တစ်ခု(ဥပမာ Using Chrome, Edge, Calculator, etc), အဖြစ်အသုံးချသလို။ Exchange Server လိုမျိူး Complex Application တွေ run ချင်တဲ့အခါမှာ အသုံးချခြင်းဖြစ်ပါတယ်။ တစ်နေ့ထက်တစ်နေ့ အဲဒီ Physical Resources တွေ တဖြည်းဖြည်း Powerful လာပေမယ့် တစ်ခါတစ်လေ Physical Machine hardware တွေကပေးတဲ့ Resources တွေကို Applications တွေက အပြည့်အဝ အသုံးမချတဲ့အချိန်တွေလဲရှိပါတယ်။ Virtualization ခေတ်စားလာတဲ့ နောက်ပိုင်းမှာတော့ ကျနော်တို့တွေ Multiple Applications တွေ Same Physical Server မှာ run နိုင်ဖို့အ Virtual CPU, Virtual RAM တွေဆောက်ပြီး Virtual Machine တွေအသုံးပြုလာပါတယ်။

 

[caption id="attachment_576" align="aligncenter" width="600"] Photo 1[/caption]

 

Traditional Virtualization မှာဆိုရင် Each VM အတွက် dedicated vCPU, vRAM တို့ assign ချပေးရပြီး Operating System လဲ လိုအပ်မှာဖြစ်ပါတယ်။ ပုံ(၁)မှာကြည့်ပါ။ Host တစ်ခုမှာ Hypervisor layer ခံညပီး 3x VMs run ထားပါတယ်။ OS and Libraries တွေ run နိုင်ဖို့ Phyiscal Resources တွေပေးနေရတဲ့အတွက် အဲဒီ Host မှာ Apps run နိုင်မယ့် အရေအတွက် ကန့်သတ်သွားမှာဖြစ်ပါတယ်။ Container မှာတော့ အဲလိုမဟုတ်ပါဘူး။ သူက Operating System Virtualization ဖြစ်ပါတယ်။ အရမ်းကို ပေါ့ပါးတဲ့ Load သာလိုအပ်ပြီး Hypervisor အတွက် extra load မလိုအပ်တော့ပါ။ ပုံ(၂)မှာကြည့်ပါ။ Hypervisor layer မရှိတော့ပါဘူး။ Host ရဲ့ Kernel တစ်ခုထဲကနေ namespace လေးတွေဆောက်ပြီး isolation ခွဲလိုက်ခြင်းဖြစ်ပါတယ်။ ရှင်းအောင်ပြောရရင် dedicated process တစ်ခုဆောက်လိုက်ပြီး အဲဒီ process ထဲမှာ Application တစ်ခု run ဖို့ Binaries, Libraries တွေ Network ports တွေ Necessary Processes များကိုသာ Container တစ်ခုအနေနဲ့ သပ်သပ် run လိုက်တာပါ။ Container အမျိူးအစားတွေမှာ Linux, Windows ဆိုပြီးရှိတဲ့အတွက် Developer တွေအနေဖြင့် ကိုယ်လိုအပ်တဲ့ Apps ကို ကိုယ်ကြိုက်တဲ့ Platform နဲ့ Develop လုပ်နိုင်မှာဖြစ်ပါတယ်။ Host တစ်ခုမှာ အဲလိုမျိူး Container ပေါင်း ရာနဲ့ချီ unlimited တည်ဆောက်နိုင်ပါတယ်။ Isolation ဖြစ်တဲ့အတွက်ကြောင့် Container တစ်ခုနဲ့ တစ်ခု access ရမှာမဟုတ်ပါဘူး။ Application တွေလဲ same Kernel, Same Host မှာ run နေပေမယ့် conflict ဖြစ်မှာ မဟုတ်ပါဘူး။ Host အနေနဲ့ကလဲ Container တစ်ခုချင်းဆီမှာလိုအပ်မယ့် CPU, RAM, Network Bandwidth တွေကို Control လုပ်နိုင်ပါတယ်။ ဥပမာ Container တစ်ခုက Physical CPU ရဲ့ 10% အထက်ပိုမသုံးရဘူးဆိုပြီး Configure လုပ်ထားလို့ရပါတယ်။ Linux မှာဆိုရင် ဒါကို cgroups လို့ခေါ်ပါတယ်။

 

[caption id="attachment_575" align="aligncenter" width="600"] Photo 2[/caption]

 

(၂) Docker, Windows Server Container & Azure Container Service

Docker ဆိုတာကတော့ ယခု Container လောကမှာ Popular ဖြစ်နေတဲ့ Opensource Software Container Platform ပဲဖြစ်ပါတယ်။ ပုံ(၃) မှာ ဖော်ပြထားသလို Docker Engine ဟာ Host ရဲ့ အပေါ်ကနေ run ပြီး container တွေ တည်ဆောက်ဖို့ အထောက်အကူပေးပါတယ်။ Docker Engine မှာဆို ပုံမှန်အားဖြင့် 3 layers ပါပါတယ်။ Docker Daemon, Rest API and Docker CLI Client တို့ဖြစ်ပါတယ်။ Docker Daemon ကဘယ်လိုအလုပ်လုပ်လဲဆိုတော့ Objects တွေဖြစ်တဲ့ OS Images, Container, Network, volumes တွေ အသစ်ဖန်တီးတာတို့ manage လုပ်တာတို့ အစရှိတဲ့ Process တွေကို ပြုလုပ်နိုင်ပါတယ်။ ယေဘုယျအားဖြင့် Docker CLI Client ကနေ ကိုယ်ပြုလုပ်ချင်တဲ့ process တွေကို Rest API မှတစ်ဆင့် Docker Daemon ကို စေခိုင်းနိုင်ပါတယ်။ ပုံ(၄)နှင့် ပုံ(၅) မှာကြည့်ပါ။ Docker Client ကနေ ဘာတွေလုပ်နိုင်လဲဆိုတော့ Docker Hub လို့ခေါ်တဲ့ https://hub.docker.com/ Online Repository ဆိုက်ကနေ images တွေ registry တွေကို Docker Pull command နဲ့ ဆွဲချပြီး Container တွေပေါ်မှာ Run လို့ရပါတယ်။ ဥပမာ - Ubuntu Container တစ်ခု run ချင်ပါက Docker Hub ကနေ Ubuntu imageကို download ဆွဲချပြီး Container ပေါ်မှာတင်လို့ရပါတယ်။ တင်ပြီးရင်တဲ့ ကိုယ်လိုချင်တဲ့ Application ကို စတင် develop လုပ်နိုင်ပါပြီ။

 

[caption id="attachment_585" align="aligncenter" width="600"] Photo 3[/caption]

 

Server 2016 ကို Microsoft ကစတင်မိတ်ဆက်လိုက်တဲ့ အခါမှာတော့ Container Features အသစ်ပါ၀င်လာပါတယ်။ User တွေအနေနဲ့ Server Core Edition သို့မဟုတ် GUI Edition တင်ပြီး Container Roles Features ကိုထည့်လိုက်ရုံဖြင့် စတင်အလုပ်လုပ်လို့ရပါပြီ။ Container ကို အလုပ်တွေ စေခိုင်းဖို့ Docker Engine ကို PSGallery ကနေဆွဲနိုင်ပါတယ်။ ဒီလင့်မှာ Guide ရှိပါတယ်။  https://blogs.technet.microsoft.com/canitpro/2016/10/26/step-by-step-setup-docker-on-your-windows-2016-server/

 

 

 

[caption id="attachment_586" align="aligncenter" width="492"] Photo 4[/caption]

[caption id="attachment_595" align="aligncenter" width="600"] Photo 5[/caption]

 

Docker ကို Windows 10 မှာ စမ်းသပ်ချင်တယ်ဆိုရင်တော့ Docker website ကနေ Docker for Windows ကို ဒေါင်းပြီး စမ်းသပ်နိုင်ပါတယ်။ ထို့ပြင် Docker ကို Linux OS တွေဖြစ်တဲ့ Ubuntu, Redhat, CentOS တို့အတွက်လည်း သူ့ရဲ့ Website မှာ အသီးသီးရှိပါတယ်။ Windows Server Container မှာဆိုရင်တော့ ၂မျိူးရှိပါတယ်။ ပထမတစ်ခုက Host OS ရဲ့ Kernel ကို အသုံးပြုတဲ့ Server Container ဖြစ်ပြီး နောက်တစ်ခုကတော့ Hyper-V Container ဖြစ်ပါတယ်။ Hyper-V Container ကိုတော့ fully isolation and dedicated CPU/RAM Resource တွေပေးချင်တဲ့အခါ အသုုံးပြုပါတယ်။ Container က Host OS ရဲ့ Kernel ကို ယူပြီး အသုံးပြုတာကြောင့် Windows Server 2016 မှာတော့ Windows Server Container အနေဖြင့်သာ အသုံးပြုနိုင်ပါတယ်။ Linux Container လိုချင်ရင်တော့ Hyper-V ပေါ်မှာ Linux VM တစ်ခု run ဖို့ လိုအပ်ပါမယ်။ ဒါပေမယ့် နောက်အသစ်ထွက်လာမယ့် Windows Sever Edition ဖြစ်တဲ့ Windows Server 1709 မှာတော့ Linux Container ကို Windows Server ပေါ်မှာ Hyper-V မလိုပဲ run နိုင်ပါပြီ။ Container ကို Cloud မှာ အသုံးပြုချင်တဲ့သူတွေအတွက်ကတော့ Azure Container Service ရှိပါတယ်။

(၃) Docker, Containerize Applications တွေဘယ်မှာသုံးမလဲ

Container used cases တွေအများကြီး ရှိတဲ့ထဲက popular ဖြစ်တဲ့ used case ၃ခုကို ဖော်ပြပေးလိုက်ပါတယ်။

- Applications တစ်ခုကို အစကနေ build လုပ်တဲ့အခါမျိူးမှာ Container ကို အသုံးပြုလို့ရပါတယ်။ သူတို့တွေက Infra မရွေး lift-shift အလွယ်တကူ migrate လုပ်လို့ရပါတယ်။ ဥပမာ Developer တစ်ယောက်အနေနဲ့ Windows Server မှာ run ထားတဲ့ container ကို အလွယ်တကူပဲ Cloud ပေါ်ရွေ့လို့ရပါတယ်။
- monolithic application လို့ခေါ်တဲ့ 1-tier Apps တွေလုပ်တဲ့အခါမျိူးမှာ Container ကို အသုံးပြုပါတယ်။ တနည်းအားဖြင့် Microservice လို့ခေါ်တဲ့ App တွေ တည်ဆောက်တဲ့နေရာမှာ Container ကို သုံးလို့ရပါတယ်။ Microservice ဆိုတာ Application တစ်ခုကြီးရဲ့ အစိတ်အပိုင်း Module Function တွေကို self-contained component အနေနဲ့ develop လုပ်တာပါ။ တစ်ခုနဲ့တစ်ခုက မှီခိုမနေပါဘူး။ ဥပမာအားဖြင့် App တစ်ခုမှာ အစိတ်အပိုင်း ၂ခုပါ၀င်တယ်ဆိုပါစို့။ တစ်ခုက public internet က လာတဲ့ request တစ်ခုကိုလက်ခံမယ့် subsystem ဖြစ်ပြီး နောက်တစ်ခုက request တွေကို database queue ထဲရိုက်ထည့်မယ့် subsystem ဖြစ်တယ်လို့ထားပါ။ အဆိုပါ အစိတ်အပိုင်း ၂ခုကို သီးခြားဆီ container ပေါ်မှာတင်လို့ရပါတယ်။ ဒါကို microservice လို့ခေါ်ပါတယ်။ အဆိုပါ အစိတ်အပိုင်း၂ခုကသပ်သပ်စီ ဖြစ်သွားတာကြောင့် တစ်ခုချင်းစီ scale-up/scale-down လုပ်လို့ရသလို update လဲလုပ်လို့ရပါတယ်။ အကယ်၍ internet ကလာတဲ့ request တွေများနေရင် ပထမ subsystem ကိုပဲ သပ်သပ် scale-up လုပ်လို့ရပါတယ်။
- DevOps Scenario တွေမှာလဲ Container ကို အသုံးပြုလေ့ရှိပါတယ်။ ယခင်က VM Environment မှာဆိုရင် Development, Test, Production ဆိုပြီးခွဲလေ့ရှိပါတယ်။ ဒါတွေအတွက် သီးခြား OS/binaries တွေလိုပါတယ်။ Container Software Development မှာ Continuous Integration/ Continuous Development တွေကို Automation ပြုလုပ်လို့ရပါတယ်။

(၄) Orchestration with Docker Swarm, Kubernetes, Mesosphere

Container တွေကို ရာနဲ့ချီ ထောင်နဲ့ချီ deploy လုပ်လာတဲ့အခါမှာတော့ customer တွေမှာ challenge တွေရှိလာပါတယ်။ ဒါကတော့ အဲဒီ Containers တွေကို manage ဘယ်လိုလုပ်မလဲ။ track ဘယ်လိုလုပ်မလဲ။ ထို့ပြင် High Availability ရအောင် ဘယ်လိုလုပ်မလဲ အစရှိသဖြင့် ခေါင်းစားလာပါတယ်။ ဒါတွေကို ကျနော်တို့ Container Orchestration Solutions တွေသုံးပြီး ဖြေရှင်းလို့ရပါတယ်။ Container Orchestration ကဘာလုပ်ပေးလဲဆိုတော့ Bare Metal Server, VM တွေပေါင်းပြီး Server Pools တစ်ခုအနေနဲ့ Cluster တည်ဆောက်လိုက်ပါတယ်။ ပြီးရင် Container တွေကို အဲဒီ Cluster မှာ deploy လုပ်ဖို့ schedule လုပ်ပေးနိုင်ပါတယ်။ တစ်ချိူ့ orchestration ဆိုရင် load balance လုပ်ပေးတာတို့ Container name resolution လုပ်ပေးတာတို့ additional capabilities တွေပါ လုပ်ပေးနိုင်ပါတယ်။ နာမည်ကြီး Container Orchestration Solutions တွေကတော့ Docker Swarm, Mesos နဲ့ Google ကထုတ်တဲ့ Opensource Kubernetes တို့ဖြစ်ပါတယ်။ ဒါတွေအကုန်လုံး Azure မှာ support ပေးပါတယ်။

Azure Container အကြောင်း သိချင်ရင် ဒီလင့်မှာ ၀င်ရောက်နိုင်ပါတယ်။ နောက်ပိုင်းလုပ်မယ့် Workshop တွေမှာ Azure Container Service, Windows Container နဲ့ Kubernetes on Azure တို့ကို သိသောက် ရှင်းပြပေးသွားပါမယ်။
https://github.com/…/Docker%20and%20Azure%20Container%20Ser…

Photo Credit #Various Resource