AWS Thai Blog
เริ่มต้นใช้งาน Amazon EKS ให้ตรงตาม best practice ด้วย EKS Blueprints
เป็นที่ทราบกันดีว่า Kubernetes (K8s) เป็นเครื่องมือที่ได้รับความนิยมสำหรับการทำ container orchestration ซึ่งช่วยให้ผู้ใช้งานสามารถที่จะรันและจัดการ application ประเภท container ในระดับสเกลได้สะดวกขึ้น ถึงแม้ AWS จะมีบริการอย่าง Amazon EKS มาช่วยจัดการในส่วนคลัสเตอร์ให้แล้ว แต่ ecosystem ของ K8s เติบโตเร็วมาก ทำให้ add-on เกิดขึ้นมาให้เลือกใช้งานมากมายหลากหลายเพื่อใช้งานในลักษณะที่แตกต่างกัน ด้วยเหตุผลนี้ทำให้การสร้าง K8s คลัสเตอร์ ขึ้นมาใช้งานให้ตรงตามความต้องการของเรานั้น อาจจะทำให้เกิดความลังเลในการตัดสินใจเลือกใช้เครื่องไม้เครื่องมือต่างๆ รวมถึงไม่มั่นใจว่าคลัสเตอร์ที่เราใช้งานอยู่นั้นตรงตามวิธีปฏิบัติ (best practices) หรือไม่ ซึ่งทำให้ใช้เวลาพอสมควรกว่าจะได้เริ่มรัน workload บน K8s
โดยทั่วไปจากการใช้งาน ในหนึ่งคลัสเตอร์จะมีหลาย application ที่เจ้าของนั้นมักจะเป็นคนละทีมกัน ทำให้ต้องคำนึงถึงเรื่องการกำหนดสิทธิ์การเข้าถึงคลัสเตอร์และ network policy บนคลัสเตอร์เพื่อแยก environment กัน รวมถึงให้สิทธิ์การใช้งาน AWS service ต่างๆ แก่ application และผู้ใช้งาน ซึ่งงานเหล่านี้อาจจะดูไม่ใช่ประเด็นเท่าไร แต่ถ้าหากจำนวนคลัสเตอร์ที่ต้องดูแลมีมากขึ้น หรือมี application รันเป็นหลักสิบขึ้นไป การที่จะควบคลุมและกำหนดสิทธิ์ต่างๆ ก็จะทำได้ช้าลงและอาจไม่ครอบคลุมทั่วถึง
ซึ่งทาง AWS ได้รับความคิดเห็นและร้องขอจากผู้ใช้งานเป็นจำนวนมากว่ามีวิธีการอย่างไรที่จะช่วยให้สามารถรวบรวมเครื่องมือเกี่ยวกับ K8s ต่างๆ เข้าด้วยกัน เพื่อให้พวกเขาสามารถสร้าง K8s environment ที่ต้องการได้รวดเร็ว และถ้าเป็นไปได้ solution ควรจะใช้เครื่องมือที่คุ้นเคยอยู่แล้ว อย่างเช่น Terraform CDK และ Helm ในการช่วยจัดการ EKS คลัสเตอร์และ software สำหรับงานด้าน operation บนคลัสเตอร์ รวมถึงการตั้งค่าสำหรับการกำหนดสิทธิ์การเข้าถึงของแต่ละทีม และด้วยความต้องการเหล่านี้ ทำให้ EKS Blueprints ได้ถูกคิดและสร้างขึ้นมาในรูปแบบ open source อย่างไรก็ดีตัวโปรเจคเองได้มีการนำ module จาก Terraform registry อย่าง terraform-aws-modules มาใช้ในการสร้าง EKS คลัสเตอร์ ทำให้ผู้ใช้งานที่คุ้นเคยกับ Terraform อยู่แล้วไม่ต้องเรียนรู้ใหม่ ที่สำคัญ EKS Blueprints มีให้เลือกใช้งานทั้งเวอร์ชั่น CDK และ Terraform
ทำความเข้าใจกับ EKS Blueprints
EKS Blueprint ช่วยให้ผู้ใช้งานสามารถที่จะสร้าง EKS คลัสเตอร์ให้พร้อมใช้งานได้เลย รวมถึงติดตั้ง software หรือ add-on ให้เสร็จ เพื่อเพิ่มความสามารถให้กับคลัสเตอร์ และอำนวยความสะดวกให้กับผู้ใช้งานในด้าน operation ส่วนการใช้งาน EKS Blueprints นั้นจะเป็นวิธี declarative โดยระบุ state ที่ต้องการของ EKS environment ซึ่งครอบคลุมทั้ง control plane data plane และ add-on ทั้งยังรวม สิทธิ์การเข้าถึงคลัสเตอร์ได้ในรูปแบบของ Infrastructure as Code หรือ IaC ซึ่งเราสามารถนำโค๊ดชุดนี้ไปสร้าง environment ที่เหมือนกันบน AWS account อื่นๆ ทั้งใน region เดียวกันหรือต่างกันก็ได้ ในส่วน K8s add-on ยอดนิยมก็มีจำนวนไม่น้อยที่สามารถเรียกใช้งานผ่าน EKS Blueprints ได้อย่างเช่น Prometheus, Karpenter, Nginx, Traefik, AWS Load Balancer Controller, Fluent Bit, Keda และ ArgoCD เป็นต้น ที่สำคัญ EKS Blueprints ยังช่วยในเรื่องการกำหนดสิทธิ์ในการเข้าถึงและใช้งานคลัสเตอร์ด้วย IAM user/role ได้อีกด้วย ท้ายสุดหากต้องการที่จะดีพอย application ด้วยรูปแบบ GitOps Continuous Delivery สามารถติดตั้ง add-on อย่าง ArgoCD มาช่วยได้ในส่วนนี้ จากตารางด้านล่างได้ทำการสรุปในส่วนประกอบต่างๆ ที่ EKS Blueprints สร้างให้ได้ดังต่อนี้
ส่วนประกอบ | คำอธิบาย |
Cluster | EKS คลัสเตอร์และกลุ่มของ worker node |
Add-on | software ที่เพิ่มขีดความสามารถให้กับคลัสเตอร์ รวมถึงงานด้าน operation ที่ช่วยในการรันและจัดการ application ให้สะดวกขึ้น |
Team | กลุ่มของ IAM user หรือ role ที่ใช้ในการเข้าถึงและใช้งาน K8s ทรัพยากรต่างๆ |
Application | Application ที่รันอยู่บน EKS คลัสเตอร์จัดการด้วยรูปแปบ GitOps CD |
เพื่อให้เข้าใจมากยิ่งขึ้น ขอยกตัวอย่างจากแผนภาพด้านล่างที่แสดงให้เห็น EKS environment ที่ถูกสร้างด้วย EKS Blueprints โดยในส่วนของคลัสเตอร์นั้น สามารถถูกสร้างให้กระจายอยู่ทั้ง 3 availability zone สำหรับ K8s add-on เองก็มีให้เลือกสรรหลากหลายเพื่อตอบโจทย์การใช้งานในแต่ละประเภท เช่น DNS autoscaling ingress observability CD และอื่นๆ และรวมถึงการสร้าง role ขึ้นมาบนคลัสเตอร์ โดยแบ่งออกเป็น 2 ประเภทหลักๆ ได้แก่ ทีมที่ดูแลคลัสเตอร์ หรือที่เรียกว่า platform team กับอีกทีมที่เป็นเจ้าของ application หรือเรียกว่า application team
ตัวอย่างการใช้งาน EKS Blueprints
ทาง AWS ได้พัฒนาตัวอย่างการใช้งาน EKS Blueprints ด้วย Terraform และ CDK ให้ผู้ใช้งานสามารถดูเป็นแบบอย่างว่าจะเริ่มต้นใช้งานได้ตามวัตถุประสงค์อย่างไร ยกตัวอย่างเช่น สร้าง EKS คลัสเตอร์ควบคู่กับ Karpenter เพื่อให้คลัสเตอร์มีความสามารถในการสเกล worker node ได้เร็วขึ้น หรือดีพอย observability stack สำหรับ EKS คลัสเตอร์กับ workload เพื่อสามารถมอนิเตอร์แล้วตรวจจับความผิดพลาดของระบบได้ไวขึ้น มากไปกว่านั้นยังมีตัวอย่างสำหรับการใช้งาน ArgoCD ช่วยให้ดีพอย application และ add-on ด้วยวิธี GitOps CD ได้เป็นต้น และแน่นอนในบทความนี้จะอธิบายตัวอย่างการใช้งาน EKS Blueprints กับ ArgoCD ที่ถูกเขียนด้วย Terraform
เริ่มต้นในส่วน configuration ของ main.tf ได้มีการประกาศสร้าง resource หลายอย่าง ส่วนแรก module “eks” มีการประกาศสร้าง Amazon EKS คลัสเตอร์ ในส่วน control plane โดยสามารถระบุชื่อ (cluster_name) และเวอร์ชั่น (cluster_version) ได้ นอกจากนั้นสามารถตั้งค่าคอนฟิกการใช้งาน Amazon EKS managed addons (cluster_addons) อย่าง coredns vpc-cni และ kube-proxy รวมถึงกำหนด VPC และ subnet ที่คลัสเตอร์จะรันได้ ท้ายสุดสำหรับส่วน data plane (eks_managed_node_groups) สามารถระบุ instance type และจำนวนเครื่องที่ต้องการ มากไปกว่านั้นถ้าผู้ใช้งานต้องการใช้งาน serverless compute แทนหรือควบคู่กัน ก็ยังสามารถสร้าง AWS Fargate profile ได้เช่นกัน ซึ่งศึกษาเพิ่มเติมได้จากตัวอย่างนี้
ในโมดูลถัดมา เป็นการประกาศใช้ K8s add-on โดยทั่วไปแต่ละ add-on จะชี้ไปยัง helm repository ต้นทางของผู้พัฒนา แต่อย่างไรก็ตามผู้ใช้งานสามารถที่จะเขียนทับค่าใหม่ได้ อย่างเช่นอาจจะดึง add-on จาก helm repository ของตัวเอง อีกจุดเด่นของ EKS Blueprints คือได้ทำการรวบรวม K8s add-on จำนวนหนึ่งที่ได้รับความนิยมไว้ให้ โดยสามารถเช็คได้ตามลิงค์นี้ สำหรับวิธีติดตั้ง add-on แค่ทำการกำหนดค่า enable_{add-on} ให้เป็น true จากตัวอย่างจะเป็นวิธีใช้งานของ argocd ซึ่งเป็น add-on ที่ช่วยในการดีพอย application และ add-on ในรูปแบบ GitOps CD จากตัวอย่างจะมีส่วนที่น่าสนใจอย่าง argocd_manage_add_ons ถ้าค่าเป็น true ทาง ArgoCD จะทำการดีพอย add-on ให้ด้วย นอกเหนือไปจาก application ที่ระบุไว้ใน workloads ของ json configuration โดยผู้อ่านสามารถศึกษาวิธีใช้งาน ArgoCD app of apps pattern เพิ่มเติมได้
ในส่วนที่เหลือจะเป็นโมดูลหรือ resource อื่นๆ ที่ต้องการสร้าง ผู้ใช้งานสามารถนำ resource หรือโมดูลมารวมอยู่ใน template ของตัวเองได้ ในตัวอย่างนี้เป็นการสร้าง AWS Secrets Manager และ Amazon VPC
วิธีการใช้งาน EKS Blueprints
สิ่งที่ต้องการสำหรับใช้งาน EKS Blueprints
- ติดตั้ง AWS CLI และตั้งค่าให้คุยกับ AWS service ของผู้ใช้งานเองได้ตามลิงค์นี้
- ติดตั้ง kubectl
- ติดตั้ง Terraform
- IAM policy สำหรับ IAM user/role ไว้ใช้รัน Terraform ซึ่งดาวน์โหลดได้จากที่นี้
ขั้นตอนการดีพอย
1. รันคำสั่ง terraform ตามด้านล่าง โดยก่อนรันให้ย้าย current directory ไปอยู่ที่เดียวกับ main.tf
terraform init
terraform apply -auto-approve
2. หลังจาก terraform ทำการสร้าง resource ต่างๆ เสร็จ ทำการเช็ค EKS คลัสเตอร์ที่ถูกสร้างมาว่าทำงานได้หรือไม่ โดยใช้คำสั่ง kubectl
แต่ก่อนอื่นต้องทำการอัพเดท kube configuration บนเครื่องของผู้ใช้งานเพื่อใช้ในการเข้าถึงคลัสเตอร์ก่อน โดยสามารถรันคำสั่งตามด้านล่าง
aws eks --region <REGION> update-kubeconfig --name <CLUSTER_NAME>
โดย <REGION> คือ AWS region ที่ทำการทดสอบ
กับ <CLUSTER_NAME> คือชื่อของ EKS คลัสเตอร์ที่พึ่งถูกสร้าง
จากนั้นรันคำสั่งตามด้านล่าง เพื่อแสดง pod ที่รันอยู่บนคลัสเตอร์
kubectl get pods -A
ถ้าคลัสเตอร์ทำงานได้ปกติ จะแสดงผลลัพธ์ตามด้านล่าง โดย pod ที่อยู่บนใน team-burnham กับ team-riker namespace เป็น application workload
หรืออีกวิธีหนึ่ง สามารถเข้า ArgoCD UI ไปเช็คได้โดยรันคำสั่งตามด้านล่างนี้ เพื่อทำการเข้าถึง ArgoCD service ได้ผ่านวิธี port forward
kubectl port-forward svc/argo-cd-argocd-server 8080:443 -n argocd
จากนั้นทำการเปิดเบราว์เซอร์และใส่ url เป็น https://localhost:8080/ โดย username คือ admin ส่วน password คือค่าจาก SecretString ที่ดึงได้จาก AWS Secrets Manager ด้วยคำสั่งตามนี้
aws secretsmanager get-secret-value --secret-id <SECRET_NAME> --region <REGION>
โดย <SECRET_NAME> คือ argocd
กับ <REGION> คือ AWS region ที่ทำการทดสอบ
ลบ resource ทิ้งหลังจากเสร็จการทดสอบ
เพื่อไม่ให้เกิดค่าใช้จ่ายที่ไม่พึงประสงค์ ให้ทำตามขั้นตอนดังต่อไปนี้
- ลบ application ที่รันอยู่บนคลัสเตอร์ก่อนโดยใช้ argocd cli หรือ kubectl
- รันคำสั่ง terraform ตามด้านล่าง เพื่อทำลาย resource ที่ถูกสร้างโดย terraform
terraform destroy -target=module.eks_blueprints_kubernetes_addons -auto-approve
terraform destroy -target=module.eks -auto-approve
terraform destroy -auto-approve
กล่าวโดยสรุป
จากตัวอย่างที่สาธิตข้างต้น เป็นการนำ Terraform ซึ่งเป็น IaC ที่ได้รับความนิยมมาช่วยในการสร้าง EKS คลัสเตอร์และมัดรวม add-on ต่างๆ เข้าด้วยกัน รวมทั้งใช้ประโยชน์จาก ArgoCD ในการประยุกต์ใช้ GitOps Continuous Delivery (CD) ช่วยให้สามารถเริ่มรัน workload บน Amazon EKS ได้อย่างรวดเร็วและสะดวกต่อการดูแล ยิ่งไปกว่านั้นถ้าหากอยากลองเล่น EKS Blueprints เพิ่มเติม ทาง AWS มี workshop เกี่ยวกับ EKS Blueprints ทั้งแบบ Terraform และ CDK ให้ได้ลองทำกัน
อย่างไรก็ดีในบทความนี้ ไม่ได้ทำการสาธิตอีกจุดเด่นหนึ่งของ EKS Blueprints คือการจัดการสิทธิ์เข้าถึงและใช้งานคลัสเตอร์โดยคนละทีมกัน ซึ่งถ้าสนใจสามารถดูตัวอย่างเพิ่มเติมได้จากลิ้งค์นี้ และที่สำคัญ AWS ยังมีพาร์ทเนอร์หลายเจ้าอย่าง Datadog HashiCorp Kubecost Tetrate Velero และอื่นๆ ที่ช่วยพัฒนา add-on ของพวกเขาและส่งเข้ามาใน EKS Blueprints โปรเจค เพื่อให้ผู้ใช้งานสามารถเลือกใช้งานซอฟต์แวร์ที่คุ้นเคยอยู่แล้วบน EKS ได้สะดวกมากขึ้น
ท้ายสุด EKS Blueprints ถูกพัฒนาในรูปแบบ open source มานานมากกว่าปี โดยกลุ่มของ solutions architect และ specialist จาก AWS ซึ่งได้รับการตอบรับอย่างดีจากชุมชน โดยทางชุมชนเองยังช่วยออกไอเดียและ contribute กลับ ทำให้ EKS Blueprints เป็นที่รู้จักและนิยมกันมากขึ้น ผู้ใช้งานบางส่วนได้นำ EKS Blueprints ไปใช้อิมพลีเมนต์ระบบบน production กัน และถ้าทางชุมชมนักพัฒนาลองใช้งานกันแล้ว มีข้อเสนอแนะหรือพบปัญหาสามารถส่งเรื่องมาได้ที่ EKS Blueprints เวอร์ชั่น Terraform หรือ CDK โปรเจคบน GitHub