บทความที่แล้ว เราได้พูดถึงการสร้างคลัสเตอร์จาก 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:
- https://github.com/aws-ia
- https://registry.terraform.io/modules/terraform-aws-modules/eks/aws/latest
- https://registry.terraform.io/modules/terraform-aws-modules/vpc/aws/latest
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
เพื่อให้เข้าใจการทำงานได้อย่างถูกต้อง เราจะลองทั้งสองแบบโดยที่ค่าเริ่มต้นจะเป็น 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
Terraform (public) init, plan, apply
terraform init
terraform plan -var-file=conf/input.tfvars -out eks-public.plan
terraform apply eks-public.plan
Terraform (private) init, plan, apply
ในตัวอย่างถัดไป เราจะเปลี่ยนไปใช้ 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
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)