今更ながら、k8sは使ってるがAmazon EKSはちゃんと使ったことないので気になったポイントまとめ
※2021年1月時点
[1] Amazon EKSとは
- AWSが提供する
マネージドKubernetes
サービス(2018 GA) - Masterにあたるコントロールプレーン(etcd含む)がサーバレス的に提供され、Worker部分は統合されたEC2(NodeGroup)かFargateでクラスタを構成する
- re:Invent 2020にてEKS Anywhereという新サービスが発表され、オンプレミス環境のKubernetesの管理拡張も可能になる予定(GCPのAnthos的な感じ)
- 参考:オンプレ利用想定のディストリビューション EKS Distro:https://github.com/aws/eks-distro
Kubernetesバージョンについて
- 本家アップストリームの最新版はすぐに使えない
- 半年ほど遅れてEKSはサポートしている模様(目安的には1~2世代古い)
- 本家では最新3世代サポートだが、
EKSは最新4世代までサポート
可用性/耐障害性とSLAについて
- リージョン内の 3 つのアベイラビリティーゾーンにまたがって動作する
2つ以上の APIサーバーノードと3つのetcdノード
で構成されている -
99.95%のSLA
が規定されている
価格について
- 基本はクラスタごとに
毎時課金 0.10USD
と、ワーカーノード(EC2 or Fargate)の利用料 - その他暗号化のKMSやCloudWatch、S3、ECR(コンテナレジストリ)利用料など関連サービスを利用した料金
Amazon EKS利用のメリット
- マネージドかつHA構成のコントロールプレーン(etcd含む)が容易に構築できる
- WorkerノードのAuto Scalingが利用できる(PodではなくNodeレベルのCluster Autoscaler)
- 使った分だけの従量課金
- 認証認可をKubernetesのRBACとAWS IAMを統合できる(AWSユーザ向けの利点)
- その他のAWSサービスとの統合(例:KMS、Cloud Watch、EFS、などなど)
[2] クラスタ構築関連
実際にクラスタを作成する際に気になったポイント
※所感としてはGKEより複雑な印象
クラスタ作成手段
- クラスタ作成方法は3種類の方法がある
- ①AWSコンソールからGUIポチポチ
- ②AWS標準CLIツール「aws cli」を利用
- ③公式のEKSクラスタ構築用CLIツール「eksctl」を利用
eksctlとは?
https://eksctl.io/- 標準的なAWSサービスはAWSコンソールかaws cliで操作するが、EKSのk8sクラスタ構築は煩雑なためか、EKS k8sクラスタ作成用のCLIが別途提供されている
- 普通にコンソールからEKS k8sクラスタを作成する場合、Master要素(コントロールプレーン)の他にもVPC/Subnet/SGやIAM、Workerノードの作成など多くの操作手順が必要だが、eksctlはコマンド1つでそれらを自動的に生成し、クラスタ構築してくれる
- もともとWeaveworks社がGo言語ベースで開発し、OSSとして公開されている
- 裏でCloud Formationが連携していて、各種必要なAWSリソース生成を行っている
- GCP GKEでいうとgcloudコマンド相当
eksctlインストール
$ curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
$ sudo mv /tmp/eksctl /usr/local/bin
eksctlでEKS k8sクラスタ作成
- 極論でいえば、
eksctl create cluster
コマンドだけで作成できる - 実際は色々なオプションを付ける
-
eksctl create cluster --help
でオプションは参照可能
クラスタ作成例)
eksctl create cluster \
--name=test-cluster \ #クラスタ名
--region=ap-northeast-1 \ #リージョン
--version=1.18 \ #バージョン
--node-type=t3.medium \ #Workerインスタンスタイプ
--nodes=2 \ #Workerノード数
--nodes-min=2 \ #Workerオートスケール最小
--nodes-max=2 \ #Workerオートスケール最大
--node-volume-size=20 #Workerディスクサイズ
※参考:2020/12にリリースされたAWS CloudShellから、kubectlとeksctlをセットアップすればクラスタ作成(CLIコマンド実行)がすぐに試せます
https://aws.amazon.com/jp/blogs/news/aws-cloudshell-command-line-access-to-aws-resources/
- eksctlで上記コマンドで自動生成された主なAWSリソース
- Cloud Formationスタック(KSクラスタとWorker(NodeGroup)の2つ)
- EKSクラスタ
- VPC
- サブネット
- SG
- InternetGWとNAT-GW
- IAM ROLE
- EC2(NodeGroup)
- etc.
eksctlでEKS k8sクラスタ削除
eksctl delete cluster --name クラスタ名
Kubernetesバージョン
- k8sバージョンは2021/1時点でアップストリーム最新版は1.20だが、EKSでは1.18
アーキテクチャ
- 基本的に①パブリック、②プライベート、③パブリック&プライベート の3パターンがある
- Master(コントロールプレーン)~Worker間は、サブネット内のENIを経由する(ENIは自動生成される)
- Master(コントロールプレーン)のAPIエンドポイントは、パブリックかプライベートか選択できる
- 下記は標準的なパブリック&プライベートの例
https://aws.amazon.com/jp/blogs/news/de-mystifying-cluster-networking-for-amazon-eks-worker-nodes/
-
VPC
- クラスタ全体では基本2つ
-
- Master/コントロールプレーンは「Amazon EKS管理VPC」と呼ばれるユーザが意識しない領域に作成される(サーバーレス)
-
- Workerノードは指定したVPCに作成できる
-
- クラスタ全体では基本2つ
-
サブネット
- Workerノード用に2つ以上のアベイラビリティーゾーンでサブネット作成が必要
- パターンは3つ
- パブリックのみ
- プライベートのみ
- パブリックとプライベートの併用(上の図)
-
SG
- 基本的に2つ
- 各Workerノード用
- Workerノードが存在するVPCサブネット内から、EKSコントロールプレーンへアクセスするためのENIに設定されるSG(eks-cluster-sg-XXXという名前でEKSが自動作成)
- https://docs.aws.amazon.com/eks/latest/userguide/sec-group-reqs.html
- 基本的に2つ
-
IAM ROLE
- MASTER(コントロールプレーン)用とWorker(Node Group)用の2つ
- https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/using-service-linked-roles.html
CNIプラグイン
- 基本はAWS提供のamazon-vpc-cni-k8s
- FlannelやCalicoをセットアップすることもできる模様
ワーカーノードのイメージ
- EC2 起動テンプレートが利用でき、ベースイメージ(AMI)やインスタンスタイプなどを規定できる
コンテナイメージの利用
-
ECRを利用する場合は、ワーカーノードのIAM ROLEにECR利用のための以下の権限を付与しておく必要あり
- "ecr:BatchCheckLayerAvailability"
- "ecr:BatchGetImage"
- "ecr:GetDownloadUrlForLayer"
- "ecr:GetAuthorizationToken"
[3] クラスタ接続設定
###1. kubectlインストール
例)
curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.18.9/2020-11-02/bin/linux/amd64/kubectl
chmod +x ./kubectl
mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$PATH:$HOME/bin
echo 'export PATH=$PATH:$HOME/bin' >> ~/.bash_profile
###2. kubeconfigファイルの更新
例)
aws eks --region リージョン update-kubeconfig --name クラスタ名
[4] おまけ
モニタリング
EKSコンソール上からのワークロードのモニタリングができる