亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

我第一次用Terraform創建EKS自動模式集群,簡直驚呆了:簡單到不可思議!

最近,亚马逊在 re:Invent 上推出了 EKS 自动化模式,我实在忍不住尝试了一下。结果令人惊艳。这个新模式简化了 Kubernetes 基础设施管理的复杂性,让开发者可以专注于构建和扩展应用。接下来我会手把手教你如何用 Terraform 创建一个 EKS 自动化模式集群。

EKS 自动模式是啥?

管理 Kubernetes 集群通常涉及配置节点组、处理网络,并在确保安全和性能的同时优化成本。使用 EKS 自动管理模式,AWS 能够简化所有这些操作。自动模式简化了诸如节点配置和子网管理等基础设施细节,并自动优化成本和性能。

这非常适合开发者和新人……希望拥有一个轻松的 Kubernetes 使用体验。通过自动化大部分集群管理任务,帮助你专注于顺畅部署和扩展应用程序。

前提条件

在我们开始创建集群前,请确保你满足以下条件。

  1. 已安装并配置了 AWS CLI,已配置一个具有适当权限的 IAM 用户。
  2. 已安装并建议使用最新版本的 Terraform
  3. 对 Terraform 和 Kubernetes 的基本概念有所了解。
  4. 一个用于存放 Terraform 状态的 S3 存储桶
第一步:搭建网络

在创建 EKS 集群之前,您需要先设置底层的网络基础设施。EKS 管理节点、Pods 及其他组件需要子网才能正常工作。为了简化这个过程,我们将利用 Terraform 社区广泛采用的 VPC 模块,它提供了一种健壮且可复用的方式来创建 VPC、子网及其相关网络资源。

    ################################################################################  
    # 提供者  
    ################################################################################  
    provider "aws" {  
        region = "eu-west-1"  
        profile = "<profile>"  
    }  

    terraform {  
      required_providers {  
        aws = {  
          source  = "hashicorp/aws"  
          version = "~> 5.8"  
        }  
      }  
    }  

    ################################################################################  
    # 后端  
    ################################################################################  

    terraform {  
      backend "s3" {  
        bucket  = "<bucket>"  
        key     = "<network_key>.tf"  
        region  = "<region>"  
        profile = "<profile>"  
      }  
    }  

    ################################################################################  
    # 局部变量  
    ################################################################################  
    data "aws_availability_zones" "available" {  
      # 排除本地区域  
      filter {  
        name   = "opt-in-status"  
        values = ["opt-in-not-required"]  
      }  
    }  

    locals {  
      project_name    = "cluster13"  
      cluster_version = "1.31"  
      aws_region          = "eu-west-1"  

      vpc_cidr = "10.0.0.0/16"  
      azs      = slice(data.aws_availability_zones.available.names, 0, 3)  

      tags = {  
        Project    = local.project_name  
      }  
    }  

    ################################################################################  
    # VPC 模块  
    ################################################################################  
    module "vpc" {  
      source  = "terraform-aws-modules/vpc/aws"  
      version = "~> 5.0"  

      name = local.project_name  
      cidr = local.vpc_cidr  

      azs             = local.azs  
      private_subnets = [for k, v in local.azs : cidrsubnet(local.vpc_cidr, 4, k)]  
      public_subnets  = [for k, v in local.azs : cidrsubnet(local.vpc_cidr, 8, k + 48)]  
      intra_subnets   = [for k, v in local.azs : cidrsubnet(local.vpc_cidr, 8, k + 52)]  

      enable_nat_gateway = true  
      single_nat_gateway = true  

      public_subnet_tags = {  
        "kubernetes.io/role/elb" = 1  
      }  

      private_subnet_tags = {  
        "kubernetes.io/role/internal-elb" = 1  
      }  

      tags = local.tags  
    }  

    ################################################################################  
    # 输出  
    ################################################################################  
    output "vpc_id" {  
      value = module.vpc.vpc_id  
    }  

    output "private_subnets" {  
      value = module.vpc.private_subnets  
    }

