Cung cấp các cụm Kubernetes trên AWS với Terraform và EKS
Bạn muốn triển khai một cụm Kubernetes trên AWS với Terraform và EKS? Hãy theo dõi bài viết này của Bizfly Cloud để biết được cách tạo các cụm trên Dịch vụ AWS Elastic Kubernetes (EKS) với eksctl và Terraform chỉ bằng một cú nhấp chuột.
Ba tùy chọn phổ biến để cung cấp một cụm EKS
Có ba tùy chọn phổ biến để chạy và triển khai một cụm EKS:
- Bạn có thể tạo cụm từ giao diện web AWS.
- Bạn có thể sử dụng tiện ích dòng lệnh eksctl
- Bạn có thể xác định cụm bằng cách sử dụng mã với một công cụ như Terraform.
Có rất nhiều tùy chọn cấu hình và màn hình mà bạn phải hoàn thành trước khi có thể sử dụng cụm.
Ngoài ra, khi bạn tạo cụm theo cách thủ công, bạn cần chắc chắn rằng:
- Không quên thay đổi một trong số các thông số
- Có thể lặp lại chính xác các bước tương tự khi tạo một cụm cho các môi trường khác
- Khi có những thay đổi bạn có thể sửa đổi theo trình tự cho tất cả các cụm mà không để xảy ra sai sót
Thực chất rằng có một tuỳ chọn tốt hơn đó là bạn cần xác định một tệp có chứa tất cả các cấu hình và sử dụng tệp đó để thiết kế các cụm.
Thiết lập tài khoản AWS
Để có thể sử dụng eksctl và Terraform, bạn phải cài đặt AWS CLI. Đây là công cụ cần thiết để xác thực các yêu cầu của bạn đối với tài khoản trên Amazon Web Services.
Sau khi cài đặt AWS CLI, bạn nên chạy:
aws --version
aws-cli/2.0.40 Python/3.8.5 Darwin/19.6.0 source/x86_64
Nếu bạn có thể thấy phiên bản trong đầu ra, điều đó có nghĩa là quá trình cài đặt đã thành công.
Tiếp theo, bạn cần liên kết tài khoản của mình với AWS CLI.
Đối với phần này, bạn sẽ cần:
- ID khóa truy cập AWS.
- Khóa truy cập bí mật AWS.
- Tên vùng mặc định.
- Định dạng đầu ra mặc định.
Hai phần thiết yếu bạn cần có là hai phần đầu tiên: ID khóa truy cập và Khóa truy cập bí mật .
Các thông tin xác thực đó chỉ được hiển thị một lần sau khi bạn tạo người dùng trên giao diện web AWS.
Cách cung cấp một cụm EKS
Eksctl là một công cụ dòng lệnh thuận tiện để tạo một cụm EKS với một vài lệnh đơn giản.
Các AWS CLI có một lệnh để tạo ra một cụm EKS: aws eks create-cluster.
Tuy nhiên, lệnh chỉ tạo một mặt phẳng điều khiển.
Nó không tạo bất kỳ nút công nhân nào, thiết lập xác thực, quyền, v.v.
Mặt khác, eksctl là một aws ekssteroid.
Với một lệnh duy nhất giờ đây bạn đã có một cụm hoạt động đầy đủ.
Ngoài ra, bạn cũng có thể xác minh rằng eksctl được cài đặt đúng cách bằng:
eksctl version
0.25.0
Eksctl sử dụng thông tin đăng nhập từ AWS CLI để kết nối với tài khoản của bạn.
Vì vậy, bạn có thể tạo một cụm với:
eksctl cluster create
Lệnh đưa ra một số giả định về cụm mà bạn muốn:
- Tạo ra một mặt phẳng điều khiển (do AWS quản lý).
- Tham gia hai nút công nhân.
- Chọn m5.large như một kiểu thể hiện.
- Tạo ra cụm trong us-west-2 vùng.
Nếu như lúc này cụm không đúng với những gì bạn mong muốn, hãy tùy chỉnh cài đặt để phù hợp với nhu cầu sử dụng của mình.
Cung cấp một cụm EKS với Terraform
Terraform là một công cụ cơ sở hạ tầng dưới dạng mã nguồn mở. Nhưng thay vì viết mã để tạo cơ sở hạ tầng, bạn cần xác định trước những gì mình muốn thực thi và Terraform sẽ giúp bạn tạo các tài nguyên tiếp theo.
Terraform sẽ không được viết bằng YAML mà thay vào đó sẽ sử dụng một ngôn ngữ khác gọi là HCL - HashiCorp Configuration Language.
Nói cách khác, nghĩa là bạn sử dụng HCL để khai báo cơ sở hạ tầng bạn muốn được triển khai và Terraform sẽ tiến hành thực thi các hướng dẫn.
Terraform sử dụng các plugin được gọi là nhà cung cấp để giao tiếp với các tài nguyên trong nhà cung cấp đám mây. Điều này mở rộng hơn nữa với các mô-đun như một nhóm tài nguyên và là các khối xây dựng mà bạn sẽ sử dụng để tạo một cụm.
Trước khi bạn có thể tạo một cụm với Terraform, bạn nên cài đặt tệp nhị phân.
Xác minh rằng công cụ Terraform đã được cài đặt đúng cách với:
terraform version
Terraform v0.13.5
Bây giờ hãy bắt đầu bằng cách tạo một thư mục mới và trong thư mục đó tạo một tệp có tên main.tf.
Phần .tf mở rộng dành cho các tệp Terraform.
Trong main.tf bản sao và dán mã sau:
main.tf
provider "aws" {
region = "ap-south-1"
}
data "aws_eks_cluster" "cluster" {
name = module.eks.cluster_id
}
data "aws_eks_cluster_auth" "cluster" {
name = module.eks.cluster_id
}
provider "kubernetes" {
host = data.aws_eks_cluster.cluster.endpoint
cluster_ca_certificate = base64decode(data.aws_eks_cluster.cluster.certificate_authority.0.data)
token = data.aws_eks_cluster_auth.cluster.token
load_config_file = false
version = "~> 1.11"
}
data "aws_availability_zones" "available" {
}
locals {
cluster_name = "my-cluster"
}
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "2.47.0"
name = "k8s-vpc"
cidr = "172.16.0.0/16"
azs = data.aws_availability_zones.available.names
private_subnets = ["172.16.1.0/24", "172.16.2.0/24", "172.16.3.0/24"]
public_subnets = ["172.16.4.0/24", "172.16.5.0/24", "172.16.6.0/24"]
enable_nat_gateway = true
single_nat_gateway = true
enable_dns_hostnames = true
public_subnet_tags = {
"kubernetes.io/cluster/${local.cluster_name}" = "shared"
"kubernetes.io/role/elb" = "1"
}
private_subnet_tags = {
"kubernetes.io/cluster/${local.cluster_name}" = "shared"
"kubernetes.io/role/internal-elb" = "1"
}
}
module "eks" {
source = "terraform-aws-modules/eks/aws"
version = "12.2.0"
cluster_name = "${local.cluster_name}"
cluster_version = "1.17"
subnets = module.vpc.private_subnets
vpc_id = module.vpc.vpc_id
node_groups = {
first = {
desired_capacity = 1
max_capacity = 10
min_capacity = 1
instance_type = "m5.large"
}
}
write_kubeconfig = true
config_output_path = "./"
Trong cùng một thư mục, hãy chạy:
terraform init
Lệnh sẽ khởi tạo Terraform và tạo thêm hai thư mục cũng như một tệp trạng thái.
Tệp trạng thái được sử dụng để theo dõi các tài nguyên đã được tạo.
Để nhanh chóng kiểm tra xem cấu hình không có bất kỳ lỗi cấu hình nào, bạn có thể thực hiện lệnh:
terraform validate
Success! The configuration is valid.
Tiếp theo, bạn nên chạy:
terraform plan
[output truncated]
Plan: 42 to add, 0 to change, 0 to destroy.
Terraform sẽ thực hiện quá trình chạy và sẽ nhắc bạn một bản tóm tắt chi tiết về những tài nguyên sắp tạo.
Tiếp theo bạn hãy tạo tài nguyên bằng cách:
terraform apply
Apply complete! Resources: 42 added, 0 changed, 0 destroyed.
Bạn sẽ được yêu cầu xác nhận lựa chọn của mình - chỉ cần nhập Có.
Quá trình này mất khoảng 20 phút để cung cấp tất cả các tài nguyên, cũng bằng thời gian eksctl tạo ra cụm.
Khi hoàn tất, nếu bạn kiểm tra thư mục hiện tại, bạn sẽ thấy một vài tệp mới:
tree .
.
├── kubeconfig_my-cluster
├── main.tf
├── terraform.tfstate
└── terraform.tfstate.backup
terraform.tfstatevà terraform.tfstate.backup là hai tệp được Terraform sử dụng để theo dõi những tài nguyên nào đã được tạo.
Đây kubeconfig_my-cluster là kubeconfig cho cụm mới được tạo.
Bạn có thể kiểm tra kết nối với cụm bằng cách sử dụng tệp đó với:
KUBECONFIG=./kubeconfig_my-cluster kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS AGE
kube-system aws-node-kbncq 1/1 Running 10m
kube-system coredns-56666f95ff-l5ppm 1/1 Running 23m
kube-system coredns-56666f95ff-w9brq 1/1 Running 23m
kube-system kube-proxy-98vcw 1/1 Running 10m
Lúc này cụm đã sẵn sàng để sử dụng.
Tệp Terraform vừa thực thi được chia thành hai khối
Khối đầu tiên là mô-đun VPC
main.tf
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "2.47.0"
name = "k8s-vpc"
cidr = "172.16.0.0/16"
private_subnets = ["172.16.1.0/24", "172.16.2.0/24", "172.16.3.0/24"]
public_subnets = ["172.16.4.0/24", "172.16.5.0/24", "172.16.6.0/24"]
# truncated
}
module "eks" {
source = "terraform-aws-modules/eks/aws"
version = "12.2.0"
cluster_name = "${local.cluster_name}"
cluster_version = "1.17"
subnets = module.vpc.private_subnets
vpc_id = module.vpc.vpc_id
# truncated
}
Trong phần này, Terraform tạo:
- Một VPC.
- Ba mạng con riêng tư và ba mạng con chung.
- Một cổng NAT duy nhất.
- Thẻ cho các mạng con.
Khối thứ hai trong tệp Terraform là mô-đun cụm EKS:
main.tf
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "2.47.0"
name = "k8s-vpc"
cidr = "172.16.0.0/16"
private_subnets = ["172.16.1.0/24", "172.16.2.0/24", "172.16.3.0/24"]
public_subnets = ["172.16.4.0/24", "172.16.5.0/24", "172.16.6.0/24"]
# truncated
}
module "eks" {
source = "terraform-aws-modules/eks/aws"
version = "12.2.0"
cluster_name = "${local.cluster_name}"
cluster_version = "1.17"
subnets = module.vpc.private_subnets
vpc_id = module.vpc.vpc_id
# truncated
}
Mô-đun EKS phụ trách:
- Tạo mặt phẳng điều khiển.
- Thiết lập nhóm tính năng tự động.
- Thiết lập các nhóm bảo mật thích hợp.
- Tạo tệp kubeconfig.
- ….
Có một lưu ý rằng các nút \ cho cụm Kubernetes của bạn nên được triển khai trong các mạng con riêng tư.
Bạn có thể xác định hai ràng buộc đó bằng:
main.tf
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "2.47.0"
# truncated
}
module "eks" {
source = "terraform-aws-modules/eks/aws"
version = "12.2.0"
cluster_name = "${local.cluster_name}"
cluster_version = "1.17"
subnets = module.vpc.private_subnets
vpc_id = module.vpc.vpc_id
# truncated
}
Phần cuối cùng của tệp Terraform:
main.tf
data "aws_eks_cluster" "cluster" {
name = module.eks.cluster_id
}
data "aws_eks_cluster_auth" "cluster" {
name = module.eks.cluster_id
}
provider "kubernetes" {
host = data.aws_eks_cluster.cluster.endpoint
cluster_ca_certificate = base64decode(data.aws_eks_cluster.cluster.certificate_authority.0.data)
token = data.aws_eks_cluster_auth.cluster.token
load_config_file = false
version = "~> 1.11"
}
Và trên đây là cách cung cấp một cụm EKS với Terraform. Hãy theo dõi tiếp những bài viết của Bizfly Cloud để biết thêm nhiều kiến thức thú vị được cập nhật trong thời gian tới.
>> Có thể bạn quan tâm: Kubernetes Cluster là gì? Cách tạo Kubernetes Cluster