本文适用范文

  • 使用AWS海外账号
  • 对aws、terraform、k8s有一定的了解
  • 新建一个独立的VPC

Terraform简介

terraform是一个云端的资源编排工具,官方对自己的定位:Terraform is an open-source infrastructure as code software。

类似的,在AWS云上有CloudFormation,我们选择terraform是因为它更加的通用,能够同时管理AWS云,Azure云,阿里云等常见的云服务。

使用方式详见:https://registry.terraform.io/namespaces/hashicorp

前置条件

  • 有一个AWS海外账号,并且拥有管理员权限
  • 执行脚本的服务器以赋予角色,角色拥有administrator权限(实际用不到这么高的权限,仅为了演示,未做最小权限配置)
  • 服务器已安装terraform程序(安装方式见terraform官网)
  • 服务器已安装awscli和kubectl

说明

为了方便阅读,tf脚本按照aws资源类型拆分(实际上将所有配置打包到一个tf脚本里也能执行)

脚本内容

脚本中已标记注释,这里就不解释每段的含义了。

main.tf

各位客官根据自己需要,修改此脚本中的参数。其他脚本均不需要修改

# author zhenglisai
# 使用当前脚本所在服务器角色权限
provider "aws" {
region = "us-west-2"
}
# 获取当前可用区
data "aws_availability_zones" "available" {
state = "available"
}
# 本地参数,下面参数均可根据自己需要修改。
locals {
# EKS集群名
cluster_name = "tf-cluster-zhenglisai"
# EKS集群角色名
cluster_role_name = "tf-cluster-zhenglisai"
# EKS计算节点名
node_name = "tf-node-zhenglisai"
# EKS计算节点角色
node_role_name = "tf-node-zhenglisai"
# EKS计算节点使用的启动模板名
launch_template_name = "tf-launch_template-zhenglisai"
# image_id每个区域不同,此ID仅适用于us-west-2区域,其他区域的镜像请参见AWS文档
launch_template_image_id = "ami-0cb182e3037115aa0"
# EKS计算节点使用的实例类型
launch_template_instance_type = "t3.small"
# 服务器登录密钥,需要提前在EC2的密钥管理中配置好
launch_template_key_name = "你的密钥名"
# EKS集群使用的VPC网段
vpc_cidr_block = "10.2.0.0/16"
# EKS集群使用的子网网段
subnet_1_cidr_block = "10.2.0.0/20"
# EKS集群使用的子网网段
subnet_2_cidr_block = "10.2.16.0/20"
}

eks.tf

# author zhenglisai
# 集群
resource "aws_eks_cluster" "eks-cluster" {
name = local.cluster_name
role_arn = aws_iam_role.eks-cluster.arn
vpc_config {
subnet_ids = [aws_subnet.subnet_1.id, aws_subnet.subnet_2.id]
security_group_ids = [aws_security_group.eks-cluster.id]
}
}
# 计算节点
resource "aws_eks_node_group" "eks-node" {
cluster_name = aws_eks_cluster.eks-cluster.name
node_group_name = local.node_name
node_role_arn = aws_iam_role.eks-node.arn
subnet_ids = [aws_subnet.subnet_1.id, aws_subnet.subnet_2.id]
scaling_config {
desired_size = 2
max_size = 3
min_size = 1
}
launch_template {
version = aws_launch_template.eks-template.latest_version
id = aws_launch_template.eks-template.id
}
}

ec2.tf

# author zhenglisai
resource "aws_launch_template" "eks-template" {
name = local.launch_template_name
image_id = local.launch_template_image_id
instance_type = local.launch_template_instance_type
key_name = local.launch_template_key_name
vpc_security_group_ids = [aws_security_group.eks-node.id]
user_data = base64encode("#!/bin/bash\n/etc/eks/bootstrap.sh ${aws_eks_cluster.eks-cluster.name}")
}

iam.tf

