Amazon Web Services ブログ

kopsを使ってKubernetesクラスタをAWS上で構成

この記事では、KubernetesクラスタをAWS上で構成し運用するツールの1つであるkopsを利用すると、簡単にKubernetesを始められることをご紹介します。なお最新情報は、GitHubで公開しているAWS Workshop for Kubernetesをご覧頂き、さらに構築したクラスタを使って様々なワークショップをご自身の手で試して頂くことをお勧めします。

kopsについて

Kubernetesのトップレベルプロジェクトで、Kubernetesのクラスタを構成し運用するためのツールです。また、クラスタのローリングアップデートや、アドオンもサポートしています。必要に応じて、AWS CloudFormationやTerraformのテンプレートを出力することもできるので、それを基準にカスタムして行くということも可能です。

kopsをインストール

kopsは2017年12月26日時点では、macOS、Linux、Windows 10 Linux Subsystemで利用可能です。この記事ではmacOSを利用していきます。Homebrewが対応しているので以下のコマンドでインストールするのが最も簡単です:

$ brew update && brew install kops

SSH鍵の生成

kopsはクラスタ作成の際にSSHの公開鍵を利用します。デフォルトの配置場所は~/.ssh/id_rsa.pubとなります。ssh-keygenコマンドを利用して作成しておきます。

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (~/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in ~/.ssh/id_rsa
Your public key has been saved in ~/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:bQXH2zAAcFVtpEwcOL5D1QZnXp3zkiC123456789
The key's randomart image is:
+---[RSA 2048]----+
|      ..oo=B**+ +|
|       . o+=B*=+.|
|        +..+*O+E=|
|       . =o=.o=oo|
|        S.*..  o |
|         oo      |
|           .     |
|                 |
|                 |
+----[SHA256]-----+

AWS CLIとIAM権限の設定

もしAWS CLIがインストールされていなければインストールしておきます:

$ pip install -U awscli
or
$ brew install awscli

ローカル環境にIAMの権限が設定されていて、以下のポリシーを持っていることを確認します:

AmazonEC2FullAccess
AmazonRoute53FullAccess
AmazonS3FullAccess
IAMFullAccess
AmazonVPCFullAccess

kops用のS3バケットの作成

kopsはクラスタの設定情報を保管するためのステートストアを必要とします。例えば、いくつのノードがクラスタにあって、インスタンスタイプは何で、Kubernetesのバージョンは何か等の情報を保存します。これらの状態はクラスタ作成時に保存されます。その後のクラスタの操作でも情報が更新されていきます。Amazon S3がAWSクラウド上でクラスタを実行する際にはお勧めです。以下の様にしてS3バケットを作成し、それをkops CLIに渡していきます。1つのステートストアで複数のkopsクラスタを持つことができます。

# バケット名をランダムに生成し、ステートストアとして設定する
$ export S3_BUCKET=example-state-store-$(cat /dev/random | LC_ALL=C tr -dc "[:alpha:]" | tr '[:upper:]' '[:lower:]' | head -c 32)
$ export KOPS_STATE_STORE=s3://${S3_BUCKET}

# AWS CLIを使ってS3バケットを作成する
$ aws s3 mb $KOPS_STATE_STORE

# バージョニングを有効にする
$ aws s3api put-bucket-versioning \
  --bucket $S3_BUCKET \
  --versioning-configuration \
  Status=Enabled

クラスタを作成する

kops CLIでクラスタを作成すると、その裏では以下のようなタスクが実行されます:

  • EC2インスタンスのプロビジョン
  • VPC、Auto Scaling Group、IAMロール、Security Group等のAWSリソースの作成と設定
  • Kubrernetesのインストール
  • (もし必要であれば) Route 53のDNSの設定

クラスタを作成する時に、クラスタ内のノード間通信をどのように実現するかで2つの選択肢があります:

  1. ゴシッププロトコルを利用 – kopsではゴシップベースのクラスタをサポートしています。Route 53への登録は必要なく、裏側ではWeave Meshを利用しています。ゴシップベースクラスタは簡単に素早くセットアップできるので、このワークショップではお勧めです。
  2. DNSを利用 – DNSのノードのディスカバリに利用する場合、自身で所有するドメイン(又はサブドメイン)が必要で、Route 53を設定する必要があります。これにより、複数のKubernetesのコンポーネントがDNS解決でお互いに通信したり、kubectlが直接マスターと通信することができます。

この記事では、ゴシップベースクラスタを作成してみますが、DNSベースクラスタでも同様にワークショップを実行することができます。

kopsを使ってゴシップベースクラスタを作成する

ゴシッププロトコルでクラスタを作成するには、クラスタ名のサフィックスに.k8s.localを使います。この記事ではexample.cluster.k8s.localをゴシップクラスタの名前として利用しますが、.k8s.localで終わる異なる名前を利用することもできます。

デフォルトのゴシップベースクラスタ

デフォルトでは、create clusterコマンドは、シングルマスターと2つのワーカーノードを指定したAbailability Zoneに作成します。例として東京リージョンの2つのAZを指定しています:

$ kops create cluster \
  --name example.cluster.k8s.local \
  --zones ap-northeast-1a,ap-northeast-1c \
  --yes

もし、--yesフラグを付けない場合には、S3バケットにクラスタの設定のみを保存します。その後、kops edit cluster example.cluster.k8s.localコマンドで状態を確認し編集することもできます。それから実際にクラスタを作成する際には、以下のコマンドを実行します:

$ kops update cluster example.cluster.k8s.local --yes

kops create clusterが実行されると、EC2インスタンスのプロビジョン、Auto Scaling GroupやIAMロールやSecurity Groupの作成、各ノードへのKubernetesのインストール、マスターとワーカーノードの設定が行われます。ノードの数によっていくらかの時間がかかります。

5-8分程度待つと、以下の様にクラスタの確認ができます:

$ kops validate cluster
Using cluster from kubectl context: example.cluster.k8s.local

Validating cluster example.cluster.k8s.local

INSTANCE GROUPS
NAME ROLE MACHINETYPE MIN MAX SUBNETS
master-ap-northeast-1a Master m3.medium 1 1 ap-northeast-1a
nodes Node t2.medium 2 2 ap-northeast-1a,ap-northeast-1c

NODE STATUS
NAME ROLE READY
ip-172-20-34-132.ap-northeast-1.compute.internal master True
ip-172-20-60-109.ap-northeast-1.compute.internal node True
ip-172-20-87-42.ap-northeast-1.compute.internal node True

Your cluster example.cluster.k8s.local is ready

kubectl get nodeでも状態が確認できるようになります:

$ kubectl get node
NAME                                               STATUS    AGE       VERSION
ip-172-20-34-132.ap-northeast-1.compute.internal   Ready     2m        v1.8.4
ip-172-20-60-109.ap-northeast-1.compute.internal   Ready     1m        v1.8.4
ip-172-20-87-42.ap-northeast-1.compute.internal    Ready     1m        v1.8.4

ここから先は、kubectlで自由に操作可能です。Kubernetes自身も初めてという方は、Kubernetes – First Steps with the Kubernetes CLIのワークショップから初めて見ると良いと思います。

ネットワーク構成について

Kubenretesではコンテナのネットワーク構成に幾つかの制約があり、それを満たすために各種実装が存在します。2017年12月26日時点でkopsをデフォルトで起動した場合にはkubenetという方式で構成します。こちらの構成の場合、VPCのルートテーブルの上限によって1クラスタ内のノードの数が最大50に制限されます

kopsではオプションとして他にも様々なネットワークをサポートしており、先日mergeされたものとしてamazon-vpc-routed-eniがあります。こちらは、AWSが開発してGitHubにて公開しているCNI pluginを利用するオプションで、VPCの機能であるSecondary IPアドレスを利用してネットワーク構成を行うものになります。(注: 本記事公開時点でkopsから利用する場合は自身でkopsの最新版をビルドする必要があります) CNI pluginに興味のある方は、AWS re:Invent 2017のCON409 Amazon Elastic Container Service for Kubernetes Deep Diveをご覧頂くと良いと思います。

クラスタを削除する

最後に、クラスタの削除方法を紹介します。以下のコマンドで削除できます:

$ kops delete cluster \
  example.cluster.k8s.local \
  --yes

--yesフラグを省略すると、削除対象のリソースが一覧で表示されるので、確認した後に--yesを付けて実行することもできます。

ステートストア用のS3バケットを削除したければ、以下のコマンドを実行します:

$ aws s3 rb $KOPS_STATE_STORE

まとめ

この記事では、kopsを使って簡単にAWS上にKubernetesクラスタを構築できることをご紹介しました。今回は紹介していませんが、kopsではマルチマスター構成はもちろん、多種多様な設定やオペレーションにも対応しています。その他にもKubernetesをAWS上で構成可能なツールはあり、興味のある方はこちらをご覧下さい。また、kopsを使ったワークショップであるAWS Workshop for Kubernetesにはコンテンツが沢山ありますので、次のステップとしてぜひ試してみて下さい。

最後に、AWS re:Invent 2017においてAmazon Elastic Container Service for Kubernetes (Amazon EKS)のプレビューを発表しております。EKSを始め、Kubernetesやコンテナ周辺へのオープンソースとAWSの関わりについては、KubeCon + CloudNativeCon North America 2017のKeynoteでのAdrian Cockcroftの発表をご覧下さい。

SA岩永