iT邦幫忙

2025 iThome 鐵人賽

DAY 17
0
Build on AWS

AWS 雲原生,學起來比泡咖啡還快系列 第 17

DAY17 - EKS建置前的環境準備

  • 分享至 

  • xImage
  •  

接下來都會採用 CMD的方式來進行設定,方便操作,所以我們需要先有一台可以下CMD的機器,我們這部分先用 CloudShell 來進行設定。

AWS CloudShell 簡單介紹

什麼是 CloudShell?

AWS CloudShell 是一個 瀏覽器內建的命令列環境
你登入 AWS Console 後,就能直接使用 AWS CLI、Python、PowerShell 等工具,
不需要額外安裝或設定憑證


特色

  • 免安裝:直接打開就能用
  • 自動帶入權限:使用當前登入的 IAM 身分
  • 區域獨立:每個 Region 有自己的環境
  • 檔案儲存:內建 1 GB 永久儲存空間
  • 多語言支援:預裝 Python、Node.js、AWS SDK

使用情境

  • 快速測試 AWS CLI 指令
  • 管理或操作 AWS 資源
  • 執行與測試腳本
  • 除錯 IAM 或 API 權限問題

進入方式

透過畫面上右上角開啟
https://ithelp.ithome.com.tw/upload/images/20250919/20145462iXDUwSDzAo.png

網路環境建置

#!/bin/bash
set -e

STACK_NAME="MyVpcStack"
TEMPLATE_FILE="vpc-template.yaml"
REGION="ap-northeast-1"

# === 產生 CloudFormation YAML ===
cat > $TEMPLATE_FILE << 'EOF'
AWSTemplateFormatVersion: 2010-09-09
Description: VPC with 2 AZs, 2 Public Subnets, 4 Private Subnets, 1 NAT Gateway, and 1 IGW

Parameters:
  VpcCidr:
    Type: String
    Default: 10.0.0.0/16

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VpcCidr
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: MyVpc

  InternetGateway:
    Type: AWS::EC2::InternetGateway

  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref VPC
      InternetGatewayId: !Ref InternetGateway

  PublicSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.1.0/24
      AvailabilityZone: !Select [ 0, !GetAZs '' ]
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: PublicSubnet1

  PublicSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.2.0/24
      AvailabilityZone: !Select [ 1, !GetAZs '' ]
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: PublicSubnet2

  PrivateSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.3.0/24
      AvailabilityZone: !Select [ 0, !GetAZs '' ]
      Tags:
        - Key: Name
          Value: PrivateSubnet1

  PrivateSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.4.0/24
      AvailabilityZone: !Select [ 1, !GetAZs '' ]
      Tags:
        - Key: Name
          Value: PrivateSubnet2

  PrivateSubnet3:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.5.0/24
      AvailabilityZone: !Select [ 0, !GetAZs '' ]
      Tags:
        - Key: Name
          Value: PrivateSubnet3

  PrivateSubnet4:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.6.0/24
      AvailabilityZone: !Select [ 1, !GetAZs '' ]
      Tags:
        - Key: Name
          Value: PrivateSubnet4

  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: PublicRT

  PublicRoute:
    Type: AWS::EC2::Route
    DependsOn: AttachGateway
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway

  PublicSubnet1RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnet1
      RouteTableId: !Ref PublicRouteTable

  PublicSubnet2RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnet2
      RouteTableId: !Ref PublicRouteTable

  NatEIP:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc

  NatGateway:
    Type: AWS::EC2::NatGateway
    Properties:
      AllocationId: !GetAtt NatEIP.AllocationId
      SubnetId: !Ref PublicSubnet1
      Tags:
        - Key: Name
          Value: NatGateway

  PrivateRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: PrivateRT

  PrivateRoute:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref PrivateRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      NatGatewayId: !Ref NatGateway

  PrivateSubnet1RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PrivateSubnet1
      RouteTableId: !Ref PrivateRouteTable

  PrivateSubnet2RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PrivateSubnet2
      RouteTableId: !Ref PrivateRouteTable

  PrivateSubnet3RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PrivateSubnet3
      RouteTableId: !Ref PrivateRouteTable

  PrivateSubnet4RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PrivateSubnet4
      RouteTableId: !Ref PrivateRouteTable

Outputs:
  VpcId:
    Value: !Ref VPC
    Description: VPC ID
  PublicSubnet1:
    Value: !Ref PublicSubnet1
  PublicSubnet2:
    Value: !Ref PublicSubnet2
  PrivateSubnet1:
    Value: !Ref PrivateSubnet1
  PrivateSubnet2:
    Value: !Ref PrivateSubnet2
  PrivateSubnet3:
    Value: !Ref PrivateSubnet3
  PrivateSubnet4:
    Value: !Ref PrivateSubnet4
EOF

# === 修改檔案權限 ===
chmod 644 $TEMPLATE_FILE

# === 顯示操作指引 ===
echo "✅ CloudFormation YAML 模板已生成並保存為 $TEMPLATE_FILE"
echo "請使用以下命令來部署 CloudFormation Stack:"
echo "aws cloudformation create-stack --stack-name $STACK_NAME --template-body file://$TEMPLATE_FILE --capabilities CAPABILITY_NAMED_IAM --region $REGION"

這裡透過cloudformation IAC的方式進行建置,可以在cloudformaction 觀察目前建置的進度。

建置完畢後執行以下直令呼叫 cloudformation

aws cloudformation create-stack --stack-name $STACK_NAME --template-body file://$TEMPLATE_FILE --capabilities CAPABILITY_NAMED_IAM --region $REGION

最後就可以於 console 看到相關建置的資源
https://ithelp.ithome.com.tw/upload/images/20250919/20145462hFq5DOR2xa.png

EKS 與 kubectl 安裝

# 更新系統並安裝必要的工具
sudo yum update -y
sudo yum install -y curl

# 下載最新版本的 kubectl
curl -LO "https://dl.k8s.io/release/v1.24.0/bin/linux/amd64/kubectl"

# 給 kubectl 文件賦予執行權限
chmod +x ./kubectl

# 移動 kubectl 到 /usr/local/bin 目錄
sudo mv ./kubectl /usr/local/bin/

# 驗證安裝
kubectl version --client

kubectl 就像是 Kubernetes 的遙控器,讓你輕鬆操控集群中的所有資源,不管是部署應用還是查看狀態,只需一條命令,集群盡在你掌控中!

# for ARM systems, set ARCH to: `arm64`, `armv6` or `armv7`
ARCH=amd64
PLATFORM=$(uname -s)_$ARCH

curl -sLO "https://github.com/eksctl-io/eksctl/releases/latest/download/eksctl_$PLATFORM.tar.gz"

# (Optional) Verify checksum
curl -sL "https://github.com/eksctl-io/eksctl/releases/latest/download/eksctl_checksums.txt" | grep $PLATFORM | sha256sum --check

tar -xzf eksctl_$PLATFORM.tar.gz -C /tmp && rm eksctl_$PLATFORM.tar.gz

sudo install -m 0755 /tmp/eksctl /usr/local/bin && rm /tmp/eksctl

eksctl 是一個命令行工具,用於簡化 Amazon EKS(Elastic Kubernetes Service)集群的創建、管理和配置,讓你像開關燈一樣輕鬆操作 Kubernetes 集群!

到這裡就已經準備好後續我們要建置EKS基礎相關的工具啦~~


上一篇
DAY16 - EKS vs ECS:雙胞胎的差異
下一篇
DAY18 - EKS Cluster:雲端樂園開幕
系列文
AWS 雲原生,學起來比泡咖啡還快20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言