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.
Mục lục
- 1. Kiến trúc tổng thể của hệ thống
- 2. Kiến thức cần trang bị trước
- 3. Chuẩn bị môi trường cài đặt
- 4. Bắt đầu triển khai (Clone Project)
- 5. Các bước thực thi Terraform
- 6. Kết nối kubectl vào EKS Cluster
- 7. Kiểm tra trạng thái Cluster
- 8. Triển khai thử nghiệm một ứng dụng (Nginx)
- 9. Giải thích một số cấu hình Terraform EKS quan trọng
- 10. Cách xử lý các lỗi thường gặp (Troubleshooting)
- 11. Tối ưu chi phí khi Lab EKS
- 12. Best Practices cho môi trường Production
- 13. Gợi ý lộ trình học tiếp theo (Roadmap)
- 14. Dọn dẹp tài nguyên (Rất Quan Trọng!)
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ò |
|---|---|
| Terraform | Công cụ Infrastructure as Code (IaC) dùng để định nghĩa và tạo hạ tầng. |
| Amazon EKS | Dịch vụ Kubernetes (K8s) do AWS quản lý (Managed Kubernetes). |
| AWS VPC | Mạng riêng ảo, nơi chứa các tài nguyên như EC2, EKS. |
| Node Group | Nhóm các máy chủ ảo (EC2 instances) làm nhiệm vụ chạy các Container (Pods). |
| kubectl | Công cụ dòng lệnh (CLI) để giao tiếp và quản lý cụm Kubernetes. |
| AWS IAM | Dị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 File | Mục đích |
|---|---|
provider.tf | Khai 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.tf | Khai báo các biến số (Tên cluster, loại instance, v.v.). |
outputs.tf | Xuất các giá trị quan trọng sau khi triển khai (EKS Endpoint, Kubeconfig, …). |
terraform.tfvars | Nơ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
Gõ 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
kubeconfigchư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í:
- 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).
- 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" - 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ăng | Mô 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. |
| Karpenter | Công cụ Auto-scaling thế hệ mới của AWS, thay thế Cluster Autoscaler với tốc độ scale cực nhanh. |
| ArgoCD | Triển khai mô hình GitOps để quản lý ứng dụng, thay vì gõ kubectl apply thủ công. |
| External Secrets | Quả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 & Grafana | Giám sát (Monitoring) sức khỏe của hệ thống và cảnh báo. |
| Velero | Công cụ sao lưu (Backup) và phục hồi thảm họa cho Cluster K8s. |
| Private Endpoint API | Tắ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ủ đề:
- Đóng gói ứng dụng bằng Helm Charts.
- Thiết lập Ingress NGINX và AWS Load Balancer Controller để định tuyến traffic thông minh.
- Sử dụng ArgoCD để đồng bộ hóa mã nguồn tự động (GitOps).
- Thiết lập giám sát với hệ sinh thái kube-prometheus-stack.
- 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
Tại sao Điện toán đám mây (Cloud Computing) là tương lai của mọi doanh nghiệp?
Điện toán đám mây mang lại lợi ích gì cho tổ chức? Bài viết phân tích sức mạnh của Cloud Computing (AWS, GCP, Azure).
Hướng Dẫn Cài Đặt GitLab Runner Với Docker Cho Người Mới
Hướng dẫn từng bước cách cài đặt và cấu hình GitLab Runner bằng Docker trên máy chủ (EC2/VPS). Giải pháp hoàn hảo giúp tự động hóa quy trình CI/CD dễ hiểu cho cả người không chuyên kỹ thuật.
Ansible là gì? Hướng dẫn tự động hóa hạ tầng cho người mới
Tìm hiểu chi tiết Ansible là gì, nguyên lý hoạt động bằng kiến trúc Agentless, và tại sao nó là công cụ Configuration Management hàng đầu.