DEV Community

V-ris Jaijongrak
V-ris Jaijongrak

Posted on

AWS EKS with Terraform

บทความที่แล้ว เราได้พูดถึงการสร้างคลัสเตอร์จาก eksctl ซึ่งเป็นโปรแกรมพิเศษสำหรับการสร้าง และบริหารจัดการกับ eks cluster บน AWS โดยเฉพาะ

เพื่อเป็นการทดสอบ เราลงเพียงแค่ตัว kube-apiserver บน EKS Control plane โดยที่ไม่ได้สร้าง worker node บน cluster ยังจำเป็นต้องปรับปรุงมาตรฐานด้านความปลอดภัย ก่อนจะเหมาะสมในการใช้งานได้จริง และในตอนท้ายเราได้ทำลายตัว EKS cluster ไปแล้วเพื่อจะได้ทำการสร้างใหม่ด้วย tools ที่เหมาะกับการจัดการบริหารในระยะยาวมากกว่าอย่าง IaC ในบทความนี้เราจะเจาะลึกมากขึ้นกับ Terraform

เพื่อให้การสร้าง Subnet/NAT Gateway/EKS Cluster/Nodegroup (Worker Node) เป็นไปได้อย่างราบรื่น เราจำเป็นที่จะต้องจัดการกับสิทธิ์ในการเข้าถึงผ่าน IAM เสียก่อน

IAM permissions

ทั้งนี้หากไม่ได้มีจัดการ IAM และเป็น account ส่วนบุคคล อย่างน้อยที่สุดควรใช้เป็น user account ที่มีสิทธิ์ AdministratorAccess การใช้ root account ในการบริหารจัดการหรือใช้งานทั่วไปจัดว่ามีความเสี่ยงในการก่อความผิดพลาด และหากลืมลบออกความเสี่ยงจะเพิ่มเป็นทวีคูณ

การใช้ root account ควรใช้เพื่อแก้ไขปัญหาในการเข้าถึงหรือจำเป็นต้องใช้ในกรณีเฉพาะเช่น สิทธิ์ในการเข้าถึงถูกจำกัดและจำเป็นต้องปลดการจำกัดสิทธิ์ด้วย root account เป็นต้น

หากมีการจำกัดการเข้าถึงผ่าน IAM User/Role เรียบร้อยแล้ว (โดยทั่วไปสิทธิ์ AmazonEC2FullAccess เพียงพอกับการสร้าง cluster แต่ในการใช้งานควรใช้สิทธิื์ที่จำกัดกว่านั้นสำหรับ Worker node เช่น AmazonEKSWorkerNodePolicy หรือ AmazonEKSWorkerNodeMinimalPolicy)

โดยสรุป อย่างน้อยเราต้องการ User/Role สำหรับสร้าง Cluster และอีก Role สำหรับ worker node (EC2 Instance Profile) ในการเข้าถึง AWS Services ที่จำเป็นสำหรับการทำงานของ Worker node

Terraform/OpenTofu

บทความจะอ้างอิงจาก Terraform เป็นหลักแต่ตามหลักการ OpenTofu ก็ควรจะใช้งานฟังก์ชั่นที่จำเป็นสำหรับการสร้างคลัสเตอร์ได้เช่นกัน

หากยังไม่ได้ทำการลง Terraform สามารถดูวิธีการลงได้จากลิ้งค์นี้ https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli

Terraform code สำหรับโปรเจคนี้สามารถ clone ได้จาก: https://github.com/guxkung/eks-terraform.git

อ้างอิงและดัดแปลงจาก AWS IA project และ terraform modules:

Project structure

  • provider.tf
  • sg.tf
  • eks.tf
  • vpc.tf
  • variables.tf
  • config/input.tfvars

Terraform variables.tf

  • แก้ไขไฟล์ conf/variables.tf โดยเปลี่ยน account-id, vpc-id, vpc-cidr, subnet-cidr ให้เข้ากับ aws account

Public/Private access

ในไฟล์ eks.tf จะสังเกตได้ว่ามีการกำหนดให้ cluster_endpoint_xxx เป็น public_access หรือ private_access ได้

cluster_endpoint_public_access  = true
cluster_endpoint_private_access = false
Enter fullscreen mode Exit fullscreen mode

เพื่อให้เข้าใจการทำงานได้อย่างถูกต้อง เราจะลองทั้งสองแบบโดยที่ค่าเริ่มต้นจะเป็น public_access ด้วย IP Address ของคุณ (หรือใช้ ["0.0.0.0/0"] เพื่อให้เข้าถึงจากที่ไหนก็ได้)

ในโค้ดตัวอย่างมีการแยก branch ไว้ต่างหากแล้ว (public-access/main) โดยให้ใช้ public-access branch สำหรับการทำ public-access และ main สำหรับ private access

git clone https://github.com/guxkung/eks-terraform.git
cd eks-terraform
git checkout public-access
Enter fullscreen mode Exit fullscreen mode

Terraform (public) init, plan, apply

Image description

terraform init
terraform plan -var-file=conf/input.tfvars -out eks-public.plan
terraform apply eks-public.plan
Enter fullscreen mode Exit fullscreen mode

Terraform (private) init, plan, apply

Image description

ในตัวอย่างถัดไป เราจะเปลี่ยนไปใช้ private access หลังการสร้างสำเร็จแล้ว คุณสามารถใช้ ec2 เป็นหน้าด่านให้กับการเชื่อมต่อเข้ากับ คลัสเตอร์ได้ เราจะใช้ t2.micro ในการเชื่อมต่อดังกล่าว โดยที่การเข้าถึงจาก Internet จะไม่สามารถเข้าถึงได้อีกต่อไป

git checkout main
terraform init
terraform plan -var-file=conf/input.tfvars -out eks-private.plan
terraform apply eks-private.plan
Enter fullscreen mode Exit fullscreen mode

nslookup, dig, curl, kubectl

Destroy stuffs (EKS cluster cost money)

terraform destroy

Closure

Helm-chart, GitOps เป็นของที่แนะนำควบคู่กับการทำ Kubernetes โดยที่อาจจะใช้ tools ช่วยอย่างเช่น Chart Musuem, ArgoCD, Flux, Kubefirst เป็นต้น

หากต้องสร้างเป็นหลาย environment ควรใช้ terragrunt, terraspace เพื่อให้การบริหารจัดการเป็นไปได้อย่างเป็นระบบมากขึ้น

ขอแนะนำให้ใช้ IRSA (IAM Role for Service Account) กับ EKS Pod Identity แทนการใช้ EC2 Instance Profile ในการเข้าถึง บริการต่างๆจากทาง AWS ด้วยเหตุผลด้านความปลอดภัย (แทนที่จะเพิ่มสิทธิ์การเข้าถึงไปบน worker node โดยตรงเราสามารถสร้าง IAM Role ที่สามารถเข้าถึงได้ด้วย OIDC/EKS Pod Identity และให้สิทธิ์ดังกล่าวกับ Service Account บน Kubernetes)

Update จาก re:Invent 2024, EKS มี Auto mode ซึ่งจะทำการคำนวณและปรับ Node โดยอัตโนมัติ แทนการใช้ nodepools/nodegroups/Fargate รวมไปถึง Add-ons ซึ่งหากมีผลที่น่าสนใจจะนำมาเล่าสู่กันฟังในลำดับถัดไปครับ

Top comments (0)