aws eks 理解和使用terrafrom创建eks集群(离线安装provider和module)

news2024/11/16 9:53:37

参考

  • 使用 Terraform 在 AWS 中国区域实现自动化部署指南系列1
  • 使用 Terraform 在 AWS 中国区域实现自动化部署指南系列2
  • https://lonegunmanb.github.io/introduction-terraform/
  • 加速 Terraform init

terraform 相关概念

terraform是对标aws cloud formation的iac工具,但是提供了多云基础设施编排的能力(provider)。实际上terraform和cloudformation相比有几个关键点来理解terraform的逻辑

provider

Terraform使用的是HashiCorp自研的go-plugin库(https://github.com/hashicorp/go-plugin),本质上各个Provider插件都是独立的进程,与Terraform进程之间通过rpc进行调用。terraform引擎首先读取并分析用户编写的Terraform代码,形成一个由data与resource组成的图(Graph),再通过rpc调用这些data与resource所对应的Provider插件。Provider插件的编写者根据Terraform所制定的插件框架来定义各种data和resource,并实现相应的CRUD方法。

查找provider的方式,Terraform 官方 Provider 文档,前往registry.terraform.io搜索

terraform的aws文档,https://registry.terraform.io/providers/hashicorp/aws/latest/docs
在这里插入图片描述

terraform init下载provider的流程如下(来自:https://developer.aliyun.com/article/723935)

img

状态管理

terraform执行过程,Terraform 会在项目根目录下加载所有的 *.tf文件,读取配置信息,生成一个.terraform目录

terraform init会分析代码中所使用到的Provider,并尝试下载Provider插件到本地.terraform文件夹。在命令行下执行 terraform apply命令,terraform 会根据 tf脚本对远程IT资源进行更新或者创建,资源的状态信息会保存在terraform.tfstate文件中,这是一个自动创建的 json文件,可以理解为一个缓存文件。每次通过 terraform 操作远端时,会读取该文件的状态信息进行对比,然后操作,再将状态信息写回到terraform.tfstate中。

文件和资源加载

在调用加载Terraform配置的任何命令时,Terraform将按字母顺序加载指定目录中的所有配置文件

Terraform的配置语言是声明性的,所以块的顺序通常并不重要。Terraform根据配置中定义的资源之间的关系自动以正确的顺序处理资源,因此您可以采用对基础架构有意义的任何方式将资源组织到源文件中

启用缓存,每个单独项目中的插件使用符号链接到缓存目录

export TF_PLUGIN_CACHE_DIR="$HOME/.terraform.d/plugin-cache"
//或者修改terraform配置文件
plugin_cache_dir  = "$HOME/.terraform.d/terraform-plugin-cache" 
disable_checkpoint = true

查看缓存

$ tree terraform-plugin-cache/
terraform-plugin-cache/
└── registry.terraform.io
    └── hashicorp
        └── aws
            └── 4.48.0
                └── linux_amd64 -> /usr/share/terraform/providers/registry.terraform.io/hashicorp/aws/4.48.0/linux_amd64

所有的包含terraform文件的文件夹都是一个terraform模块(封装好的代码文件)。使用模块有利于terraform代码的复用和传播。

terraform安装和provider加载

terraform官方提供了与aws集成的quick start,https://developer.hashicorp.com/terraform/tutorials/aws-get-started

安装terraform

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/AmazonLinux/hashicorp.repo
sudo yum -y install terraform
terraform -install-autocomplete
terraform -help

目录布局

provider.tf             ### provider 配置
terraform.tfvars        ### 配置 provider 要用到的变量
variables.tf            ### 通用变量
resource.tf             ### 资源定义
data.tf                 ### 包文件定义
output.tf               ### 输出
main.tf                 ### 模块入口

terraform {}块包含terraform的设置,可以进行版本约束。

aws provider是terraform用来创建和管理资源的插件,在其中设置共享凭证。aws provider的源被定义为hashicorp/aws,是 registry.terraform.io/hashicorp/aws 的简写

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "4.48.0"
    }
  }
}

provider "aws" {
  region                   = "cn-north-1"
  profile                  = "admin"
}

创建简单的s3桶

resource "aws_s3_bucket" "s3_bucket" {
  bucket = "my-tf-testbucket"
  acl    = "private"
}

terraform的常用命令

terraform init #安装插件和初始化
terraform fmt #格式化
terrafrom validate #验证配置
terraform plan #查看计划操作
terraform apply #部署模板
terrafrom show #检查当前资源状态
terraform destroy #清除资源

由于国内没有terraform provider源,因此可能会下载超时。

