年末年始にかけてKubernetesを少しだけインプットしてました。ローカルで環境を整えるのもしんどいし、現実的な利用も考えにくいので、Amazon EKS上でクラスタを作成して動かしてました。
今回はAWSコンソールからクラスタを作成する方法についてまとめました。
Amazon EKS
Amazon EKSはAWSでKubernetes環境を提供するマネージドサービスです。
https://docs.aws.amazon.com/eks/index.html
KubernetesクラスタがEKSのクラスタと対応しており、クラスタにコントロールプレーンとワーカノードが所属します。
- コントロールプレーンがマネージドサービスとなっており、APIを介して構成管理を行います
- ワーカノードはノードグループという単位でまとめられており、各インスタンスにはDockerやkubeletなどがインストールされたAMIが使われます
これまでクラスタの作成はeksctl1が標準的に使われていましたが、昨年11月のアップデートでワーカノードのプロビジョニングがサポートされました。これによってコンソール画面やAWS CLIからワーカノードを作成できるようになりました。
今回はコンソール画面から、クラスタとノードグループを作成していきます。
クラスタの作成
EKSクラスタのロール
EKSクラスタで構成管理するためのロール test-cluster-role
を作成します。以下のロールをアタッチしてます。
- AmazonEKSClusterPolicy
- AmazonEKSServicePolicy
コンソール画面からEKSクラスタの作成
次にコンソール画面からEKSクラスタ test-cluster
を作成します。
EKS > クラスター を開いて "クラスターを作成" を選択します。
- クラスター名:
test-cluster
- Kubernatesバージョン: 1.14 (2020/1/11現在の最新)
- ロール名:
test-cluster-role
(上で作成済) - VPCとセキュリティグループ: 適当に選択
- API server endpoint access: コントロールプレーンへのアクセスについてです
- Public accessを許可
- Logging: 適当に選択 (ここではAPIサーバーとコントロールマネージャを有効化)
10分くらいすると完了します。
CloudwatchLogsを覗いてみると /aws/eks/test-cluster/cluster
ストリームが作成され、ログが出力されています。
ノードグループの作成
ノードグループインスタンスのロール
ノードグループのインスタンスに紐づくロール test-cluster-t3small-nodegroup-role
を作成します。アタッチするロールは2つです。
- AmazonEKSWorkerNodePolicy
- AmazonEKS_CNI_Policy
- AmazonEC2ContainerRegistryReadOnly
また信頼されたエンティティec2.amazonaws.com
を追加する必要があります。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
コンソール画面からノードグループの作成
EKS > クラスター > test-cluster から "Add node group" でノードグループを作成していきます。
- 名前:
t3small-nodegroup
- ノードIAMロール名:
test-cluster-t3small-nodegroup-role
(上で作成済) - それ以外は適当にセットします
次にインスタンスの構成です。
- AMIタイプ: Amazon Linux 2
- AMIがAmazon Linuxに限定されており、Ubuntuなどはありません...
- (なぜかGPU搭載のAMIは選べます)
- インスタンスタイプ: t3.small
- t3, m5, c5, r5などの標準的なタイプは一通り揃ってます
最後にスケーリングの構成です。
- 最小・最大・希望のサイズ: 3ノード
数分もすると立ち上がります。
オートスケーリンググループが作成され、インスタンスも3台起動しているのが確認できます。
これでクラスタの作成はひと通り完了しました。
kubectlの設定
最後に作成したクラスタへkubectlで接続します。
作業用インスタンスの作成
作業用のEC2インスタンスを作成してSSHで接続します。
このインスタンスにkubectlとAWS CLIをインストールします。
- kubectlのインストールおよびセットアップ - Kubernetes
- https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-install.html
$ kubectl version Client Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.0", GitCommit:"70132b0f130acc0bed193d9ba59dd186f0e634cf", GitTreeState:"clean", BuildDate:"2019-12-07T21:20:10Z", GoVersion:"go1.13.4", Compiler:"gc", Platform:"linux/amd64"} The connection to the server localhost:8080 was refused - did you specify the right host or port? $ aws --version aws-cli/1.16.308 Python/2.7.17 Linux/4.15.0-1057-aws botocore/1.13.44
接続
最後に以下のコマンドでKubernetesの設定ファイル (~/.kube/config
) ファイルを更新して接続できるようにします。
$ aws eks --region ap-northeast-1 update-kubeconfig --name test-cluster Added new context arn:aws:eks:ap-northeast-1:XXXXXXXXXXXX:cluster/test-cluster to /home/ubuntu/.kube/config
ただし、最初はクラスタを作成したユーザだけがkubectlを実行でき、それ以外はエラー (error: You must be logged in to the server (Unauthorized)
) となりますので注意です。
クラスタの削除
削除もコンソール画面で完結できます。
ただし、ノードグループが紐付いているクラスタを削除することができません。ノードグループ -> クラスタの順番で実施する必要があります。
まとめ
コンソール画面からEKSクラスタを作成する方法についてまとめました。
eksctlも1コマンドでクラスタやノードグループなどを作成してくれるので、どちらかというとコンソール画面から作成するほうが手間です。ですが、その分CloudFormationの結果どうなるのかについてはある程度認識しておく必要があり、現状は一長一短かなという手応えです。
参考
- https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/
- https://eksworkshop.com/
- EKSのワークショップ用の資料で、非常によくまとまってます
-
コマンドからCloudFormationのスタックを作成・適用を行うコマンドラインユーティリティです。これによりVPCやサブネット・EKSクラスタ・ノードグループの作成を1コマンドで行うことができます。↩