# author zhenglisai
data "aws_iam_policy" "AmazonEKSClusterPolicy" {
name = "AmazonEKSClusterPolicy"
}
data "aws_iam_policy" "AmazonEKSWorkerNodePolicy" {
name = "AmazonEKSWorkerNodePolicy"
}
data "aws_iam_policy" "AmazonEC2ContainerRegistryReadOnly" {
name = "AmazonEC2ContainerRegistryReadOnly"
}
data "aws_iam_policy" "AmazonEKS_CNI_Policy" {
name = "AmazonEKS_CNI_Policy"
}
data "aws_iam_policy_document" "ec2-instance" {
statement {
actions = ["sts:AssumeRole"] principals {
type = "Service"
identifiers = ["ec2.amazonaws.com"]
}
}
}
data "aws_iam_policy_document" "eks-instance" {
statement {
actions = ["sts:AssumeRole"] principals {
type = "Service"
identifiers = ["eks.amazonaws.com"]
}
}
}
resource "aws_iam_role" "eks-cluster" {
name = local.cluster_role_name
assume_role_policy = data.aws_iam_policy_document.eks-instance.json
managed_policy_arns = [data.aws_iam_policy.AmazonEKSClusterPolicy.arn]
}
resource "aws_iam_role" "eks-node" {
name = local.node_role_name
assume_role_policy = data.aws_iam_policy_document.ec2-instance.json
managed_policy_arns = [data.aws_iam_policy.AmazonEC2ContainerRegistryReadOnly.arn, data.aws_iam_policy.AmazonEKS_CNI_Policy.arn, data.aws_iam_policy.AmazonEKSWorkerNodePolicy.arn]
}

securitygroup.tf

# author zhenglisai
resource "aws_security_group" "eks-cluster" {
name = "eks-cluster"
description = "Allow local vpc"
vpc_id = aws_vpc.eks.id
ingress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = [local.vpc_cidr_block]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "eks-cluster"
}
}
resource "aws_security_group" "eks-node" {
name = "eks-node"
description = "Allow local vpc"
vpc_id = aws_vpc.eks.id
ingress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = [local.vpc_cidr_block]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "eks-node"
}
}

vpc.tf

# author zhenglisai
resource "aws_vpc" "eks" {
cidr_block = local.vpc_cidr_block
enable_dns_hostnames = "true"
tags = {
Name = "eks"
}
} # 定义Subnet子网
resource "aws_subnet" "subnet_1" {
vpc_id = aws_vpc.eks.id
map_public_ip_on_launch = true
cidr_block = local.subnet_1_cidr_block
availability_zone = data.aws_availability_zones.available.names[0]
tags = {
Name = "subnet_1"
"kubernetes.io/role/elb" = "1"
}
}
resource "aws_subnet" "subnet_2" {
vpc_id = aws_vpc.eks.id
map_public_ip_on_launch = true
cidr_block = local.subnet_2_cidr_block
availability_zone = data.aws_availability_zones.available.names[1]
tags = {
Name = "subnet_2"
"kubernetes.io/role/elb" = "1"
}
}
# 创建公网接口
resource "aws_internet_gateway" "igw-eks" {
vpc_id = aws_vpc.eks.id
tags = {
Name = "igw-eks"
}
}
# 修改路由表
data "aws_route_table" "route_table_eks" {
vpc_id = aws_vpc.eks.id
filter {
name = "association.main"
values = [true]
}
}
resource "aws_route" "route_table_eks" {
route_table_id = data.aws_route_table.route_table_eks.id
destination_cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.igw-eks.id
}

将以上文件保存在一个目录中,比如eks_demo目录

开始执行

进入目录,并初始化terraform资源

cd eks_demo && terraform init

初始化完成后,开始执行terraform部署

terraform apply

执行后会开始检查资源,等待检查完毕后,确认输入yes开始部署

整个部署过程大概需要持续15分钟左右

部署完成后,配置kubectl权限,之后便可与EKS开始交互

删除资源

实验结束后,如果不需要保留资源,在tf脚本所在目录执行

terraform destroy

即可删除所有terraform创建的资源