Error: Failed to query available provider packages
Could not retrieve the list of available versions for provider hashicorp/aws: could not connect to
registry.terraform.io: Failed to request discovery document: Get
"https://registry.terraform.io/.well-known/terraform.json": net/http: request canceled (Client.Timeout
exceeded while awaiting headers)

没有什么太好的办法,可以手动下载压缩包然后从本地加载,需要配置terraform

下载链接,https://releases.hashicorp.com/terraform-provider-aws

$ vim ~/.terraformrc
provider_installation {
  filesystem_mirror {
    path    = "/usr/share/terraform/providers"
    include = ["registry.terraform.io/*/*"]
  }
}

将压缩包按照路径解压到对应目录下

sudo mkdir -p /usr/share/terraform/providers/registry.terraform.io/hashicorp/aws/4.48.0/linux_amd64
sudo unzip terraform-provider-aws_4.48.0_linux_amd64.zip -d /usr/share/terraform/providers/registry.terraform.io/hashicorp/aws/4.48.0/linux_amd64

或者直接指定目录,加载provider

terraform init -plugin-dir /usr/share/terraform/providers

使用terraform创建eks集群

  • AWS EKS Terraform module

hasiicorp给我们提供了一个简单的demo

在这里插入图片描述

下载kubernates providers

wget https://releases.hashicorp.com/terraform-provider-kubernetes/2.16.1/terraform-provider-kubernetes_2.16.1_linux_amd64.zip
sudo mkdir -p /usr/share/terraform/providers/registry.terraform.io/hashicorp/kubernetes/2.16.1/linux_amd64
sudo unzip terraform-provider-kubernetes_2.16.1_linux_amd64.zip -d /usr/share/terraform/providers/registry.terraform.io/hashicorp/kubernetes/2.16.1/linux_amd64

加载和使用模块

  • https://lonegunmanb.github.io/introduction-terraform/4.2.%E4%BD%BF%E7%94%A8%E6%A8%A1%E5%9D%97.html

模块就是包含一组Terraform代码的文件夹。直接在一个文件夹内执行terraform apply或者terraform plan命令,那么当前所在的文件夹就被称为根模块(root module)

由于众所周知的网络原因我们无法从官方的公共仓库下载module

在这里插入图片描述

从本地加载模块

mkdir -p /usr/share/terraform/moudles/eks
mkdir -p /usr/share/terraform/moudles/vpc
sudo wget https://github.com/terraform-aws-modules/terraform-aws-eks/archive/refs/tags/v19.4.2.zip
sudo wget https://github.com/terraform-aws-modules/terraform-aws-vpc/archive/refs/tags/v3.18.1.zip
sudo unzip v19.4.2.zip -d /usr/share/terraform/moudles/eks/
sudo unzip v3.18.1.zip -d /usr/share/terraform/moudles/vpc/

修改module的source为本地路径,注意要去掉版本号

module "eks" {
  source  = "/usr/share/terraform/moudles/eks/terraform-aws-eks-19.4.2"
  # version = "19.4.2"
  ...
}

module "vpc" {
  source  = "/usr/share/terraform/moudles/vpc/terraform-aws-vpc-3.18.1"
  # version = "3.18.1"
  ...
}

之后任何依赖模块都可以通过以上方式手动加载,例如eks模块会依赖kms模块,网络问题真的增加了不少负担。。

mkdir -p /usr/share/terraform/moudles/eks
sudo wget https://github.com/terraform-aws-modules/terraform-aws-kms/archive/refs/tags/v1.3.0.zip
sudo unzip v1.3.0.zip -d /usr/share/terraform/moudles/kms/

修改eks中的kms模块source,这里一定要把路径写对了,不然会报错参数找不到

module "kms" {
  source  = "/usr/share/terraform/moudles/kms/terraform-aws-kms-1.3.0"
  # source  = "terraform-aws-modules/kms/aws"
  # version = "1.1.0"
  ...
}

eks模块需要依赖其他provder

  • aws (hashicorp/aws) >= 4.47
  • cloudinit (hashicorp/cloudinit) >= 2.0
  • kubernetes (hashicorp/kubernetes) >= 2.10
  • tls (hashicorp/tls) >= 3.0

仍旧手动加载其他的provider

wget https://releases.hashicorp.com/terraform-provider-tls/4.0.4/terraform-provider-tls_4.0.4_linux_amd64.zip
sudo mkdir -p /usr/share/terraform/providers/registry.terraform.io/hashicorp/tls/4.0.4/linux_amd64
sudo unzip terraform-provider-tls_4.0.4_linux_amd64.zip -d /usr/share/terraform/providers/registry.terraform.io/hashicorp/tls/4.0.4/linux_amd64

