Hướng Dẫn Triển Khai Cụm Amazon EKS Trên Nền Tảng AWS Bằng Terraform

Hướng dẫn chi tiết từng bước cách triển khai cụm Kubernetes (EKS) trên nền tảng AWS bằng công cụ Infrastructure as Code (IaC) Terraform. Bài viết phù hợp cho kỹ sư DevOps và Cloud.

Hướng Dẫn Triển Khai Cụm Amazon EKS Trên Nền Tảng AWS Bằng Terraform

Amazon Elastic Kubernetes Service (EKS) là một dịch vụ Kubernetes được quản lý hoàn toàn bởi AWS, giúp bạn dễ dàng chạy và mở rộng các ứng dụng container. Việc kết hợp EKS với Terraform (một công cụ Infrastructure as Code phổ biến) sẽ giúp tự động hóa toàn bộ quá trình xây dựng hạ tầng một cách an toàn, nhất quán và dễ dàng sao chép.

Bài viết này sẽ hướng dẫn bạn chi tiết từng bước cách triển khai một cụm Amazon EKS trên nền tảng AWS bằng cách sử dụng công cụ Terraform, cùng với các best practice dành cho môi trường Production.

1. Kiến trúc tổng thể của hệ thống

Trước khi bắt tay vào triển khai, chúng ta cần hình dung các thành phần hạ tầng sẽ được tạo ra bởi Terraform:

Terraform

   ├── VPC (Virtual Private Cloud)
   │    ├── Public Subnets (Dành cho Load Balancer, NAT)
   │    ├── Private Subnets (Dành cho Worker Nodes, bảo mật cao)
   │    └── NAT Gateway (Cho phép Node truy cập Internet)

   ├── EKS Cluster (Control Plane được AWS quản lý)

   ├── Managed Node Group (Các EC2 Worker Nodes chạy container)

   └── IAM Roles & Security Groups (Quản lý quyền truy cập và bảo mật mạng)

Luồng hoạt động sau khi triển khai thành công:

Quản trị viên (kubectl) --> EKS API Server --> Worker Nodes (EC2) --> Pods (Ứng dụng)

2. Kiến thức cần trang bị trước

Để làm theo hướng dẫn này một cách suôn sẻ, bạn nên có kiến thức cơ bản về:

Thành phầnÝ nghĩa và Vai trò
TerraformCông cụ Infrastructure as Code (IaC) dùng để định nghĩa và tạo hạ tầng.
Amazon EKSDịch vụ Kubernetes (K8s) do AWS quản lý (Managed Kubernetes).
AWS VPCMạng riêng ảo, nơi chứa các tài nguyên như EC2, EKS.
Node GroupNhóm các máy chủ ảo (EC2 instances) làm nhiệm vụ chạy các Container (Pods).
kubectlCông cụ dòng lệnh (CLI) để giao tiếp và quản lý cụm Kubernetes.
AWS IAMDịch vụ quản lý định danh và phân quyền truy cập trên AWS.

3. Chuẩn bị môi trường cài đặt

Bạn cần cài đặt một số công cụ dòng lệnh thiết yếu để tương tác với AWS và Terraform.

Cài đặt AWS CLI

Trên hệ điều hành MacOS:

brew install awscli

Trên hệ điều hành Ubuntu/Debian:

sudo apt update
sudo apt install awscli -y

Kiểm tra phiên bản sau khi cài đặt:

aws --version

Cấu hình AWS Credentials

Tiếp theo, bạn cần cấu hình thông tin xác thực để AWS CLI có quyền gọi API:

aws configure

Hệ thống sẽ yêu cầu bạn nhập các thông tin sau:

AWS Access Key ID [None]: <Nhập_Access_Key_Của_Bạn>
AWS Secret Access Key [None]: <Nhập_Secret_Key_Của_Bạn>
Default region name [None]: ap-southeast-1  (Ví dụ: Singapore)
Default output format [None]: json

Kiểm tra lại xem cấu hình đã kết nối thành công chưa:

aws sts get-caller-identity

Cài đặt Terraform

Trên hệ điều hành MacOS:

brew tap hashicorp/tap
brew install hashicorp/tap/terraform

Trên hệ điều hành Ubuntu/Debian:

sudo apt-get update && sudo apt-get install -y gnupg software-properties-common
wget -O- https://apt.releases.hashicorp.com/gpg | \
gpg --dearmor | \
sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg > /dev/null
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] \
https://apt.releases.hashicorp.com $(lsb_release -cs) main" | \
sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update
sudo apt-get install terraform -y

Kiểm tra phiên bản:

terraform version

Cài đặt kubectl

Trên hệ điều hành MacOS:

brew install kubectl

Trên hệ điều hành Ubuntu/Debian:

sudo snap install kubectl --classic

Kiểm tra phiên bản:

kubectl version --client

