Kubernetes Architecture 101

Pob Apiwat
LifeatRentSpree
Published in
2 min readJul 16, 2021

สวัสดีครับ Blog นี้จะมาอธิบายส่วนประกอบหลักๆ เกี่ยวกับ Architecture ภายใน Kubernetes หรือ K8s ว่ามีอะไรบ้าง ทำไมมันถึงน่าสนใจ และทำไมเราควรทำความเข้าใจมัน

ซึ่งใน RentSpree ระบบของเราก็อยู่บน Kubernetes เกือบทั้งหมด มี microservices ทำงานอยู่สามสิบกว่า servicesและส่วนการจัดเก็บข้อมูล เช่น MongoDB, ElasticSearch, RabbitMQ, Redis ก็อยู่บน K8s ทั้งหมด เช่นกัน

โดยมีแบ่ง Dev, UAT, Prod, และ Cluster กลางสำหรับจัดการเรื่อง Logging/Monitoring แยก Cluster กันอีกที

Kubernetes Architecture

ส่วนประกอบหลักๆ ของการทำงาน K8s มี 3 อย่าง ก็คือ

  • Kubernetes Master nodes หรือ Control Plane
  • Kubernetes Worker nodes
  • Distributed key-value store (etcd)

ซึ่งแต่ละอย่างทำหน้าที่อะไรบ้าง มีอะไรทำงานอยู่ภายใน K8s บ้าง มาดูกันเลยครับ

ภาพประกอบ
Ref: https://kubernetes.io/docs/concepts/overview/components/

Master nodes หรือ Control Plane

ทำหน้าที่เป็นตัวจัดการควบคุมการทำงานทั้งหมดของ K8s ซึ่งภายในจะมีส่วนประกอบ ที่ทำหน้าที่แต่ละอย่างอีกที

ส่วนนี้เป็นหัวใจสำคัญของ K8s และจำเป็นต้องมี master อย่างน้อย 1 node ต่อ Cluster ยิ่งถ้าต้องการความ High Available ควระจะต้องมีมากกว่า 2 nodes ขึ้นไป

โดยจะประกอบไปด้วย

  • kube-api-server: เป็นตัวกลางในการคุยกันภายใน Cluster ผ่าน RESTFul API ตัวอย่างเช่น เวลาเราใช้ kubectl ทุกคำสั่งจะวิ่งเข้ามาหาที่ kube-api-server ไม่ว่าจะเป็นการเพิ่ม ลบ แก้ไข deployment, service, volume, network, etc. และเป็นส่วนที่ทำหน้าที่ดูแลจัดการ Desired State ของ Cluster ทั้งหมด
  • kube-scheduler: เป็นตัวที่คอยจัดการเวลา มี Pods ใหม่ ที่ยังไม่ได้ถูก assigned ลงไปใน worker node เพื่อหา node ที่เหมาะสมจะรัน Pods ซึ่งก็จะดูจากหลายๆ ปัจจัย เช่น Cluster state, Workload หรือดูจากการตั้งค่า Affinity และ Anti-Affinity หรือ Node Selectors
  • kube-contoller-manager: เป็นตัวที่คอยจัดการ controller ต่างๆ เช่น
    - Node controller: สำหรับเช็คและจัดการ nodes
    - Replication controller: ทำหน้าที่ดูแลจัดการ replication ของ Pods
    - Endpoints controller: Populates endpoints object เช่น Services & Pods
    - Service Account & Token controllers: จัดการ service account และ API access tokens
  • cloud-controller-manager: ตัวนี้จะมีก็ต่อเมื่อเราใช้งานบน Cloud Provider ที่ K8s รองรับ ซึ่งถ้าเราใช้งานแบบ on-premises จะไม่มีตัวนี้ทำงานอยู่ และการทำงานก็จะคล้ายๆ กับ kube-controller-manager แต่จะทำหน้าที่จัดการกับ Cloud Provider API ของแต่ละเจ้า
    Controllers ที่ทำงานในฝั่งของ cloud-controller-manager:
    - Node controller: จัดการ node ในฝั่งของ Cloud Provider
    - Route controller: จัดการ routes พื้นฐานของ Cloud Provider
    - Service controller: สำหรับสร้าง แก้ไข และลบ Load Balancers ในฝั่งของ Cloud Provider และอื่นๆ

Worker nodes

ทำหน้าที่เป็น Container Runtime ซึ่งภายในจะประกอบด้วย 2 services ที่ทำงานอยู่ดังนี้

  • kubelet: รับคำสั่งจาก kube-api-server และจัดการกับ container runtime เช่น คอยเช็คว่า Pods (Containers) ยังรันอยู่บน Worker nodes หรือไม่ ถ้ามีปัญหาก็จะรายงานไปบอก kube-api-server ว่า Pods นั้นมีปัญหา ให้ทำให้จัดการ Initial Pods ใหม่
  • kube-proxy: ส่วนที่ทำหน้าที่จัดการทุกอย่างเกี่ยวกับ Network ต่างๆ เช่น เป็นตัวที่บอกว่าถ้าเรียกมาจาก Service นี้ให้วิ่งเข้าไปที่ Pods ไหน เป็นต้น

Container Runtime คือโปรแกรมที่ทำหน้าที่รัน Containers ให้เรานั้นเองซึ่งที่เรารู้จักกันดีก็คือ Docker แต่ก็มีอีกหลายตัวที่ทำหน้าที่นี้ได้เหมือนกัน เช่น containerd, CRI-O, rkt (Project ended) โดย K8s v1.20 ขึ้นไปจะเปลี่ยนจาก Docker เป็น containerd แล้ว

*** Kubernetes เป็นแค่ Container Orchestration ซึ่งหมายความว่ามันไม่สามารถรัน containersหรือเป็น Runtime ได้ในตัว ต้องอาศัย Container Runtime ในการทำงาน

Distributed key-value store | etcd

etcd เป็น Open source distributed key-value store ตัวนึงที่ K8s เอามาช่วยในเรื่องของการจัดเก็บ Persistance cluster state ทั้งหมด โดยตัวเชื่อมต่อโดยตรงกับตัว etcd ก็คือ kube-api-server นั้นเอง ซึ่งตัว etcd นี้จะรวมอยู่ในส่วนของ Control Plane อีกที

สรุป

และนี้คือส่วนประกอบหลักๆ ของการทำงาน K8s แบบคร่าวๆ ครับ หวังว่าจะมีประโยช์นสำหรับทุกคนครับ

เพิ่มเติมสำหรับคนที่คิดว่าอยากจะศึกษา K8s ลึกๆ แนะนำให้ลองทำตาม Labs นี้ครับอาจจะเห็นภาพมากขึ้น https://github.com/kelseyhightower/kubernetes-the-hard-way

--

--