ECS 很常拿來與 Kubernetes 比較,而 2017 aws 又進一步宣佈了 Amazon Elastic Container Service for Kubernetes(EKS),使 aws 平台可以託管 k8s 服務。EKS 服務可以省去安裝以及操作自己的 Kubernetes 叢集的時間,輕鬆的在 AWS 上執行 Kubernetes;進一步地,可使用 Fargate 模式在 EKS 上,可連 node 機器都不用管理。


Kubernetes Cluster 主要有兩部分:

  • 安排容器調度的 Control Plane
  • 容器運行的機器稱 Worker Node。

Control Plane 裡面涵蓋有儲存狀態的 ETCD、controller manager 、Scheduler、APIServer、cloud-controller-manager(optional)。若是自己創建的 Kubernetes Cluster ,需要自己安裝這些元件,後續仍需要對 Control Plane 進行相關管理、維護、升級工作。但使用了 EKS 服務,這些工作 AWS 會幫忙自動完成。

cloud-controller-manager 僅在雲平台才會有,因此如果你在自己的環境中運行 Kubernetes,所部署的集群內不會有cloud-controller-manager。

kubernetes in cloud

aws 官網上面安裝 EKS 有兩種方式:

透過 eksctl 建立資源,是最快最方便的,但其實很容易忽略掉一些地方,例如權限管理的部份。故也推薦按照官網其他教程,用 cloudformation + aws eks cli 走一遍流程會更有感覺。

接下來就是 kubernetes 放到雲平台後,真正好用和有威力的地方了。我們知道 kubernetes 基本上是以 pod 為單位做控制,然後 schedule 到 node 上面。當 Pod 需要 reschedule 到其他節點時,可能會發生 node 機器不夠的情況,這時雲端提供的機器 Auto Scaling 就展現了威力,可以自動調整 nodes 數量。那 kubernetes 它是怎麼辦到的呢 ?

Cluster Autoscaler

Cluster Autoscaler 是 aws 為 k8s autoscaling 提供的實作。當 Pod 出現故障或 reschedule , Cluster Autoscaler 會自動調整 cluster 中的 node 數量。


cloud-controller-manager

對於每個雲平台,都有自己不同的 Cloud Controller Manager 實作,可讓集群和雲提供商的 API 互動。例如 AWS Load Balancer Controller, 我們可以發現在 EKS 上,設定 k8s Service yaml 的 type 設定為 LoadBalancer 並部屬後,會發現 EKS 很神奇地也創建了 Load Balancer。為什麼會這樣呢 ? 就是因為有 cloud-controller-manager。

將 k8s Service type 設定為 LoadBalancer,會用 Network Load Balancer(NLB),是 L4 of the OSI model,根據 IP + port 做負載均衡。

設定 k8s Ingress 的話,會用Application Load Balancer(ALB),是 L7 of the OSI model,可根據域名、內文做負載均衡,會做 TCP 交握,比較耗時。

簡單介紹了以上功能,EKS 服務在啟動時大致上都幫我們裝好了。


EKS with Fargate

上圖很直接的表示在 Amazon EKS 使用 AWS Fargate 模式與一般 EC2 模式的區別。

在 EKS 中提供了 AWS Fargate Profile。可配置一個設定檔,可讓 Amazonn EKS 中的 Pod 採用 Fargate 技術運行。

  • 僅需設定 CPU 跟 memery
  • 可設定 Scaling 範圍,會自動擴展或減少,擴展速度比 EC2 快
  • 不需要管理 nodes