iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0
DevOps

第一次參賽就學 Kubernetes系列 第 21

[Day 21] 在 AWS 部署 Kubernetes 叢集 (四) - 部署 AWS EKS

  • 分享至 

  • xImage
  •  

接著進行:

2. 使用 AWS Elastic Kubernetes Service(AWS EKS) 部署叢集

請注意:以下範例使用 AWS EKS 服務,並非免費 💸💸💸!
請注意:以下範例使用 AWS EKS 服務,並非免費 💸💸💸!
請注意:以下範例使用 AWS EKS 服務,並非免費 💸💸💸!

若做為練習建立後刪除並不會太貴,每個 Amazon EKS 叢集,每小時需支付 0.10 USD。(實際以官方為準)

本篇參考 How to Deploy AWS EKS with Terraform - The Simplest Guide to Get Up and Running,透過 Terraform 工具可以快速在 AWS 上建立資源,本篇將著重部署 AWS EKS。


Amazon Elastic Kubernetes Service

簡稱為 Amazon EKS 是一項受管服務,不需要在 AWS 上安裝、操作及維運 k8s 叢集中的 controlplane,controlplane 由 AWS 來幫忙管理,優點是簡化使用者建置及管理叢集要做的事情。

在前項使用 kops 雖可自行管理叢集的設定,有較高的彈性,但相比使用 AWS EKS,使用者需投入更多維運叢集的工作(例如:更新、安全性等)。但使用 kops 不用另外支付額外成本(AWS EKS 的費用)。

Terraform script

本篇會透過撰寫 Terraform 腳本來建立 AWS EKS 資源。

先前往 GitHub 複製 Terraform module for AWS EKS terraform-aws-eks 專案的 main.tf 腳本到本地修改。

完整 main.tf 如下:

# AWS Provider
provider "aws" {
  region = "us-east-1"
}

# VPC module
module "vpc" {
  source = "terraform-aws-modules/vpc/aws"

  name = "my-vpc"
  cidr = "10.0.0.0/16"

  azs             = ["us-east-1a", "us-east-1b", "us-east-1c"]
  private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
  public_subnets  = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]

  enable_nat_gateway = true
  enable_vpn_gateway = true

  tags = {
    Terraform   = "true"
    Environment = "dev"
  }
}


################################################################################
# EKS Module
################################################################################

module "eks" {

  # Provision Instructions
  source  = "terraform-aws-modules/eks/aws"
  version = "19.21.0"

  cluster_name                   = "vii-cluster" # 叢集名稱
  cluster_endpoint_public_access = true

  cluster_addons = {
    coredns = {
      preserve = true
    }
    kube-proxy = {
      most_recent = true
    }
    vpc-cni = {
      most_recent = true
    }
  }

  vpc_id                   = module.vpc.vpc_id
  subnet_ids               = module.vpc.private_subnets
  control_plane_subnet_ids = module.vpc.intra_subnets

  # EKS Managed Node Group(s)
  eks_managed_node_group_defaults = {
    ami_type       = "AL2_x86_64"
    instance_types = ["m5.large"]

    attach_cluster_primary_security_group = true
  }

  eks_managed_node_groups = {
    my-worker-group = {
      min_size     = 1
      max_size     = 2 # 最多 2 個 worker nodes
      desired_size = 1

      instance_types = ["t3.large"]
      capacity_type  = "SPOT"

      tags = {
        ExtraTag = "hello world"
      }
    }
  }

  tags = {
    Example = "vii-cluster"
  }
}

初始化

terraform init

驗證

驗證 Terraform 設定文件的語法和結構是否正確,確保沒有語法錯誤和其他問題。

terraform validate
Success! The configuration is valid.

執行計畫

在套用前檢視該設定會造成產生哪些變動,並與現有建立的設定去做比對(若先前已執行計畫過)。-out=tfplan 將當前的計畫儲存起來,後續可使用該 tfplan 進行確認和應用,而不需要再重新計算設定的異動。

terraform plan -out=tfplan

執行該 plan,需要等他跑一下。

terraform apply tfplan

...
Apply complete! Resources: 66 added, 0 changed, 0 destroyed.

在 AWS 管理後台查看。

https://ithelp.ithome.com.tw/upload/images/20240103/201625115mfe2YRtdE.png

查看 worker node,另外在這邊看不到 controlplane ,是因為 controlplane 是由 AWS 管理。

https://ithelp.ithome.com.tw/upload/images/20240103/201625118pYAu9K8ne.png

或是用以下方式執行計畫

terraform plan
terraform apply --auto-approve # --auto-approve 可以省略使用者輸入 yes

部署 nginx

更新叢集的 kubeconfig。

aws eks update-kubeconfig --region us-east-1 --name vii-cluster

查看 nodes。

k get no
NAME                         STATUS   ROLES    AGE   VERSION
ip-10-0-3-169.ec2.internal   Ready    <none>   11m   v1.28.3-eks-e71965b

建立一個測試用的 image 為 nginx 的 pod。

k run test --image=nginx
pod/test created

查看。

k get po
NAME   READY   STATUS    RESTARTS   AGE
test   1/1     Running   0          46s

刪除叢集

最後記得 terraform destroy,一直開著是要收費的,刪除也是需要一些時間。

terraform destroy --auto-approve

參考來源

  1. How to Deploy AWS EKS with Terraform - The Simplest Guide to Get Up and Running

上一篇
[Day 20] Label & Selector
下一篇
[Day 22] Persistent Volumes 與 Persistent Volume Claims
系列文
第一次參賽就學 Kubernetes30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言