Kubernetes อ่านว่า “คู-เบอร์-เน-ทิส” คือ เครื่องมือในการทำ container Orchestration หมายถึงตัวจัดการ container หลายๆตัวที่มาช่วยกันทำงาน โดยเราอาจเรียก Kubernetes ย่อๆว่า “k8s” ซึ่งมาจากตัวอักษรตรงกลาง “ubernete” มี 8 ตัว
Kubernetes คืออะไร?
Kubernetes คือ เครื่องมือที่ช่วยนำ containers หลายตัวมาทำร่วมกัน หรือจะเรียกว่า container orchestration ซึ่ง Kubernetes จะเป็นเหมือนวาทยากรที่คอยควบคุมดูแลการเล่นของนักดนตรีแต่ละคน
Kubernetes vs Docker
Kubernetes จะต่างจาก Docker ตรงที่ docker ทำหน้าที่จัดการกับ container แต่ละตัว เวลาเราสั่ง “docker run” ขี้นมาเราจะได้ container แค่ตัวเดียว แต่ตอนที่เราสร้าง deployment ลงใน kubernetes เราจะสามารถกำหนดจำนวน replicas ได้ นั่นหมายความว่าเราสามารถกำหนดจำนวนของ container ที่สร้างขึ้นมาทำงานได้
Kubernetes vs Docker Compose
Kubernetes จะมีข้อแตกต่างจาก Docker Compose ตรงที่ Kubernetes มี features ที่มากกว่า docker compose มากๆ โดยเฉพาะเรื่องนี้
- สามารถทำ Self-healing ได้ หมายความว่า Kubernetes ดูแลตัวเองได้เพียงแต่เราบอกว่าต้องการ Replicas กี่ตัว Kubernetes จะทำทุกอย่างเพื่อให้ได้จำนวน Replicas ที่เรากำหนด เช่น ถ้า server เกิด down ทำให้จำนวน replica น้อยลง Kubernetes จะ deploy replica ตัวใหม่ขึ้นมาทำงานแทนทันที
- Auto-Scaling Kubernetes สามารถทำการ scale-out(เพิ่มจำนวน replicas) แบบอัตโนมัติ เมื่อมีการใช้งานมากขึ้น และทำการ scale-in(ลดจำนวน replicas) เมื่อมีการใช้งานน้อยลง
- Zero Downtime Kubernetes จะจัดส่ง request เข้าไปยัง service ที่พร้อมทำงานแล้วเท่านั้น และเมื่อ service ตัวใหม่พร้อมทำงาน ถึงจะลบ service ตัวออก นั่นเลยทำให้การ deploy app version ใหม่ลงไปจะไม่เกิด downtime เลย
- Roll back Kubernetes จะเก็บ history ไว้ให้เรา ทำให้เราสามารถย้อนกลับไปยัง version ก่อนหน้าได้เลย โดยที่ไม่ต้อง deploy ใหม่
- Logging และ Monitoring เราสามารถทำ Logging และ Monitoring ได้ทั้่ง Layer ของ Kubernetes และ Application
ดังนั้น Kubernetes มีความสามารถด้าน Operation ที่ดีกว่า docker compose มากๆ
Kubernetes vs Docker Swarm
Kubernetes และ Docker Swarm ค่อนข้างใกล้กันมากๆ เนื่องจากเกิดมาทำงานแบบเดียวกันคือทำงานเป็น container orchestration เหมือนกัน โดยที่ Docker Swarm จะเน้นที่ความง่ายในการติดตั้งและใช้งาน เราสามารถเปิด swarm mode ขึ้นมาใช้งานำได้ด้วยคำสั่ง
$ docker swarm init --advertise-addr [MANAGER-IP]
และเครื่องที่เป็น worker ก็สามารถ join เข้ามาได้ด้วยคำสั่ง
$ docker swarm join --token=[Token จะได้ตอน run docker swarm init] [Manager IP]
แต่ด้วย Docker Swarm ที่เน้นความง่ายในการ deploy ความสามารถต่างๆก็เลยค่อนข้างน้อยเมื่อเทียบกับ Kubernetes และอีกอย่างเนื่องจากมันคือ docker ดังนั้นเราจะไม่สามารถ deploy ด้วย container runtime ยี่ห้ออื่นๆได้
ข้อดีและข้อเสียของ Kubernetes
การเลือกใช้งาน Kubernetes จะมีทั่้งข้อดีและข้อเสีย ซึ่งก่อนที่เราจะเลือกใช้งาน Kubernetes เราต้องเข้าใจทั้งข้อดีและข้อเสียของมันก่อน
ข้อดีของ Kubernetes
- Scalability จุดเด่นที่คนส่วนใหญ่ที่คนส่วนใหญ่เลือกใช้ Kubernetes คือเรื่องของการ scale เราสามารถ scale ได้ง่ายมากๆ โดยสั่ง scale out และ scale in ได้เลย หรือจะทำการ scale โดยใช้ Horizontal Pod Autoscaling(HPA) ทำการ scale โดยอัตโนมัติ
- Resource efficiency เราสามารถเลือก Node ที่จะให้ container ลงไปทำงาน(ผ่านทาง Pods)ได้ แต่เราต้องเป็นคนจัดการในส่วนนี้เอง โดยเลือก Node ที่ต้องการจะลงผ่านทาง Node Selector นอกจากนี้เรายังกำหนดปริมาณการใช้งาน cpu และ memory ได้ ซึ่งจะยิ่งทำให้เราสามารถบริหารจัดการ resource ที่มีได้อย่างคุ้มต่ามากๆ
- High availability Kubernetes จะช่วยให้ Application ของเรามี High availability มากขึ้นโดย Kubernetes จะ restart container ที่ fail และย้ายไปยัง Node อื่นที่มี resource มากกว่าโดยอัตโนมัติ
- Portability การ deploy application ลงบน kubernetes บน Local, On-Premise และบน Cloud ไม่มีความแตกต่างกันเลย ทุก platform จะใช้วิธีเดียวกันหมด ดังนั้่นเราสามารถนำ application ของเราย้ายจาก On-Prem ไป Cloud หรือจะย้ายจาก AWS ไปยัง Azure ได้เลยโดยไร้ข้อจำกัด
- Self-Healing Kubernetes จะดูแลตัวเองได้ เมื่อ Container ของเราไม่ทำงาน Kubernetes จะทำการ restart ให้โดยอัตโนมัติและยัง
- Extensibility มีเครื่องมือที่เข้ามาช่วยทำงานเยอะมาก ทั้งการทำ continuous deployment รวมไปถึงการทำ GitOps(เมื่อบน Repository มีการเปลี่ยนแปลง Manifest file Kubernetes cluster ก็จะทำการ update ทันที)
- Flexibility เราสามารถเลือกวิธีการ Deploy ได้หลากหลายทั้ง Blud-green deployment, Canary release หรือ rolling update โดยที่ไม่ต้องใช้ความสามารถของ API Gateway เลย
ข้อเสียของ Kubernetes
- Complexity มีความซับซ้อนมากๆ เนื่องจากความสามารถของ Kubernetes นั้นมีเยอะมากอย่างที่เราว่ากันไปในข้อดีของ Kubernetes ด้านบน มันก็เลยทำให้การใช้งาน Kubernetes ยากขึ้่นไปด้วย
- Learning Curve และไม่ใช่แค่ตวามซับซ้อนเท่านั้น ความเยอะก็เช่นเดียวกัน เฉพาะ Kubernetes resources ที่มีมาให้ก็เยอะจนใช้ไม่หมดแล้ว เรายังต้องมี tools อื่นๆที่นำเข้ามาช่วยเพิ่มประสิทธิภาพการทำงานของ Kubernetes อีก
- Performance Overhead Kubernetes เองก็ต้องการใช้ทรัพยากร(CPU, Memory) เหมือนกัน ดังนั้นเราก็ต้อง share ทรัพยากรส่วนหนึ่งให้กับ Kubernetes ใช้งานด้วย
- Security ส่วนนี้ถือว่าค่อนข้างยากเลยทีเดียว เพราะการจัดการสิทธิการเข้าใช้งาน Kubernetes ในแต่ละจุดเราสามารถดูแลได้ค่อนข้างยาก
- Dependency Kubernetes นั้นไม่สามารถทำงานด้วยตัวเองได้ ต้องมี Container runtime(ทำหน้าที่จัดการสร้างและทำลาย container) และ storage providers(ทำหน้าที่ดูแลพื้นที่จัดเก็บข้อมูล) ดังนั้นการดูแล Kubernetes เราต้องดูแลทั้ง Container runtime และ Storage providers ด้วย
- Incompatibility with some legacy ถ้าระบบเก่าๆที่ไม่ได้ออกแบบมาสำหรับการทำงานบน container และใช้ session(เป็น stateful) จะปรับเข้ากับ Kubernetes ได้ยาก
Application ที่เหมาะกับ Kubernetes ต้องมีแนวคิดเป็น stateless
- Networking การออกแบบและดูแลระบบ Network นั้นจะทำได้ยากขึ้น
Kubernetes Architecture
ใน Kubernetes Cluster จะประกอบไปด้วยองค์ประกอบต่างๆ ดังรูป
ก่อนที่เราจะเริ่มต้นใช้งาน Kubernetes เราต้องรู้จักกับ Kubernetes Resources ต่างๆ เหล่านี้ก่อน
-
Nodes คือ เครื่อง server ที่นำมาใช้ใน cluster อาจเป็น physical server หรือ VM ก็ได้ ซึ่ง Nodes ที่นำมาสร้าง Kubernetes Cluster นั้นจะต้องมีทั้ง
- Master หรือ Control Plane ทำหน้าที่ดูแลสุขภาพของ cluster
- Worker ทำหน้าที่รับ load จริงๆ เราจะ run application แค่ใน worker เท่านั้น
-
Deployment การ deploy application ลงไปเราจะใช้ deployment ซึ่ง deployment จะทำหน้าที่ จัดเก็บ history หรือจัดการเรื่องของ version(roll out หรือ roll back)
-
ReplicaSet ดูแลให้จำนวนของ replicas เป็นไปตามที่กำหนดไว้ ReplicaSet จะอยุ่ภายใต้การดูแลของ deployment อีกที
-
Pods คือ หน่วยที่เล็กที่สุดของ Kubernetes(unit of work) ทำหน้าที่ห่อหุ้ม container ไว้ ซึ่ง Kubernetes จะสร้างหรือลบ Pod ทั้ง Pod Kubernetes จะไม่เข้าไปเพิ่มหรือลบ container ข้างใน(จะทำได้อย่างเดียวเลยคือ restart container ใน Pod ในกรณีที่ container นั้นหยุดทำงาน)
-
Services คือ loadbalancer ที่ทำหน้าที่รับ request และส่งต่อไปยัง container ปลายทาง ซึ่ง Services จะแบ่งออกเป็น 4 ประเภท ดังนี้
- ClusterIP เป็นค่า default โดย service ที่เป็น ClusterIP จะ map ชื่อ service กับ IP ภายใน cluster ดังนั้นทุกๆ container ภายใน cluster นี้จะใช้ชื่อ service นี้ในการอ้างอิง เหมือนกับที่เราใช้ชื่อ service ใน docker-compose
- NodePort เป็นการเปิด Port ที่เรากำหนด ในทุกๆ Node เราสามารถเรียก service ต่างๆได้โดยใช้
[IP Address ของ Node]:[Port ที่เปิดออกมา]
ซึ่ง Port ที่เปิดออกมาจะต้องอยู่ในช่วง 30000-32767 โดย default เราสามรรถแก้ไขใน configuration ได้
การเปิด NodePort มีความเสี่ยงไม่แนะนำให้ใช้ ถ้าไม่จำเป็น
- LoadBalancer ใน Cloud platform หรือบน Server ที่มีการติดตั้ง Load Balancer ไว้ เราสสามารถ map ชื่อ service กับ IP และ Port ที่ได้จาก load balancer ที่มีได้ นั่นจะทำให้เราสามารถเรียกใช้งาน service จากภายนอกได้
- ExternalName ทำหน้าที่ map ชื่อ service กับ domain ที่อยู่ภายนอก cluster(ทำหน้าที่เป็น DNS)
Nodes vs Pods
Nodes กับ Pods นั้นมีความสับสนในการใช้งานสำหรับมือใหม่อยู่พอสมควร ดังนั้นให้จำง่ายๆว่า Nodes หมายถึงเครื่องที่เรานำมาใช้สร้าง cluster แต่ Pods นั้นเป็นสิ่งที่ Kubernetes สร้างขึ้นมาเพื่อดูแล container หลังจากที่มี cluster แล้ว
ติดตั้ง Kubernetes
การติดตั้ง Kubernetes นั้นมีให้เลือกหลากหลายแบบ ทั้งบน Local, Server ของเราเอง(On-Prem) และบน Cloud Service Provider ทั้งหลาย ซึ่งในแต่ละแบบก็จะมีเครื่องมือให้เราเลือก ดังนี้่
ติดตั้ง Kubernetes บน Local
การติดตั้ง Kubernetes บน Local นั้นจะมีหลายทางเลือก ดังนี้่
- Docker for Desktop วิธีนี้จะง่ายที่สุดเพราะในเครื่องเราจะมีการใชงาน Docker อยู่แล้วเราเพียงแต่ไป Enable Kubernetes ขึ้นมาใช้งานก็เสร็จเรียบร้อยแล้ว อ่านต่อ
- Mini Kube เราสามารถใช้ virtualization technology มาจำลองเป็น Kubernetes Cluster โดย virtualization ที่สามารถนำมาใช้นั้นสามารถเป็นได้ทั้ง docker, QEMU, Hyperkit, Hyper-V, KVM, Parallels, Podman, VirtualBox, หรือ VMware Fusion/Workstation ก็ได้ แต่ข้อเสียของ Minikube คือทั้ง master และ worker จะทำงานอยู่ใน VM เครื่องเดียวกันทำให้ไม่สามารถทดสอบการกระจาย load ได้ อ่านต่อ
- Kind เป็น project จากผู้พัฒนาค่ายเดียวกับ Minikube แต่ต้องการลดข้อจำกัดของ Mimikube ที่จำกัดว่าจะต้องมี master และ worker แค่ตัวเดียวเท่านั้น โดย Kind จะใช้่ Docker ในการจำลอง Cluster ซึ่ง Kind จะสามารถกำหนดจำนวน Master และ Worker ได้ตามที่เราต้องการ อ่านต่อ
ติดตั้ง Kubernetes บน On-Premise
วิธีการติดตั้ง Kubernetes บน On-Premise นั้นเราจะใช้ kubeadm และ kubectl ซึ่งขั้นตอนการติดตั้งสามารถดูได้ที่ วิธีการติดตั้ง kubernetes บน Ununtu 22
ติดตั้ง Kubernetes บน Cloud
การติดต้ัง Kubernetes บน Cloud จะต้องขึ้นอยู่กับ Cloud service provider ส่วนใหญ่ขั้นตอนการติดตั้ง จะเป็นการสร้าง Kubernetes cluster บน Cloud และ run command line เพื่ิอเชื่อมต่อกกับ Kubernetes cluster ที่ได้สร้างขึ่นมานั้น วิธีการติดตั้ง cluster ดูได้ตามนี้
- https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html
- https://learn.microsoft.com/en-us/azure/aks/learn/quick-kubernetes-deploy-cli
- https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-access-for-kubectl