Amazon EKSでコンソール画面からKubernetesクラスタを作成する

年末年始にかけて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サーバーとコントロールマネージャを有効化)

f:id:ohke:20200111130347p:plain

f:id:ohke:20200111130549p:plain

f:id:ohke:20200111130707p:plain

10分くらいすると完了します。

f:id:ohke:20200111132038p:plain

CloudwatchLogsを覗いてみると /aws/eks/test-cluster/clusterストリームが作成され、ログが出力されています。

f:id:ohke:20200111132313p:plain

ノードグループの作成

ノードグループインスタンスのロール

ノードグループのインスタンスに紐づくロール 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 (上で作成済)
  • それ以外は適当にセットします

f:id:ohke:20200111135121p:plain

次にインスタンスの構成です。

  • AMIタイプ: Amazon Linux 2
    • AMIがAmazon Linuxに限定されており、Ubuntuなどはありません...
    • (なぜかGPU搭載のAMIは選べます)
  • インスタンスタイプ: t3.small
    • t3, m5, c5, r5などの標準的なタイプは一通り揃ってます

f:id:ohke:20200111134542p:plain

最後にスケーリングの構成です。

  • 最小・最大・希望のサイズ: 3ノード

f:id:ohke:20200111135242p:plain

数分もすると立ち上がります。

f:id:ohke:20200111135605p:plain

オートスケーリンググループが作成され、インスタンスも3台起動しているのが確認できます。

f:id:ohke:20200111140145p:plain

これでクラスタの作成はひと通り完了しました。

kubectlの設定

最後に作成したクラスタへkubectlで接続します。

作業用インスタンスの作成

作業用のEC2インスタンスを作成してSSHで接続します。

このインスタンスにkubectlとAWS CLIをインストールします。

$ 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の結果どうなるのかについてはある程度認識しておく必要があり、現状は一長一短かなという手応えです。

参考


  1. コマンドからCloudFormationのスタックを作成・適用を行うコマンドラインユーティリティです。これによりVPCやサブネット・EKSクラスタ・ノードグループの作成を1コマンドで行うことができます。