使用terraform启动并应用代码

terraform init # 初始化 Terraform
terraform apply # 应用 Terraform 配置

点击“应用”按钮,然后等待Terraform创建所有的网络资源,大约需要5分钟左右。

第二步:配置 EKS 注释:EKS 可能需要根据具体上下文翻译为对应的中文术语。

在VPC和网络配置完成后,就可以开始自动模式下的EKS集群设置了。创建一个目录来存放你的项目,并在该目录中添加一个名为main.tf的文件。这个文件将包含用于部署EKS集群的基本Terraform配置。

    ################################################################################  
    # 提供商  
    ################################################################################  
    provider "aws" {  
        region = "<region>"  
        profile = "<profile>"  
    }  

    terraform {  
      required_providers {  
        aws = {  
          source  = "hashicorp/aws"  
          version = "~> 5.8"  
        }  
      }  
    }  

    ################################################################################  
    # 后端  
    ################################################################################  

    terraform {  
      backend "s3" {  
        bucket  = "<bucket>"  
        key     = "<network_key>.tf"  
        region  = "<region>"  
        profile = "<profile>"  
      }  
    }  

    ################################################################################  
    # 本地变量  
    ################################################################################  

    locals {  
      project_name            = "cluster13"  
      cluster_version         = "1.31"  
      aws_region              = "<region>"  

      vpc_id     = data.terraform_remote_state.network.outputs.vpc_id  
      private_subnet_ids = data.terraform_remote_state.network.outputs.private_subnets  

      tags = {  
        Project    = local.project_name  
        GithubRepo = "terraform-aws-eks"  
        GithubOrg  = "terraform-aws-modules"  
      }  
    }  

    ################################################################################  
    # 远程状态  
    ################################################################################  

    data "terraform_remote_state" "network" {  
      backend = "s3"  
      config = {  
        bucket  = "<bucket_name>"  
        key     = "<key_network>"  
        region  = "<region>"  
        profile = "<profile>"  
      }  
    }  

    ################################################################################  
    # EKS 模块定义  
    ################################################################################  

    module "eks" {  
      source  = "terraform-aws-modules/eks/aws"  
      version = "~> 20.31"  

      cluster_name                   = local.project_name  
      cluster_version                = local.cluster_version  
      cluster_endpoint_public_access = true  

      enable_cluster_creator_admin_permissions = true  

      cluster_compute_config = {  
        enabled    = true  
        node_pools = ["general-purpose"]  
      }  

      vpc_id     = local.vpc_id  
      private_subnet_ids = local.private_subnet_ids  

      tags = local.tags  
    }
  1. 提供程序块:定义所在的AWS区域。
  2. Terraform后端:使用S3和DynamoDB来存储远程状态和执行状态锁定(可选)。
  3. EKS模块:采用流行的terraform-aws-modules/eks模块来简化EKS集群的创建。

使用 Terraform 进行初始化并应用配置代码

初始化 Terraform  
应用 Terraform

等大约10到12分钟左右,terraform创建集群

第 3 步:更新 kubeconfig 文件以便访问您的集群

为了与您的 EKS 集群及其 API 进行互动,您需要更新 ~/.kube/config 文件,并添加新集群的上下文。这样 kubectl 这样的工具就可以与集群通信了。

运行以下命令以更新您的Kubernetes配置文件(kubeconfig):

    # 更新你的 kubeconfig 文件  
    aws eks update-kubeconfig --name cluster13 --alias <clustername>  

    # 检查一下你的上下文是否设置好了  
    kubectl config get-contexts

到了这一步,你的 EKS 集群已经成功创建并开始运行。不过,你可能会注意到一些意外的情况:你的集群里看不到任何节点。这是怎么回事呢?

