利用 Terraform EKS 模組創建 EKS 集群

如果您需要使用AWS彈性Kubernetes服務(Amazon EKS)Terraform建立集群,那就太好了。使用Terraform EKS模組和其他所需資源,您可以創建一個Terraform配置並通過代碼創建一個EKS集群。

Amazon EKS是一個管理服務,可在AWS上運行Kubernetes,而無需安裝、操作和維護自己的Kubernetes集群。使用Terraform構建EKS集群可以快速、高效且自動化地創建資源。

在本教程中,您將逐步學習如何使用Terraform配置構建EKS集群。讓我們開始吧!

先決條件

這篇文章將是一個逐步教程。如果您想跟著進行,請確保您已經做好了以下準備:

  • 一個Amazon Web Services(AWS)帳戶
  • A code editor – Even though you can use any text editor to work with Terraform configuration files, you should consider Visual Studio (VS) Code as it understands the HCL Terraform language well.
  • Terraform – 本教程將使用在Ubuntu 18.04.5 LTS上運行的Terraform v0.14.9,但適用任何具有Terraform的操作系統。

構建AWS EKS集群的Terraform配置

Terraform是一個基礎架構即代碼工具,可安全且高效地構建、更改和版本化基礎架構。Terraform使用不同類型的配置文件,每個文件都是以純文本格式(.tf)JSON格式(.tfjson)編寫的。

讓我們首先創建一個Terraform配置,當應用時將從頭開始創建一個AKS集群。

1. 開啟終端機。

2. 創建一個名為〜/terraform-eks-cluster-demo的文件夾,然後更改(cd)工作目錄為該文件夾。此文件夾將包含您將使用的所有配置文件。

mkdir ~/terraform-eks-cluster-demo
cd ~/terraform-eks-cluster-demo

3. 接下來,打開您喜歡的代碼編輯器,複製/粘貼以下配置,並將其保存在main.tf文件中,位於〜/terraform-eks-cluster-demo內。這個main.tf文件是AKS集群的Terraform配置。

main.tf文件包含構建EKS集群所需的所有資源:

  • 一個 AWS 身份與存取管理 (IAM) 角色(terraformekscluster)- 此資源將由 Amazon EKS 管理,並代表您向其他 AWS 服務(如 AWS S3、CloudWatch 等)發出呼叫,以管理您使用該服務的資源。
  • 一個 AWS EC2 安全群組resource "aws_security_group" "eks-cluster")- 允許來自 AWS EKS 集群的入站和出站網路流量。您將啟動一個名為 SG-eks-cluster 的安全群組,附加到一個 VPC ID,允許所有流量從集群中進出。0.0.0.0/0 是網際網路的 IP 地址。
  • EKS 集群terraformEKScluster)- 此 EKS 集群將是 版本 1.19
  • 一個用於 EKS 節點向其他 AWS 服務發出呼叫的 IAM 角色(eks-node-group)。此角色附帶一個策略,允許在實例上假設臨時安全憑證以訪問其他 AWS 資源。
  • EKS 集群節點群組node_group1)- 此資源通過 scaling_config 屬性定義集群將擁有的節點數量。
# 建立 IAM 角色,使 Kubernetes 集群代表您對其他 AWS 服務進行調用,以管理您在該服務中使用的資源。

resource "aws_iam_role" "iam-role-eks-cluster" {
  name = "terraformekscluster"
  assume_role_policy = <<POLICY
{
 "Version": "2012-10-17",
 "Statement": [
   {
   "Effect": "Allow",
   "Principal": {
    "Service": "eks.amazonaws.com"
   },
   "Action": "sts:AssumeRole"
   }
  ]
 }
POLICY
}

# 將 EKS-Cluster 策略附加到 terraformekscluster 角色。

resource "aws_iam_role_policy_attachment" "eks-cluster-AmazonEKSClusterPolicy" {
  policy_arn = "arn:aws:iam::aws:policy/AmazonEKSClusterPolicy"
  role       = "${aws_iam_role.iam-role-eks-cluster.name}"
}


# 用於從 AWS EKS 集群往返的網路流量的安全組。