【k8s】使用Terraform一键部署EKS集群的更多相关文章

  1. k8s 上使用 StatefulSet 部署 zookeeper 集群

    目录 StatefulSet 部署 zookeeper 集群 创建pv StatefulSet 测试 StatefulSet 部署 zookeeper 集群 参考 k8s官网zookeeper集群的部 ...

  2. 一键部署ETCD集群脚本

    这里使用三个节点,系统版本为CentOS7 # vim deploy-etcd.sh #!/bin/bash set -x set -e #更改这里的IP, 只支持部署3个节点etcd集群 decla ...

  3. 一键部署MongoDB集群Windows版

    由于周末在家手头没有虚拟机,所以在windows下单机完毕部署要求,并编写bat执行脚本. 1.创建配置文件及相关文件夹 总的启动脚本例如以下(startmc.bat): rem m1 start m ...

  4. 一键部署etcd集群

    这里使用三个节点,系统版本为CentOS7 # vim deploy-etcd.sh #!/bin/bash set -x set -e #更改这里的IP, 只支持部署3个节点etcd集群 decla ...

  5. 一键部署etcd集群管理脚本

    一.编写脚本 1 #!/bin/sh 2 # 安装 3 # ./run.sh etcd03 etcd01=http://192.168.2.44:2380,etcd02=http://192.168. ...

  6. Azure vm 扩展脚本自动部署Elasticsearch集群

    一.完整过程比较长,我仅给出Azure vm extension script 一键部署Elasticsearch集群的安装脚本,有需要的同学,可以邮件我,我给你完整的ARM Template 如果你 ...

  7. k8s 组件介绍__单Master集群部署

    参考链接:https://github.com/opsnull/follow-me-install-kubernetes-cluster kubernetes 概述 1.kubernetes 是什么 ...

  8. lvs+keepalived部署k8s v1.16.4高可用集群

    一.部署环境 1.1 主机列表 主机名 Centos版本 ip docker version flannel version Keepalived version 主机配置 备注 lvs-keepal ...

  9. Centos7.6部署k8s v1.16.4高可用集群(主备模式)

    一.部署环境 主机列表: 主机名 Centos版本 ip docker version flannel version Keepalived version 主机配置 备注 master01 7.6. ...

随机推荐

  1. zlib开发笔记(四):zlib库介绍、编译windows vs2015x64版本和工程模板

    前言   Qt使用一些压缩解压功能,介绍过libzip库编译,本篇说明zlib库.需要用到zlib的msvc2015x64版本,编译一下.   版本编译引导 zlib在windows上的mingw32 ...

  2. kafka-eagle监控界面搭建

    kafka-eagle监控界面搭建 一.背景 二 .mac上安装kafka-eagle 1.安装JDK 2.安装eagle 1.下载eagle 2.解压并配置环境变量 3.启用kafka的JMX 4. ...

  3. NGINX杂谈——flask_limiter的IP获取(怎么拿到真实的客户端IP)

    本篇博客将 flask_limiter 作为切入点,来记录一下自己对 remote_addr 和 proxy_add_x_forwarded_for 两个变量.X-Real-IP 和 X-Forwar ...

  4. numpy读取本地数据和索引

    1.numpy读取数据 np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False) 做一个 ...

  5. JAVA笔记13__创建线程/线程休眠/等待线程终止/线程中断/守护线程

    /** * 线程:是进程的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行,一个进程最少有一个进程(单线程程序) * 多线程两种实现方法:1.继承Thread类 2.实现Runnable ...

  6. Linux题目学习

    一.填空题: 1. 在Linux系统中,以 文件 方式访问设备 . 2. Linux内核引导时,从文件/etc/fstab 中读取要加载的文件系统. 3. Linux文件系统中每个文件用 i节点来标识 ...

  7. Java 网络编程 - 总结概述

    IP地址 IP地址IntAddress 唯一定位一台网络上的计算机 127.0.0.1:本地localhost IP地址的分类 ipV4/ipV6 ipV4:127.0.0.1,4个字节组成:0~25 ...

  8. Spring Cloud Alibaba 使用Seata解决分布式事务

    为什么会产生分布式事务? 随着业务的快速发展,网站系统往往由单体架构逐渐演变为分布式.微服务架构,而对于数据库则由单机数据库架构向分布式数据库架构转变.此时,我们会将一个大的应用系统拆分为多个可以独立 ...

  9. linux下端口占用

    1, netstat -tunlp|grep 1235 2,kill -9 18520

  10. 一文看懂socket编程

    1.网络模型的设计模式 1.1 B/S模式 B/S: Browser/Server,浏览器/服务器模式,在一端部署服务器,在另外外一端使用默认配置的浏览器即可完成数据的传输. B/S结构是随着互联网的 ...