这种现象在使用EKS自动模式时是完全正常的。在自动模式下,节点不会预先分配好。相反,它们会在有需要它们的Pod时动态创建。

这意味着您的集群将根据工作负载需求自动扩展其基础设施,确保资源使用高效并降低成本。在您实际部署工作负载(例如 Pod)之前,不会有节点启动。这是 EKS 自动模式的一个主要优点——当集群不工作时,它会保持轻便且成本节约。

AWS 控制台上没有节点

使用 kubectl 客户端操作节点

第 4 步:创建你的第一个部署实例

下面是一个简单的 YAML 配置文件,用于创建 Kubernetes Deployment。它创建了两个运行最新 nginx 镜像的 Pod,并暴露 80 端口供 HTTP 流量使用。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
    env: sandbox
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
        env: sandbox
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

然后部署你的应用

使用kubectl命令kubectl apply -f deployment.yaml来应用部署配置文件。在终端中运行此命令。

由于您的集群当前没有任何节点,您可能会发现在部署 nginx Pods 时有轻微的延迟。这是在启用 EKS 自动模式 时的预期行为。

在后台,AWS 使用 Karpenter,一个强大的开源集群自动扩展工具,根据您的 Pod 的需求供应满足特定资源需求的合适 EC2 实例。

事情是这样的:

  1. Karpenter 分析部署:它评估你在 Pod 规范中定义的资源请求(CPU、内存等)。
  2. 提供 EC2 实例类型:根据需求,Karpenter 动态提供最适合的 EC2 实例类型,确保性能和成本的最佳平衡。
  3. 节点初始化:初始化实例并将其加入集群,使你的 Pod 可以被调度。

此过程确保基础设施能精准适配您的工作量,但节点可能需要一会儿才能准备好,尤其是首次部署工作负载时。

虽然初始设置可能感觉稍微有点慢,不过最终确保了资源利用的有效性和成本节省。

47秒后,第一个舱启动。

会自动创建一个节点

创建节点

你的应用程序将在 EKS 自动扩展集群上运作,无需手动配置节点或调整。

为为什么选择EKS自动模式?

如果你符合以下条件,EKS自动模式非常适合你:

  • 只想专注于应用程序开发,而不是基础设施管理。
  • 需要一个成本效益高且自动扩展的集群。
  • 运行那些不需要高度定制配置的标准工作负载。

虽然它还不适用于每一种使用场景(例如,高度专业化的任务),但对于简化在AWS上使用Kubernetes来说,它是一个游戏规则改变者。

结论部分

亚马逊弹性Kubernetes服务(Amazon EKS)自动模式消除了管理 Kubernetes 集群的复杂过程,让你可以专注于构建优质的应用程序。使用 Terraform,设置自动模式集群变得更加容易,为你提供可重复和版本控制的基础设施支持。

我一直使用 Kubernetes 和 EKS 有一段时间了,但必须得说,用 Auto 模式来设置 EKS 集群是我经历过的最快速和最容易的事情。

自动化的节点管理与Terraform配置的简单性相结合,使得整个流程变得非常顺畅。再也不用担心手动配置或扩展节点——AWS会在后台自动处理这一切。

试过 EKS 自动模式没?在评论区分享你的看法和体验吧。

来源:

适用于EKS的Terraform模块:链接:https://github.com/terraform-aws-modules/terraform-aws-eks/blob/master/examples/eks-auto-mode/outputs.tf 文件

Terraform 的 VPC 模块: https://github.com/terraform-aws-modules/terraform-aws-vpc

...

我是Hervé-Gaël KOUAMO先生,HK-TECH的创始人兼首席技术官,这是一家由我创立并专注于设计、构建和优化应用程序的法国科技公司。我们还帮助企业顺利过渡到云端,确保无缝过渡,同时最大化他们的数字潜力。

我出版了我的第一本技术书籍——自然是关于Kubernetes的(在我出版了两本小说之后的)。你可以在这里找到这本书。

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消