wget https://releases.hashicorp.com/terraform-provider-cloudinit/2.2.0/terraform-provider-cloudinit_2.2.0_linux_amd64.zip
sudo mkdir -p /usr/share/terraform/providers/registry.terraform.io/hashicorp/cloudinit/2.2.0/linux_amd64
sudo unzip terraform-provider-cloudinit_2.2.0_linux_amd64.zip -d /usr/share/terraform/providers/registry.terraform.io/hashicorp/cloudinit/2.2.0/linux_amd64

wget https://releases.hashicorp.com/terraform-provider-random/3.4.3/terraform-provider-random_3.4.3_linux_amd64.zip
sudo mkdir -p /usr/share/terraform/providers/registry.terraform.io/hashicorp/random/3.4.3/linux_amd64
sudo unzip terraform-provider-random_3.4.3_linux_amd64.zip -d /usr/share/terraform/providers/registry.terraform.io/hashicorp/random/3.4.3/linux_amd64

当出现以下结果,说明终于可以用了

$ terraform init -plugin-dir /usr/share/terraform/providers
Terraform has been successfully initialized!

创建eks集群

  • learn-terraform-provision-eks-cluster

接下来只需要按照demo中的文件修改即可,例如以下eks模块(当然也可以不用模块,直接创建eks resource)

引用创建的vpc资源,然后创建一个托管节点组,具体的参数和用法在eks module的文档中也有详细说明,按需修改即可

为了避免创建新资源可以直接指定vpc和子网

vpc_id                   = "vpc-1234556abcdef"
subnet_ids               = ["subnet-abcde012", "subnet-bcde012a", "subnet-fghi345a"]
control_plane_subnet_ids = ["subnet-xyzde987", "subnet-slkjf456", "subnet-qeiru789"]

以下是demo中的eks模块配置

module "eks" {
  source  = "/usr/share/terraform/moudles/eks/terraform-aws-eks-19.4.2"

  cluster_name    = local.cluster_name
  cluster_version = "1.24"

  vpc_id                         = module.vpc.vpc_id
  subnet_ids                     = module.vpc.private_subnets
  cluster_endpoint_public_access = true

  eks_managed_node_group_defaults = {
    ami_type = "AL2_x86_64"

  }

  eks_managed_node_groups = {
    one = {
      name = "node-group-1"

      instance_types = ["t3.small"]

      min_size     = 1
      max_size     = 3
      desired_size = 2
    }
  }
}

官方仓库提供了不同的示例,可以按需拿来用

https://github.com/terraform-aws-modules/terraform-aws-eks/tree/master/examples

还有个ecs pipeline的demo示例可以之后试试

https://github.com/aws-samples/cicd-for-ecs-workshop-code/blob/main/lab-terraform/tf/app-pipeline/app-pipeline.tf

创建过程中出现的错误

创建角色失败

MalformedPolicyDocument: Invalid principal in policy: "SERVICE":"eks.amazonaws.com.cn"
Invalid principal in policy: "SERVICE":"eks.amazonaws.com.cn"

在控制台查看具体的eks服务的信任策略,service的全名应该是eks.amazonaws.com,显然是对中国区的适配有问题。直接把模块的源码改了就行

principals {
      type        = "Service"
      identifiers = ["eks.amazonaws.com"]
      # identifiers = ["eks.${local.dns_suffix}"]
}

最后终于创建完成了

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/134334.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis集群系列十一 —— 故障转移一

故障发现 Redis 集群内节点通过 ping/pong 消息实现节点通信,消息不但可以传播节点槽信息,还可以传播其他状态。当集群中某个节点出现问题时,需要识别出节点是否发生了故障,因此故障发现是通过Gossip 协议来广播自己的状态以及自…

日志系统:WAL和二阶段提交

1. 前言 一条更新语句在执行过程中不仅仅要操作不仅仅是通过数据库的组件(分析器、优化器、执行器、存储引擎等)操作表数据还涉及以下内容: 要操作日志系统的redo log、binlog和undo log, 更新操作也不是实时更新到磁盘的而是通过3.Write-A…

DDR3 数据传输 (五)

目录 引言 设计说明 参数说明 设计简图 IP配置说明 写FIFO IP

在linux上使用CMake构建和安装gtest

在linux上使用CMake构建和安装gtest一、准备工作二、构建并安装gtest的静态库三、构建并安装gtest的共享库一、准备工作 本机环境: 系统版本:RHEL 7.6GCC/G版本: 12.1.1googletest版本:1.12.1 注意,gtest的1.12.x分…

基于准则匹配的图像对准

一、概述 在图像处理相关的问题中,图像对准是一类典型的问题,也就是要将两幅图严丝合缝地对应起来。通常来讲,两幅图大小不一,一个是模板,一个是母图,也就是要在母图中搜寻定位到与模板图最为接近的区域。 …

QML教程(七) JavaScript

