Cung cấp các cụm Kubernetes trên AWS với Terraform và EKS

1623
10-09-2021
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.

SHARE