透過Kops工具在AWS中部署K8S集群

這篇文章主要是講述如何在AWS雲服務中部署Kubernetes集群

首先,我們需要準備使用一下工具進行設置

  • KOps - 一個能讓我們輕鬆無痛部署Kubernetes到任何雲服務的工具,可以想象為集群的kubectl
  • AWS IAM - 申請一個能讓Kops存取權限的賬號
  • AWS S3 Bucket - 用來作為存取Kubernets資料的資料庫
  • AWS Route53 - 用於使用自定義Domain Name 並連接到Master Node中
  • GoDady - 作為DNS 服務供應商

前置工作

在電腦中安裝KOps工具用於幫助我們部署集群

想要了解更多關於KOps的讀者,可以參閱 kOps-Kubernetes Operations

安裝: Linux

curl -Lo kops https://github.com/kubernetes/kops/releases/download/$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut -d '"' -f 4)/kops-linux-amd64
chmod +x kops
sudo mv kops /usr/local/bin/kops

Macos

curl -Lo kops https://github.com/kubernetes/kops/releases/download/$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut -d '"' -f 4)/kops-darwin-amd64
chmod +x kops
sudo mv kops /usr/local/bin/kops

或者使用 Homebrew 安裝

brew update && brew install kops

Window

  1. KOps的github 中的Release中下載kops-windows-amd64
  2. 重新命名為kOps,並設置為環境變數
安裝AWS Cli

到AWS 的官方網站中直接下載安裝即可 AWS CLI

設置IAM 賬號用於kOps 存取 AWS資源

如果還沒有AWS 賬號,可以先去申請一個再完成下面的步驟

透過UI設置

  1. 搜尋IAM,在Access management中選擇Users。 如下圖所示 IAM-USERS

  2. 新增用戶Add users,輸入使用者賬號並選擇Access key - Programmatic access。如下圖所示 IAM-ADD-USERS1

3.選擇Attact existing policies directly並選擇以下的Policies

  • AmazonEC2FullAccess
  • AmazonRoute53FullAccess
  • AmazonS3FullAccess
  • IAMFullAccess
  • AmazonVPCFullAccess
  • AmazonSQSFullAccess
  • AmazonEventBridgeFullAccess
  1. 新增使用者 IAM-ADD-USERS1

  2. 記錄Access key IDSecret access key IAM-ADD-USERS1

  3. 打開Terminal設置AWS Cli的Configure中的存取賬號(KOps 會使用這組Token操作AWS)

aws configure

AWS Cli

  1. 輸入剛才申請賬號的Access key ID(因我已經設置過了,就不重複設置了)
  2. 輸入剛才申請賬號的Secret access key(因我已經設置過了,就不重複設置了)
  3. Default region name 可以不輸入,使用DEFAULT即可
  4. Default output format 可以不輸入 ,使用DEFAULT即可

透過AWS Cli 設置

aws iam create-group --group-name kops

aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonEC2FullAccess --group-name kops
aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonRoute53FullAccess --group-name kops
aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess --group-name kops
aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/IAMFullAccess --group-name kops
aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonVPCFullAccess --group-name kops
aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonSQSFullAccess --group-name kops
aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonEventBridgeFullAccess --group-name kops

aws iam create-user --user-name kops

aws iam add-user-to-group --user-name kops --group-name kops

aws iam create-access-key --user-name kops

記得要設置AWS

使用AWS Route53 設置DNS

故博主已在GoDady購買Domain Name - 所以以projectdomaindns.com
透過UI建立aws route53

  1. 搜尋Route53

  2. 新增Domain Name - 注意:Domain Name 必須要跟註冊的一樣! AWS Route53

  3. 進入到建立好的Host,將裡面的Name Server(NS)到DNS 服務商中設定(以GoDady為例) route53-DNS

    Godady DNS設置跟Route53 NS一樣

godadydns

透過Terminal建立 aws route53
注意:Domain Name 必須要跟註冊的一樣!

ID=$(uuidgen) && aws route53 create-hosted-zone --name projectdomaindns.com --caller-reference $ID | jq .DelegationSet.NameServers

設置完畢後,會回傳一組NS,到DNS 供應商中設置為這組NS即可

使用AWS S3 用於保存Cluster資料

博主設置的地區是新加坡 - Asia Pacific (Singapore) ap-southeast-1 透過UI建立aws s3

  1. 搜尋aws S3
  2. 建立Bucket - Bucket名字必須是唯一的

要注意的是Region以及Block Public Access settings for this bucket

  • Region 要記得你設置的區域,建議跟部署集群地區一致~
  • Block Public Access 設置為public~

