ก้าวสู่ยุค Cloud-Native กับ AWS Containerization: Docker, Kubernetes

ปัจจุบัน container technology ได้เข้ามามีบทบาทสำคัญในงานด้าน software development มากยิ่งขึ้น เพราะด้วยคุณสมบัติหลาย ๆ อย่าง ทำให้ culture ในการทำงานเข้าสู่ยุค cloud native คือมีคุณสมบัติในการ scale ทั้งในรูปแบบของ Team หรือ Workload 

โดยความสามารถต่าง ๆ ของ container นี้เราได้สรุปเป็นข้อ ๆ ดังนี้

  • Portability: การที่ container สามารถที่จะ write one, run anywhere สามารถคุม version และ dependency ของ software ให้มีความเสถียร ไม่ว่าจะบนเครื่องของ developer, production  ไปจนถึง DR site ก็สามารถมันใจได้ว่าเหมือนกันอย่างไม่มี side effects หรือในการจัดการ rollout software version ใหม่ก็ทำได้รวดเร็ว หรือสามารถ rollback ได้อย่างง่ายได้ ในกรณีที่เกิดปัญหาที่ไม่คาดคิด
  • Efficiency: การนำ software ไป deploy บน cloud จำเป็นที่จะต้องสร้าง virtual machine และจำเป็นที่จะต้องลง guest os และ bin/lib (dependencies) เช่น openssl, php runtime, etc. ซึ่งจำเป็นที่จะต้องใช้ disk ที่มากและใช้เวลาในการ setup นาน ในขณะที่ continer จะใช้การ share kernel รวมกันบน host os ทำให้ลดการใช้ cpu, memory, disk ลงด้วย
  • Immutability: container เมื่อถูก build เสร็จแล้วจะไม่สามารถแก้ไข file ด้านในได้ถ้าต้องการอัพเดท version software คุณจำเป็นที่จะต้อง build มันขึ้นมาใหม่ รวมไปถึงถ้า container ถูกลบ ข้อมูลก็จะหายทั้งหมดเช่นเดียวกัน ซึ่งเป็นข้อดีที่จะทำให้ software ของเราไม่มี side effects
  • Isolation: container จะมี dependency ที่แยกออกจากกันชัดเจน เช่น ต่อให้ application a มีการใช้งาน nodejs16 แล้ว application b ต้องใช้งาน nodejs18 ก็สามารถ run อยู่บน vm เดียวกันได้ มากไปกว่านั้น container ใช้ cgroups ในการ limit resources ที่จะใช้งานให้ เหมาะสม กับ application นั้น ๆ 

Container มาช่วยอะไรได้บ้างในยุค Cloud Native

จากคุณสมบัติที่กล่าวมานี่ทำให้นักพัฒนา software สามารถที่จะลดความผิดพลาดจากกระบวนการ build software ไปจนถึง deploy software ทำให้นักพัฒนา focus ไปที่ code ของ software และมั่นใจได้ว่าเมื่อสามารถ run บนเครื่องของตัวเองได้แล้วก็สามารถที่จะไป run บน cloud เจ้าไหนก็ได้

container ยังมีความพร้อมที่จะ scale workload ในแบบ horizontal โดยใช้ Orchestrator อย่าง Kubernetes ในการที่ manage container จำนวนมากได้สะดวกมากขึ้นโดยแม้แต่ นักพัฒนาเอง ก็สามารถ manage ด้วยตัวตนเองได้

และเมื่อ Team ใหญ่ขึ้น ก็สามารถที่จะพัฒนา software ไปในรูปแบบของ Microservice architecture ได้ โดยการแยก Domain การใช้งานของ software นั้นออก และแบ่งทีม ออกไปพัฒนาในส่วนของ Domain นั้น ๆ ทำให้สามารถที่จะกระจายงานได้ ลดการ Block กันระหว่าง Team พัฒนาลง

การใช้งาน Container บน AWS

หลังจากที่เกรินไปข้างต้นแล้ว ต่อไปนี้เราจะมาดูกันว่าการใช้งาน container บน AWS สามารถทำได้โดย วิธีใดบ้าง แต่ละวิธีก็จะมีข้อดีข้อด้อยแตกต่างกันไป

  1. สร้าง ec2 ขึ้นมาและ install docker จากนั้นใช้ docker compose ในการจัดการ containers วิธีนี้จะเป็นวิธีที่ง่ายเพราะเรายังไม่จำเป็นต้องเรียนรู้การใช้งาน Kubernetes และเราใช้ nginx เป็น L7 LB ภายใน Instance นั้นเอง ส่วน DB เราสามารถไปใช้ managed services อย่าง RDS Aurora หรือ DocumentDB
A screenshot of a computer program

Description automatically generated

ข้อดี

  • ใช้ resource บน AWS น้อย ราคาถูก
  • มี learning curve ไม่สูง มีแค่การใช้งาน AWS และ docker cli เบื้องต้นก็สามารถใช้งานได้

ข้อเสีย

  • การ scale ยังคงมีความลำบากในการจัดการ
  • ด้าน security ที่อยู่ในระดับเบื้องต้น
  • ในระยะยาว operational overhead จะค่อย ๆ สูงขึ้น
  1. การใช้งาน Kubernetes

Kubernetes คือ container orchestration engine ที่จะมาช่วยจัดการ container จำนวนมาก โดย kubernetes จะมีตัว scheduler ในการที่จะไปเลือกว่า container ควรจะไปลงที่ node ไหน ทำให้สะดวกมากในการ scale รวมไปถึง failover service ต่าง ๆ ได้รวดเร็ว และมากไปกว่านั้นยังสามารถให้คุณได้เลือกใช้งาน Opensources tools ต่าง ๆ เช่น Grafana, Coroot, Cilium ซึ่งอาจจะเป็นการช่วยลดต้นทุนในส่วนของ license หรือ managed service บางอย่างได้