目录 一、对属性值使用 JavaScript 表达式 二、在 QML 中添加 JavaScript 函数 三、使用 JavaScript 文件 四、属性绑定中的 JavaScript 五、信号处理程序中的 JavaScript 六、将信号连接到 JavaScript 函数 七、启动执行 JavaScript QML 提供的 JavaScript 主机环境可以…

算法学习-并查集(持续更新中)

本文参考: 最容易理解的并查集详解 详解:并查集(Union-Find) 「代码随想录」684. 冗余连接:【并查集基础题目】详解! 并查集从入门到出门 并查集常常在做图相关的题目时冒出来,但是笔者经常去回避这样的解法…

Exynos_4412——轮询与中断

目录 一、CPU与硬件的交互方式 1.1轮询 1.2中断 1.3DMA 二、轮询方式的按键实验 三、GPIO中断相关寄存器 四、GPIO中断编程 五、小作业 一、CPU与硬件的交互方式 1.1轮询 CPU执行程序时不断地询问硬件是否需要其服务,若需要则给予其服务,若不需…

Android Jetpack Compose——一个简单的微信界面

一个简单的微信界面简述效果视频底部导航栏导航元素导航栏放入插槽绘制地图消息列表效果图实现聊天效果图实现气泡背景联系人界面效果图实现好友详情效果图实现发现效果图实现未读红点未读条数朋友圈效果图实现上拉加载个人设置效果图实现个人信息功能区钱包效果图实现切换主题…

【Vue】项目搭建规范

1. 集成editorconfig配置 EditorConfig 有助于为不同 IDE 编辑器上处理同一项目的多个开发人员维护一致的编码风格。 VSCode需要安装一个插件:EditorConfig for VS Code 创建 .editorconfig 文件: # http://editorconfig.orgroot true[*] # 表示所有文…

js Proxy 的使用

文章目录一、什么是Proxy二、语法三、Proxy 方法1、get() 方法2、set() 方法3、apply() 方法4、has() 方法5、construct() 方法6、deleteProperty() 方法一、什么是Proxy Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问&#xff…

[Vulnhub] DC-2

Vlunhub下DC系列靶机第二台,难度与DC-1 差不多,为简单。共有五个Flag 下载地址:Vulnhub:DC-2 目录 信息搜集 cewl爬行网站字典&hydra爆破wordpress用户密码 -rbash逃逸 git提权 信息搜集 nmap -sP 192.168.236.0/24 扫描一下靶机i…

c++语法欠缺地方(持续更新)

sizeof是用来计算变量占多大内存的,单位是字节(byte);sizeof 后面跟类型时,必须加上括号,例如sizeof(double);后面跟变量可以不用加括号,例如:sizeof d %d是以十进制形式输出有符号…

hadoop之kerberos权限配置(ranger基础上)(三)

文章目录一、kerberos服务端二、kerberos客户端三、hadoop集群安装HTTPS服务四、kerberos整合zk五、kerberos整合ranger六、kerberos整合hdfs七、kerberos整合yarn八、kerberos整合hive九、kerberos整合hbase十、遇到的问题一、kerberos服务端 上传kerberos安装包到/opt/rpm 安…

数据库,计算机网络、操作系统刷题笔记22

数据库,计算机网络、操作系统刷题笔记22 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle…

最值得推荐的3个免费PDF 转换器

当您需要将 PDF 转换为另一种格式(如 Microsoft Word、图像(如 JPG)、Excel、电子书、PowerPoint 等,反之亦然)时,最好的 PDF 转换器非常重要。 但是找到一个可靠的 PDF 转换软件来使用是具有挑战性的。因…

JAVA设计模式--行为型模式--策略模式

1.策略模式(Strategy Pattern) 1.1介绍 一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对…

【C++】网络编程(TCPUDP)

网络编程是C API操作中很重要的一部分,包含TCP和UDP。 网络传输模型可以抽象为7个层:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。 但在使用TCP/IP协议时,可以简化为这4层:网络接口、网络层、传输层、应用层。…

物理层基本概念

目录物理层的基本概念物理层传输方式串行传输并行传输同步传输异步传输单向通信(单工)双向交替通信(半双工)双向同时通信(全双工)编码与调制常用编码基本调制方法信道极限容量物理层的基本概念 物理层考虑的…

路由 OSPF常见4种网络类型MA、P2P、NBMA、P2MP、OSPF报头字段信息简介。

4.2.1 路由 OSPF(OSPF常见4种网络类型、OSPF报头信息) 目录OSPF常见的4种网络类型广播类型(Broadcast 或 MA)P2PNBMAP2MPOSPF报文发送形式对于不同OSPF网络类型的组网OSPF报头信息实际抓包分析OSPF常见的4种网络类型 OSPF应用于不…