Coding Gun

Kubernetes คืออะไร?


Kubernetes อ่านว่า “คู-เบอร์-เน-ทิส” คือ เครื่องมือในการทำ container Orchestration หมายถึงตัวจัดการ container หลายๆตัวที่มาช่วยกันทำงาน โดยเราอาจเรียก Kubernetes ย่อๆว่า “k8s” ซึ่งมาจากตัวอักษรตรงกลาง “ubernete” มี 8 ตัว

Kubernetes คืออะไร?

Kubernetes คือ เครื่องมือที่ช่วยนำ containers หลายตัวมาทำร่วมกัน หรือจะเรียกว่า container orchestration ซึ่ง Kubernetes จะเป็นเหมือนวาทยากรที่คอยควบคุมดูแลการเล่นของนักดนตรีแต่ละคน

Container orchestration

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 มากๆ โดยเฉพาะเรื่องนี้

  1. สามารถทำ Self-healing ได้ หมายความว่า Kubernetes ดูแลตัวเองได้เพียงแต่เราบอกว่าต้องการ Replicas กี่ตัว Kubernetes จะทำทุกอย่างเพื่อให้ได้จำนวน Replicas ที่เรากำหนด เช่น ถ้า server เกิด down ทำให้จำนวน replica น้อยลง Kubernetes จะ deploy replica ตัวใหม่ขึ้นมาทำงานแทนทันที
  2. Auto-Scaling Kubernetes สามารถทำการ scale-out(เพิ่มจำนวน replicas) แบบอัตโนมัติ เมื่อมีการใช้งานมากขึ้น และทำการ scale-in(ลดจำนวน replicas) เมื่อมีการใช้งานน้อยลง
  3. Zero Downtime Kubernetes จะจัดส่ง request เข้าไปยัง service ที่พร้อมทำงานแล้วเท่านั้น และเมื่อ service ตัวใหม่พร้อมทำงาน ถึงจะลบ service ตัวออก นั่นเลยทำให้การ deploy app version ใหม่ลงไปจะไม่เกิด downtime เลย
  4. Roll back Kubernetes จะเก็บ history ไว้ให้เรา ทำให้เราสามารถย้อนกลับไปยัง version ก่อนหน้าได้เลย โดยที่ไม่ต้อง deploy ใหม่
  5. 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

  1. Scalability จุดเด่นที่คนส่วนใหญ่ที่คนส่วนใหญ่เลือกใช้ Kubernetes คือเรื่องของการ scale เราสามารถ scale ได้ง่ายมากๆ โดยสั่ง scale out และ scale in ได้เลย หรือจะทำการ scale โดยใช้ Horizontal Pod Autoscaling(HPA) ทำการ scale โดยอัตโนมัติ
  2. Resource efficiency เราสามารถเลือก Node ที่จะให้ container ลงไปทำงาน(ผ่านทาง Pods)ได้ แต่เราต้องเป็นคนจัดการในส่วนนี้เอง โดยเลือก Node ที่ต้องการจะลงผ่านทาง Node Selector นอกจากนี้เรายังกำหนดปริมาณการใช้งาน cpu และ memory ได้ ซึ่งจะยิ่งทำให้เราสามารถบริหารจัดการ resource ที่มีได้อย่างคุ้มต่ามากๆ
  3. High availability Kubernetes จะช่วยให้ Application ของเรามี High availability มากขึ้นโดย Kubernetes จะ restart container ที่ fail และย้ายไปยัง Node อื่นที่มี resource มากกว่าโดยอัตโนมัติ
  4. Portability การ deploy application ลงบน kubernetes บน Local, On-Premise และบน Cloud ไม่มีความแตกต่างกันเลย ทุก platform จะใช้วิธีเดียวกันหมด ดังนั้่นเราสามารถนำ application ของเราย้ายจาก On-Prem ไป Cloud หรือจะย้ายจาก AWS ไปยัง Azure ได้เลยโดยไร้ข้อจำกัด
  5. Self-Healing Kubernetes จะดูแลตัวเองได้ เมื่อ Container ของเราไม่ทำงาน Kubernetes จะทำการ restart ให้โดยอัตโนมัติและยัง
  6. Extensibility มีเครื่องมือที่เข้ามาช่วยทำงานเยอะมาก ทั้งการทำ continuous deployment รวมไปถึงการทำ GitOps(เมื่อบน Repository มีการเปลี่ยนแปลง Manifest file Kubernetes cluster ก็จะทำการ update ทันที)
  7. Flexibility เราสามารถเลือกวิธีการ Deploy ได้หลากหลายทั้ง Blud-green deployment, Canary release หรือ rolling update โดยที่ไม่ต้องใช้ความสามารถของ API Gateway เลย