透過Terminal建立 aws s3


aws s3api create-bucket --bucket k8s-example \
--region  ap-southeast-1 \
--create-bucket-configuration LocationConstraint=ap-southeast-1 

–create-bucket-configuration LocationConstraint=ap-southeast-1 這個設定對於us-east-1地區以外的都必須要加上,不然會出錯


以上都為準備階段,所要完成的工作,接下來就是重頭戲了

透過kOps新增Cluster - 還沒正在開始建立(設定而已啦~)

先建立SSH-key - 之後登入到Cluster會用到這組key

ssh-keygen -f .ssh/id_rsa

kops create cluster \
    --name=projectdomain.com \
    --cloud=aws \
    --zones= ap-southeast-1a\
    --state=s3://k8s-example
    --master-size=t2.micro
    --node-size=t2.micro
    --node-count=
    --dns-zone=projectdomain.com
  • name - K8S集群的名字
  • cloud - 雲服務商
  • zones - Nodes要部署的地區,而博主的設置的地區是ap-southeast-1,該對應的地區Code就是ap-southeast-1a
  • master-size - master node的機器類型(可參考AWS)
  • node-size - 一般node的機器的類型(可以參考AWS)
  • node-count - 一般node的數量
  • state - 存放S3的Bucket

以上指令運行完後的結果如下:
kops-create

如果設置完,需要修改可以使用 kops edit

建立Cluster

如果設定都沒有問題,就可以開始建立咯~ (有點久就是了 哈哈哈哈哈) 複製Finally configure your cluster with:後面的指令,加上--state=${s3 bucket url}

kops update cluster --name projectdomaindns.com --yes --admin --state=s3://k8s-bucket-demo

然後就是漫長的等待…… 5 - 20分鐘左右. 可以透過一下指令檢查是否完成部署,使用--wait 10m 10分鐘內會不斷的檢測~

 kops validate cluster --wait 10m --state=${S3} 

完成部署後,會顯示ready的狀態
ready-state

透過kubectl get nodes也可以看到3個nodes,他們的Name就會是AWS EC2主機的名字咯~ get-nodes

如果我們會看一下AWS上面的狀態,會發現EC2多了3台運行中的機器 ec2

Route53以及S3中也會有新的資料哦~ Route53

如果讀書讀者的話,會發現api.projectdomaindns.com所導向的IP正是Master Node的public IP! 也就是說我們可以透過這個url直接存取Master Node

AWS S3中也多出了Cluster的資料呢~ S3

使用Cluster

現在我們嘗試一下部署簡單的應用到這集群上看看能不能成功運行!

如果讀者還沒有學過K8S基礎,建議去K8S官網玩玩看教學!

這是我準備的簡單WebServer 應用,裡面只包含了一個API,透過/ping,server會回傳pong

// deploy.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-deploy
spec:
  selector:
    matchLabels:
      app: web-server
  replicas: 3
  template:
    metadata:
      name: web-server-pod
      labels:
        app: web-server
    spec:
       containers:
        - name: api-server
          image: jacksontmm/demo-server:v1
          ports:
           - containerPort: 8080   ~                                        

上面這份config簡單來說就是會有3個一模一樣的pod,但是IP不同

建立Deployment物件

kubectl create -f deploy.yaml

透過kubectl get pods指令會發現有3個pod正在運行 pods

透過kubectl get deploy指令會發現有一個deployment,也就是我們剛才所建立的deployment 物件 pods

我們是沒有辦法直接存取Cluster內部的Pod的,所以必須先透過Service 物件來幫助我們,將他們expose出來,才能存取

以下指令會將我們Deployment物件的8080,透過與service expose出去

kubectl expose deploy demo-deploy --name=deploy-svc --type=NodePort --port=8080

執行kubectl get service會發現多了一個serviceNamedeploy-svc,也就是我們剛才所建立的! svc

現在我們只需要透過expose 的port,port:31176,就可以存取了!

注意:要先去將Master node(EC2)的31176 port 對外開放哦~ 不然會進不去 哈哈哈 - 設置secret group 的inbound 即可

打開瀏覽器輸入http://13.212.80.234:31176/ping,就會看到pong回傳回來!

13.212.80.234為Master node 的public ip

response

太棒了!恭喜我們成功上雲٩(˃̶͈̀௰˂̶͈́)و

如果想要刪除cluster的話,使用以下指令就可以把所有東西移除掉了唷(EC2,S3)!

kops delete cluster --name=${cluster name}--state=s3://${s3 name} --yes

參考資料