最近談了這麼多的 ECS 來換換口味來個 Amazon Elastic Kubernetes Service 吧!通常我們簡稱它為 Amazon EKS 或是 AWS EKS 後面我們會直接使用 AWS EKS 稱呼它
AWS EKS
發布時間
在一開始我們先來簡單介紹一下 AWS EKS 這個服務,它在 2017/11/29 發布預覽版,還記得那個時候剛發布就去申請了 preview,初期版本滿簡單的而且不能外掛任何的模組
經過了半年多在 2018/06/05 發布了正式版
在一年後 2019/06/03 開始支援 AWS Fargate
在 2020/03/10 也開始更新到 1.15 版
而在 2020/04/30 更新到 Kubernetes 1.16 版
價格
在 2020/01/21 之前的價格是每小時 0.20 USD 發布訊息後由原本的 0.20 USD 降至每小時 0.10 USD 價格降低了 50%,其實這個價格說貴不貴說便宜也不便宜因為自己起一台 AWS c5.large 也需要 0.10 USD 而且還需要自己顧這台 EC2
使用 CDK 建立 AWS EKS
簡單介紹了 AWS EKS 的歷史那我們就來使用 AWS CDK 建立 AWS EKS 吧!
AWS EKS 架構
在說明之前我們先來看一下我們今天要完成的目標架構圖,今天要完成的地方是紅色框框裡面的部分,有 Amazon EKS 本身跟 Kubernetes Cluster 讓它跑在 EC2 上面
出處 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
也可以在 EC2 看到唯一的一台 EC2 機器
-
Details
- EKS 的 Details 裡面有 API server endpoint 與其他詳細的 EKS 資料
- EKS 的 Details 裡面有 API server endpoint 與其他詳細的 EKS 資料
-
Compute
- 如下可以看到 EKS 的 Compute
- 如下可以看到 EKS 的 Compute
-
Networking
- 另外還有 Networking 裡面有 4 個 Subnets
- 另外還有 Networking 裡面有 4 個 Subnets
-
Logging
- 目前我們沒有開啟 EKS 的 Logging 所以裡面都是 Disable 的
- 目前我們沒有開啟 EKS 的 Logging 所以裡面都是 Disable 的
-
Update history
-
Tags
參考資料
- https://aws.amazon.com/tw/eks/
今天介紹 EKS 叢集如果熟悉 K8S 的朋友其實只需要如此就可以開始用一般的方法使用拉!
《AWS CDK 完全學習手冊:打造雲端基礎架構程式碼 IaC》
第 12 屆 iT 邦幫忙鐵人賽 DevOps 組冠的《用 CDK 定 義 AWS 架構》
第 11 屆 iT 邦幫忙鐵人賽《LINE bot 好好玩 30 天玩轉 LINE API》
一個熱愛分享的雲端工程師!