4. Bắt đầu triển khai (Clone Project)

Để tiết kiệm thời gian, chúng ta sẽ sử dụng một project Terraform mẫu đã được định nghĩa sẵn các cấu hình chuẩn.

Mở terminal và chạy lệnh sau:

git clone https://github.com/NotHarshhaa/AWS-EKS_Terraform.git
cd AWS-EKS_Terraform

(Lưu ý: Repository này sử dụng module EKS rất phổ biến từ cộng đồng: terraform-aws-modules/eks/aws).

Cấu trúc thư mục của Project

Một dự án Terraform chuẩn quản lý EKS thường bao gồm các file sau:

Tên FileMục đích
provider.tfKhai báo Provider (AWS) và cấu hình Region.
vpc.tfĐịnh nghĩa hệ thống mạng (VPC, Subnet, NAT Gateway, Route Table).
eks.tfĐịnh nghĩa cụm EKS, phiên bản K8s và cấu hình Managed Node Group.
variables.tfKhai báo các biến số (Tên cluster, loại instance, v.v.).
outputs.tfXuất các giá trị quan trọng sau khi triển khai (EKS Endpoint, Kubeconfig, …).
terraform.tfvarsNơi truyền giá trị thực tế cho các biến.

5. Các bước thực thi Terraform

Bước 1: Khởi tạo thư mục làm việc (Init)

terraform init

Lệnh này sẽ tải về các AWS Provider, EKS Module cần thiết và tạo thư mục ẩn .terraform/.

Bước 2: Xem trước kế hoạch thay đổi (Plan)

terraform plan

Terraform sẽ liệt kê chi tiết những tài nguyên sắp được tạo trên AWS (VPC, Subnets, EKS Cluster, IAM Roles, Security Groups, EC2…). Hãy đọc kỹ kết quả này.

Bước 3: Áp dụng triển khai hạ tầng (Apply)

terraform apply

yes khi được yêu cầu xác nhận. Quá trình này sẽ mất khoảng 15 đến 30 phút vì AWS cần thời gian cấu hình Control Plane và khởi tạo các EC2 Node Group.

6. Kết nối kubectl vào EKS Cluster

Sau khi Terraform chạy thành công, bạn cần lấy thông tin kubeconfig để kubectl có quyền giao tiếp với cụm EKS vừa tạo.

Chạy lệnh sau (thay thế <cluster-name> bằng tên cluster thực tế của bạn, mặc định trong repo có thể là demo-eks):

aws eks update-kubeconfig \
  --region ap-southeast-1 \
  --name <cluster-name>

7. Kiểm tra trạng thái Cluster

Kiểm tra các Worker Nodes đã sẵn sàng hay chưa:

kubectl get nodes

Kết quả mong đợi:

NAME                                            STATUS   ROLES    AGE   VERSION
ip-10-0-1-15.ap-southeast-1.compute.internal    Ready    <none>   5m    v1.27.x

Kiểm tra các Pods hệ thống đang chạy:

kubectl get pods -A

8. Triển khai thử nghiệm một ứng dụng (Nginx)

Để đảm bảo cluster hoạt động hoàn hảo, hãy thử chạy một web server Nginx:

1. Tạo Deployment:

kubectl create deployment nginx --image=nginx

2. Expose dịch vụ ra ngoài Internet qua Load Balancer:

kubectl expose deployment nginx --port=80 --type=LoadBalancer

3. Lấy địa chỉ truy cập:

kubectl get svc

Cột EXTERNAL-IP sẽ cung cấp cho bạn một đường dẫn (URL) do AWS ELB (Elastic Load Balancer) tự động sinh ra. Mở URL này trên trình duyệt để thấy trang Web mặc định của Nginx!

9. Giải thích một số cấu hình Terraform EKS quan trọng

Định nghĩa Provider

File provider.tf xác định chúng ta sẽ tương tác với AWS ở Region nào:

provider "aws" {
  region = "ap-southeast-1"
}

Sử dụng EKS Module cộng đồng

Thay vì tự viết hàng trăm dòng code phức tạp, chúng ta dùng module chuẩn của Terraform Registry:

module "eks" {
  source  = "terraform-aws-modules/eks/aws"
  version = "~> 19.0"
  
  cluster_name    = var.cluster_name
  cluster_version = "1.27"
  # ...
}

Managed Node Group

Cấu hình nhóm máy chủ chạy ứng dụng:

eks_managed_node_groups = {
  default = {
    min_size       = 1
    max_size       = 3
    desired_size   = 2
    instance_types = ["t3.medium"]
  }
}

10. Cách xử lý các lỗi thường gặp (Troubleshooting)

Lỗi Kubernetes cluster unreachable khi dùng kubectl

  • Nguyên nhân: Lỗi khá phổ biến do kubeconfig chưa được cập nhật hoặc token IAM hết hạn.
  • Cách khắc phục: Cập nhật lại file kubeconfig bằng lệnh:
    aws eks update-kubeconfig --region <region> --name <cluster-name>

