Day 25 – CDK 建置 Amazon Elastic Kubernetes Service(EKS)- Cluster

2020 12th 鐵人賽

最近談了這麼多的 ECS 來換換口味來個 Amazon Elastic Kubernetes Service 吧!通常我們簡稱它為 Amazon EKS 或是 AWS EKS 後面我們會直接使用 AWS EKS 稱呼它

https://i2.wp.com/ithelp.ithome.com.tw/upload/images/20201012/201177017ZDM9OEOb9.png?w=640&ssl=1

AWS EKS

發布時間

在一開始我們先來簡單介紹一下 AWS EKS 這個服務,它在 2017/11/29 發布預覽版,還記得那個時候剛發布就去申請了 preview,初期版本滿簡單的而且不能外掛任何的模組

Amazon Elastic Container Service for Kubernetes 簡介 (預覽)

經過了半年多在 2018/06/05 發布了正式版

Amazon Elastic Container Service for Kubernetes 現在普遍可用

在一年後 2019/06/03 開始支援 AWS Fargate

使用 Amazon EKS 和 AWS Fargate 執行無伺服器 Kubernetes Pod

在 2020/03/10 也開始更新到 1.15 版

Amazon EKS 現在支援Kubernetes 1.15 版 – AWS

而在 2020/04/30 更新到 Kubernetes 1.16 版

Amazon EKS 現在支援 Kubernetes 1.16 版

價格

在 2020/01/21 之前的價格是每小時 0.20 USD 發布訊息後由原本的 0.20 USD 降至每小時 0.10 USD 價格降低了 50%,其實這個價格說貴不貴說便宜也不便宜因為自己起一台 AWS c5.large 也需要 0.10 USD 而且還需要自己顧這台 EC2

Amazon EKS 宣佈價格降低 50%

使用 CDK 建立 AWS EKS

簡單介紹了 AWS EKS 的歷史那我們就來使用 AWS CDK 建立 AWS EKS 吧!

AWS EKS 架構

在說明之前我們先來看一下我們今天要完成的目標架構圖,今天要完成的地方是紅色框框裡面的部分,有 Amazon EKS 本身跟 Kubernetes Cluster 讓它跑在 EC2 上面

https://i0.wp.com/ithelp.ithome.com.tw/upload/images/20201009/20117701S4aWHPvxdf.jpg?w=640&ssl=1

出處 AWS re:Invent 2019: [REPEAT 1] Amazon EKS under the hood (CON421-R1) PPT YouTube

CDK 程式

其實要使用 CDK 建立一個 EKS 非常的簡單只要一行就可以把整個非常龐大的 K8S 啟動

const cluster = new eks.Cluster(this, "eks", {
  version: eks.KubernetesVersion.V1_17,
});

如此配置會在後面創建一個新的 VPC 與兩台 m5.large 的機器

https://docs.aws.amazon.com/cdk/api/latest/docs/aws-eks-readme.html#managed-node-groups

https://docs.aws.amazon.com/cdk/api/latest/docs/aws-eks-readme.html#masters-role

EKS 建立 master role

如此配置 EKS 沒有辦法訪問,所以我們建立一個 Role 它會把 IAM 與 system:masters 進行一個綁定,來修改一下程式

const mastersRole = new iam.Role(this, "mastersRole", {
  assumedBy: new iam.AccountRootPrincipal(),
});

const cluster = new eks.Cluster(this, "eks", {
  version: eks.KubernetesVersion.V1_17,
  mastersRole,
});

修改 spot cluster

我在測試比較喜歡用 spot 的機器畢竟 spot 的機器比較便宜,所以我在這邊先做一些修改加入 spot 的設定,如果之前有看我的 ECS 介紹就會覺得這邊很熟悉我們只要跟 auto scaling group 說明 spot 的 price 就會幫我們啟動一個 spot 的 cluster 了!

這邊要注意原本的 cluster 也會啟動機器所以要把 defaultCapacity 設定為 0 不然會跑出三台呦!