การใช้งาน Kubernetes บน AWS นั้นมี 2 แบบ

  1. Managed controlplane
  2. Unmanaged controlplane

ทั้ง 2 แบบยังมีข้อดีข้อเสียต่างกันไป แต่ในที่นี้เราจะใช้เป็น managed controlplane หรือ EKS (Amazon Elastic Kubernetes Service)

การใช้งาน EKS ยังคงให้ประสบการณ์ การใช้งานที่เหมือนกับ Native Kubernetes แต่ที่แตกต่างออกไปคือจะมี functionality บางอย่างที่น่าสนใจเช่น 

  1. การใช้ IAM role ในการ access cluster ซึ่งเป็น functionality ที่สำคัญในการจัดการสิทธิ์การเข้าถึง cluster
  2. Managed node group เป็น functionality นึงที่เราไม่ต้องจัดการ อัพเดท patch version ของ kubelet เอง และมากไปกว่านั้นยังสามารถ customize managed node group เองได้เช่นเดียวกัน โดยใช้ launch template
  3. IRSA (IAM Roles for Service Accounts) เป็น functionality ที่สำคัญในการใช้งาน kubernetes ทำให้คุณสามารถใช้ service account ในการ authenticate กับ AWS resources ต่าง ๆ เช่น S3, DynamoDB, etc. โดยที่คุณไม่จำเป็นต้องสร้าง access key ให้กับ application ต่าง ๆ ที่ run อยู่ใน cluster ทำให้ลด overhead ในการจัดการเรื่อง credentials
  4. การ Upgrade cluster version สามารถทำได้สะดวกและปลอดภัย เพราะมีการ check compatibility ก่อนที่จะทำการ upgrade
general illustration of cluster networking, including load balancer, nodes, and pods.

ข้อดี

  • สามารถใช้เลือก node type ได้หลากหลาย ตามประเภทการใช้งาน เช่น CPU intensive usage, Memory intensive usage, batch job
  • สามารถ scale ได้รวดเร็วทั้งในระดับ pod และ node
  • สามารถใช้งาน features ต่าง ๆ ของ Kubernetes ทั้งหมด
  • สะดวกในการอัพเกรด Kubernetes version
  • มี availability สูง และ self-healing

ข้อเสีย

  • ใช้ resource บน AWS ทำให้ cost สูงขึ้น โดยจำเป็นที่จะต้องใช้ ALB หรือ NAT gateway, etc.
  • ต้องมีการ setup ที่ต้องใช้ความรู้เกี่ยวกับ Kubernetes
  • ต้องใช้งาน Addon อื่น ๆ เพิ่มเติม เพื่อช่วยในเรื่อง observability หรือ service mesh
  • Network จะเริ่มซับซ้อนขึ้น
  1. Elastic Container Service (ECS)

เป็น 1 ใน service ที่น่าสนใจบน AWS ซึ่งจัดว่าอยู่ในกลุ่ม serverless ที่เราไม่ต้อง manage EKS cluster รวมไปถึง node group โดยเราสามารถที่จะนำ container image ที่ build ขึ้นมาแล้ว ไป run บน ECS ได้เลย ทำให้เราไม่ต้อง managed infrastructure ต่าง ๆ

Functionality ที่น่าสนใจ เช่น

  1. Observability, ECS มาพร้อมกับความสามารถอย่าง metric, log, tracing โดยสามารถเข้าไปดูได้บน CloudWatch
  2. Support blue/green deployment, เป็น default deployment approach ที่สามารถ switch traffic ไปยัง workload version ใหม่ สามารถทำได้ง่ายไม่ต้องมี third-party tools ใด ๆ
  3. Canary deployments, feature นี้จะใช้ร่วมกับ AWS CodeDeploy โดย
Amazon Elastic Container Service | AWS Architecture Blog

ข้อดี

  • สามารถ setup บน AWS console ได้ทันที ทำให้สะดวกสำหรับมือใหม่ ไม่จำเป็นต้องเข้าใจ Kubernetes ในเชิงลึก
  • ไม่จำเป็นต้องลง Addon สำหรับ Observability เพิ่มเติม
  • สามารถ integrate กับ Managed service บน AWS ได้อย่างง่ายได้

ข้อเสีย

  • ไม่สามารถลง addon อื่น ๆ เหมือน การใช้งาน EKS ได้
  • สามารถใช้ EBS ได้เฉพาะ standalone task

สรุป

การใช้งาน container สามารถทำได้หลายวิธีบน AWS และมีข้อดีข้อเสียแตกต่างกันไปตามความเหมาะสม โดยพิจารณาจาก cost, operational overhead, scaling, security ทั้งนี้บน AWS ก็ยังมี Managed Services มากมายที่ช่วยให้สามารถลดความซับซ้อนในการจัดการทั้ง network, database, storage

ทั้งนี้ถ้าสนใจที่จะใช้งาน Container บน AWS สามารถที่จะติดต่อรับคำปรึกษาได้ที่ Cloud HM

Reference:
https://aws.amazon.com/blogs/containers/aws-codedeploy-now-supports-linear-and-canary-deployments-for-amazon-ecs/
https://aws.github.io/aws-eks-best-practices/networking/subnets/

https://www.researchgate.net/figure/Docker-Container-vs-Virtual-Machine_fig2_369061128