我第一次用Terraform創建EKS自動模式集群,簡直驚呆了:簡單到不可思議!
最近,亚马逊在 re:Invent 上推出了 EKS 自动化模式,我实在忍不住尝试了一下。结果令人惊艳。这个新模式简化了 Kubernetes 基础设施管理的复杂性,让开发者可以专注于构建和扩展应用。接下来我会手把手教你如何用 Terraform 创建一个 EKS 自动化模式集群。
EKS 自动模式是啥?管理 Kubernetes 集群通常涉及配置节点组、处理网络,并在确保安全和性能的同时优化成本。使用 EKS 自动管理模式,AWS 能够简化所有这些操作。自动模式简化了诸如节点配置和子网管理等基础设施细节,并自动优化成本和性能。
这非常适合开发者和新人……希望拥有一个轻松的 Kubernetes 使用体验。通过自动化大部分集群管理任务,帮助你专注于顺畅部署和扩展应用程序。
前提条件在我们开始创建集群前,请确保你满足以下条件。
- 已安装并配置了 AWS CLI,已配置一个具有适当权限的 IAM 用户。
- 已安装并建议使用最新版本的 Terraform。
- 对 Terraform 和 Kubernetes 的基本概念有所了解。
- 一个用于存放 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
}
- 提供程序块:定义所在的AWS区域。
- Terraform后端:使用S3和DynamoDB来存储远程状态和执行状态锁定(可选)。
- 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 实例。
事情是这样的:
- Karpenter 分析部署:它评估你在 Pod 规范中定义的资源请求(CPU、内存等)。
- 提供 EC2 实例类型:根据需求,Karpenter 动态提供最适合的 EC2 实例类型,确保性能和成本的最佳平衡。
- 节点初始化:初始化实例并将其加入集群,使你的 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的(在我出版了两本小说之后的)。你可以在这里找到这本书。
共同學習,寫下你的評論
評論加載中...
作者其他優質文章