ข้อเสียของ Kubernetes

  1. Complexity มีความซับซ้อนมากๆ เนื่องจากความสามารถของ Kubernetes นั้นมีเยอะมากอย่างที่เราว่ากันไปในข้อดีของ Kubernetes ด้านบน มันก็เลยทำให้การใช้งาน Kubernetes ยากขึ้่นไปด้วย
  2. Learning Curve และไม่ใช่แค่ตวามซับซ้อนเท่านั้น ความเยอะก็เช่นเดียวกัน เฉพาะ Kubernetes resources ที่มีมาให้ก็เยอะจนใช้ไม่หมดแล้ว เรายังต้องมี tools อื่นๆที่นำเข้ามาช่วยเพิ่มประสิทธิภาพการทำงานของ Kubernetes อีก
  3. Performance Overhead Kubernetes เองก็ต้องการใช้ทรัพยากร(CPU, Memory) เหมือนกัน ดังนั้นเราก็ต้อง share ทรัพยากรส่วนหนึ่งให้กับ Kubernetes ใช้งานด้วย
  4. Security ส่วนนี้ถือว่าค่อนข้างยากเลยทีเดียว เพราะการจัดการสิทธิการเข้าใช้งาน Kubernetes ในแต่ละจุดเราสามารถดูแลได้ค่อนข้างยาก
  5. Dependency Kubernetes นั้นไม่สามารถทำงานด้วยตัวเองได้ ต้องมี Container runtime(ทำหน้าที่จัดการสร้างและทำลาย container) และ storage providers(ทำหน้าที่ดูแลพื้นที่จัดเก็บข้อมูล) ดังนั้นการดูแล Kubernetes เราต้องดูแลทั้ง Container runtime และ Storage providers ด้วย
  6. Incompatibility with some legacy ถ้าระบบเก่าๆที่ไม่ได้ออกแบบมาสำหรับการทำงานบน container และใช้ session(เป็น stateful) จะปรับเข้ากับ Kubernetes ได้ยาก

    Application ที่เหมาะกับ Kubernetes ต้องมีแนวคิดเป็น stateless

  7. Networking การออกแบบและดูแลระบบ Network นั้นจะทำได้ยากขึ้น

Kubernetes Architecture

ใน Kubernetes Cluster จะประกอบไปด้วยองค์ประกอบต่างๆ ดังรูป

Kubernetes Cluster
ที่มา: https://kubernetes.io/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro

ก่อนที่เราจะเริ่มต้นใช้งาน Kubernetes เราต้องรู้จักกับ Kubernetes Resources ต่างๆ เหล่านี้ก่อน

Nodes vs Pods

Nodes กับ Pods นั้นมีความสับสนในการใช้งานสำหรับมือใหม่อยู่พอสมควร ดังนั้นให้จำง่ายๆว่า Nodes หมายถึงเครื่องที่เรานำมาใช้สร้าง cluster แต่ Pods นั้นเป็นสิ่งที่ Kubernetes สร้างขึ้นมาเพื่อดูแล container หลังจากที่มี cluster แล้ว

ติดตั้ง Kubernetes

การติดตั้ง Kubernetes นั้นมีให้เลือกหลากหลายแบบ ทั้งบน Local, Server ของเราเอง(On-Prem) และบน Cloud Service Provider ทั้งหลาย ซึ่งในแต่ละแบบก็จะมีเครื่องมือให้เราเลือก ดังนี้่

ติดตั้ง Kubernetes บน Local

การติดตั้ง Kubernetes บน Local นั้นจะมีหลายทางเลือก ดังนี้่

ติดตั้ง 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 ดูได้ตามนี้

อ่านบทความอื่นๆเกี่ยวกับ Kubernetes ต่อได้ที่นี่

Phanupong Permpimol
Follow me