const cluster = new eks.Cluster(this, "eks", {
  version: eks.KubernetesVersion.V1_17,
  defaultCapacity: 0,
  mastersRole,
});
    
cluster.addAutoScalingGroupCapacity("spot", {
  spotPrice: "0.1094",
  instanceType: new ec2.InstanceType("t3.large"),
});

部署測試

而因為整個架構比較複雜這邊的部署要先有心理準備,大概需要 15 分鐘到 30 分鐘的時間

部署完成後 CDK 很貼心的準備好要怎麼登入 EKS 的指令直接服用就可以了!

Outputs:
CdkEksStack.eksConfigCommandDB09280A = aws eks update-kubeconfig --name eksB49B8EA3-7fcd6a64ed934f00ae43ec1cb67a87fa --region us-west-2 --role-arn arn:aws:iam::888888888888:role/CdkEksStack-mastersRole634808EE-1I504Q4EPLS70
CdkEksStack.eksGetTokenCommand8952195F = aws eks get-token --cluster-name eksB49B8EA3-7fcd6a64ed934f00ae43ec1cb67a87fa --region us-west-2 --role-arn arn:aws:iam::888888888888:role/CdkEksStack-mastersRole634808EE-1I504Q4EPLS70

設定 kubeconfig

$ aws eks update-kubeconfig --name eksB49B8EA3-7fcd6a64ed934f00ae43ec1cb67a87fa --region us-west-2 --role-arn arn:aws:iam::888888888888:role/CdkEksStack-mastersRole634808EE-1I504Q4EPLS70
Added new context arn:aws:eks:us-west-2:888888888888:cluster/eksB49B8EA3-7fcd6a64ed934f00ae43ec1cb67a87fa to /Users/clarence/.kube/config

使用 kubectl

如此執行完我們就可以使用 kubectl 指令拉!執行 get node 可以看到我們有一台機器受 EKS 管理

$ kubectl get node
NAME                                        STATUS   ROLES    AGE   VERSION
ip-10-0-255-11.us-west-2.compute.internal   Ready    <none>   14m   v1.17.11-eks-cfdc40

AWS EKS Console

我們先到 AWS Console 看看 Clusters 出現了我剛剛創建的 EKS Cluster https://i0.wp.com/ithelp.ithome.com.tw/upload/images/20201009/20117701EYE20zxyvF.png?w=640&ssl=1

也可以在 EC2 看到唯一的一台 EC2 機器 https://i1.wp.com/ithelp.ithome.com.tw/upload/images/20201009/201177014Bf5hGYho1.png?w=640&ssl=1

  • Details

    • EKS 的 Details 裡面有 API server endpoint 與其他詳細的 EKS 資料 https://i1.wp.com/ithelp.ithome.com.tw/upload/images/20201009/20117701HaHczZwh8e.png?w=640&ssl=1
  • Compute

    • 如下可以看到 EKS 的 Compute https://i1.wp.com/ithelp.ithome.com.tw/upload/images/20201009/20117701YbUQBw8eDy.png?w=640&ssl=1
  • Networking

    • 另外還有 Networking 裡面有 4 個 Subnets https://i1.wp.com/ithelp.ithome.com.tw/upload/images/20201009/20117701MzEUEhaKfz.png?w=640&ssl=1
  • Logging

    • 目前我們沒有開啟 EKS 的 Logging 所以裡面都是 Disable 的 https://i0.wp.com/ithelp.ithome.com.tw/upload/images/20201009/20117701HKlRaR35D4.png?w=640&ssl=1
  • Update history https://i2.wp.com/ithelp.ithome.com.tw/upload/images/20201009/20117701CFiUNdgNNk.png?w=640&ssl=1

  • Tags https://i0.wp.com/ithelp.ithome.com.tw/upload/images/20201009/20117701ryjOfB1h35.png?w=640&ssl=1

參考資料

  • https://aws.amazon.com/tw/eks/

今天介紹 EKS 叢集如果熟悉 K8S 的朋友其實只需要如此就可以開始用一般的方法使用拉!