resource "aws_security_group" "eks-cluster" {
  name        = "SG-eks-cluster"
  vpc_id      = "vpc-123456789"  

# 出口允許從 EKS 集群到互聯網的出站流量 

  egress {                   # 出口規則
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
# 入口允許從互聯網到 EKS 集群的入站流量 

  ingress {                  # 入口規則
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }

}

# 建立 EKS 集群

resource "aws_eks_cluster" "eks_cluster" {
  name     = "terraformEKScluster"
  role_arn =  "${aws_iam_role.iam-role-eks-cluster.arn}"
  version  = "1.19"

# 添加 VPC 配置

  vpc_config {             # 使用 vpc 和網路設定配置 EKS 
   security_group_ids = ["${aws_security_group.eks-cluster.id}"]
   subnet_ids         = ["subnet-1312586","subnet-8126352"] 
    }

  depends_on = [
    "aws_iam_role_policy_attachment.eks-cluster-AmazonEKSClusterPolicy",
    "aws_iam_role_policy_attachment.eks-cluster-AmazonEKSServicePolicy",
   ]
}

# 為 EKS 节點建立 IAM 角色,以便與其他 AWS 服務配合使用。


resource "aws_iam_role" "eks_nodes" {
  name = "eks-node-group"

  assume_role_policy = <<POLICY
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
POLICY
}

# 將不同的策略附加到節點成員。

resource "aws_iam_role_policy_attachment" "AmazonEKSWorkerNodePolicy" {
  policy_arn = "arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy"
  role       = aws_iam_role.eks_nodes.name
}

resource "aws_iam_role_policy_attachment" "AmazonEKS_CNI_Policy" {
  policy_arn = "arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy"
  role       = aws_iam_role.eks_nodes.name
}

resource "aws_iam_role_policy_attachment" "AmazonEC2ContainerRegistryReadOnly" {
  policy_arn = "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly"
  role       = aws_iam_role.eks_nodes.name
}

# 創建 EKS 集群節點組

resource "aws_eks_node_group" "node" {
  cluster_name    = aws_eks_cluster.eks_cluster.name
  node_group_name = "node_group1"
  node_role_arn   = aws_iam_role.eks_nodes.arn
  subnet_ids      = ["subnet-","subnet-"]

  scaling_config {
    desired_size = 1
    max_size     = 1
    min_size     = 1
  }

  depends_on = [
    aws_iam_role_policy_attachment.AmazonEKSWorkerNodePolicy,
    aws_iam_role_policy_attachment.AmazonEKS_CNI_Policy,
    aws_iam_role_policy_attachment.AmazonEC2ContainerRegistryReadOnly,
  ]
}

4. 在 〜/terraform-eks-cluster-demo 中創建另一個文件,命名為 provider.tf,並粘貼下面的內容。提供者文件定義提供者,如 AWS、Oracle 或 Azure 等,以便 Terraform 可以與正確的雲服務連接。

教程將在us-east-2區域創建資源。

provider "aws" {
   region = "us-east-2"
 }

5. 通過運行tree命令驗證以下所需文件是否存在於文件夾中。

The folder structure of Terraform files

使用Terraform EKS模塊創建AWS EKS集群

現在您已經準備好Terraform配置文件和變量文件,是時候啟動Terraform並創建集群了。與所有其他Terraform配置一樣,為了配置AKS集群,Terraform使用三個命令(terraform initterraform planterraform apply)。

現在讓我們逐步走過每個階段。

1. 打開終端並導航到~/terraform-eks-cluster-demo目錄。cd ~/terraform-eks-cluster-demo

cd ~/terraform-eks-cluster-demo

2. 在同一目錄中運行terraform init命令。terraform init命令初始化了與資源配合工作所需的插件和提供者。

terraform init

如果一切順利,您應該在輸出中看到消息Terraform初始化成功,如下所示。

Initializing the terraform

3.現在,執行terraform plan命令。執行terraform plan不是必需的,但建議為確保配置文件語法正確並提供將在基礎結構中提供的資源的藍圖。

terraform plan

如果成功,您應該在輸出中看到像計劃:“X”添加,“Y”更改,或“Z”銷毀的消息。

Running the plan command in Terraform

4.接下來,運行terraform apply以刪除訓練輪並調用Terraform來創建AKS集群。調用terraform apply會讀取當前目錄中的每個配置文件(*.tf),編譯一個發送到AWS的狀態文件以構建EKS集群和其他組件。

AWS對每個EKS集群每小時收取$0.10的費用。確保創建的任何測試集群都要銷毀!

terraform apply
Running the Terraform apply command

驗證AWS EKS集群

在這一點上,您應該已經建立了一個正常運行的AKS集群,但讓我們驗證一下,在AWS管理控制台中。

1.打開您喜歡的瀏覽器,轉到AWS管理控制台並登錄。

2.在頂部的搜索欄中點擊,搜索EKS,然後點擊彈性Kubernetes服務菜單項。您應該會看到terraformEKScluster EKS集群。

Navigating to the EKS service
Checking the terraformEKS Cluster

3. 點擊配置,你應該看到每個組件都成功地創建了,這些組件是你在Terraform配置中定義的,如下所示。

Node Role and EKS cluster role.
Security group applied on EKS Cluster.
Node group node_group1

結論

在這個教程中,你已經學會了如何使用Terraform部署AWS EKS集群及其組件。現在你已準備好使用這個EKS集群並部署應用程序了!

你計劃在你新找到的集群上部署哪些應用程序?

Source:
https://adamtheautomator.com/terraform-eks-module/