利用 Terraform EKS 模块创建 EKS 集群

如果您需要使用AWS弹性Kubernetes服务(Amazon EKS)Terraform建立集群,那您运气不错。使用Terraform EKS模块和所有其他所需资源,您可以创建一个Terraform配置,并使用代码创建一个AKS集群。

Amazon EKS是在AWS上运行Kubernetes的托管服务,无需安装、运营和维护自己的Kubernetes集群。使用Terraform构建EKS集群可以让您快速、高效地创建资源,并采用自动化的方法。

在本教程中,您将逐步学习如何使用Terraform配置构建EKS集群。让我们开始吧!

先决条件

本文将是一个逐步教程。如果您想跟着进行,请确保您已经准备好以下内容:

  • 一个Amazon Web Service(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
  • 一个IAM 角色,用于 EKS 节点调用其他 AWS 服务(eks-node-group)。此角色附加有一个策略,允许在实例上假定临时安全凭证,以访问其他 AWS 资源。
  • EKS 集群节点组node_group1) – 此资源通过 scaling_config 属性定义集群将具有的节点数。
# 为 Kubernetes 集群创建 IAM 角色,以代表您调用其他 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并创建集群了。为了提供AKS集群,与所有其他Terraform配置一样,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,然后单击 Elastic Kubernetes Service 菜单项。您应该会看到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/