Các Node không thể gia nhập (Join) vào Cluster

Nếu gõ kubectl get nodes mà không hiện kết quả nào (Empty):

  • Nguyên nhân chính: Thường do lỗi ở hạ tầng mạng (VPC). Worker Nodes cần có Internet để gọi lên EKS API Server thông qua NAT Gateway. Nếu bạn custom VPC bị sai Route Table, hoặc gán sai Security Group, Node sẽ không thể connect. Đồng thời, kiểm tra lại IAM Role của Node đã cấp đủ quyền chưa.

Quá trình terraform apply bị treo quá lâu

Việc tạo EKS Control Plane mất trung bình 10-15 phút. Tuy nhiên nếu kẹt ở bước tạo Node Group quá 20 phút, hãy vào giao diện AWS Console -> EC2 -> Auto Scaling Group để kiểm tra xem máy ảo có đang bị lỗi khởi động (Bootstrap error) hay không.

11. Tối ưu chi phí khi Lab EKS

Học EKS trên AWS khá tốn kém, dưới đây là cách để bạn tiết kiệm chi phí:

  1. NAT Gateway rất đắt: Mặc định AWS tính tiền NAT Gateway theo giờ, cấu hình Multi-AZ NAT Gateway sẽ tốn gấp bội. Khi làm lab, bạn chỉ cần tạo 1 NAT Gateway cho một Public Subnet duy nhất, hoặc tạo EKS với Node ở Public Subnet hoàn toàn (tuy không bảo mật nhưng tiết kiệm).
  2. Chọn loại EC2 Instance nhỏ: Đối với nhu cầu học tập, thay đổi cấu hình Node Group về các instance nhỏ để giảm tiền:
    instance_types = ["t3.small"] # Hoặc "t3.micro"
  3. Luôn dọn dẹp khi học xong: (Xem phần Dọn dẹp phía dưới).

12. Best Practices cho môi trường Production

Nếu bạn dự định đưa EKS vào sử dụng thực tế cho công ty, cấu hình mặc định là chưa đủ. Hãy tích hợp thêm các công nghệ sau:

Công cụ / Tính năngMô tả vai trò trong EKS
IRSA (IAM Roles for Service Accounts)Bắt buộc để cấp quyền AWS linh hoạt, bảo mật ở cấp độ từng Pod thay vì cấp quyền cho cả Node.
KarpenterCông cụ Auto-scaling thế hệ mới của AWS, thay thế Cluster Autoscaler với tốc độ scale cực nhanh.
ArgoCDTriển khai mô hình GitOps để quản lý ứng dụng, thay vì gõ kubectl apply thủ công.
External SecretsQuản lý bảo mật các thông tin nhạy cảm (Passwords, Tokens) thông qua tích hợp với AWS Secrets Manager.
Prometheus & GrafanaGiám sát (Monitoring) sức khỏe của hệ thống và cảnh báo.
VeleroCông cụ sao lưu (Backup) và phục hồi thảm họa cho Cluster K8s.
Private Endpoint APITắt tính năng truy cập API Control Plane từ Internet công cộng để tăng cường bảo mật.

13. Gợi ý lộ trình học tiếp theo (Roadmap)

Khi đã nắm rõ cách dựng EKS bằng Terraform, bạn nên nâng cấp kỹ năng với các chủ đề:

  1. Đóng gói ứng dụng bằng Helm Charts.
  2. Thiết lập Ingress NGINXAWS Load Balancer Controller để định tuyến traffic thông minh.
  3. Sử dụng ArgoCD để đồng bộ hóa mã nguồn tự động (GitOps).
  4. Thiết lập giám sát với hệ sinh thái kube-prometheus-stack.
  5. Triển khai Terraform với cấu trúc Multi-environment (Dev, Staging, Prod) thông qua Terraform Workspaces hoặc Terragrunt.

14. Dọn dẹp tài nguyên (Rất Quan Trọng!)

Nếu bạn chỉ làm Lab, bắt buộc phải xóa các tài nguyên để không bị trừ tiền oan uổng. Các thành phần như NAT Gateway, Elastic Load Balancer (ELB), EBS Volumes, và phí Control Plane của EKS sẽ tiếp tục bị tính phí nếu không được xóa.

Chạy lệnh sau và xác nhận yes:

terraform destroy

(Nếu bạn đã tạo Load Balancer từ kubectl expose ở Bước 8, hãy xóa nó bằng lệnh kubectl delete svc nginx trước khi chạy terraform destroy, để tránh tình trạng Terraform không xóa được Security Group do bị kẹt trong VPC).

Chúc các bạn triển khai thành công!

Tài liệu tham khảo thêm:

Bình luận

Bài viết liên quan