Edited at

Kubernetes の学習 (1) ~ AWS上でのクラスタ構築

More than 3 years have passed since last update.


概要

Kubernetes の学習をするためにまずは実環境がほしかったので、AWS EC2 上に Kubernetes のクラスターを構築してみた。今回は作業用のEC2 インスタンスを作成して、そこから Kubernetes のセットアップスクリプトを実行して、クラスターを構築した。


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

Kubernetes のクラスターを構築するための作業用インスタンスを作成する。


IAM Role の作成

作業用インスタンスに割り当てる Role を作成する。Kubernetes の セットアップスクリプトは、自動で EC2インスタンス、VPC、S3バケットなどを作成するため、事前に Role を割り当てておく必要がある。

面倒であればフルアクセス権を持つ Role を作ればいいが、最低限以下のように EC2, S3, IAM へのアクセス権を持つ Role を作成すればいい。

{

"Version": "2012-10-17",
"Statement": [
{
"Action": "ec2:*",
"Effect": "Allow",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "elasticloadbalancing:*",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "autoscaling:*",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "iam:*",
"Resource": "*"
}
]
}

iam_role.PNG


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

EC2インスタンスを作成。 作成時に、上の手順で作成した Role を IAM Role として指定する。

assign_role.PNG

起動後、作業用インスタンスにSSHで接続する。


クラスターセットアップ


環境変数の設定

基本的には作業用インスタンスから https://get.k8s.io のセットアップスクリプトを実行するだけなのだが、このスクリプトが様々なリソースを作るため、AZ名やS3のバケット名などを環境変数で設定しておく。

# クラウドプロバイダー名の指定(aws)。 このスクリプトは、AWS だけでなく、

# Google Cloud Engine(gce) や Microsoft Azure(azure)にも対応しているため、
# この変数の指定は必要。
export KUBERNETES_PROVIDER=aws

# 使用するAZの名前。デフォルトは us-west-2a になっているため、必要に応じて変更。
# なお、使用するリージョンは、このAZ名から判断される。
export KUBE_AWS_ZONE=ap-northeast-1a

# Master と Minon のインスタンスサイズ。デフォルトで t2.micro にはなっているが
# 念のため設定。
export MASTER_SIZE=t2.micro
export MINION_SIZE=t2.micro

# Minion の台数(作成するインスタンス数)。デフォルトで4台なので、2台にしておいた。
export NUM_MINIONS=2

# S3 のバケット名。すでに存在しればそれが使われ、存在しなければ作成される。
# なお、この環境変数を指定しなくても、名前を自動生成してバットを作成してくれる。
export AWS_S3_BUCKET=arturias-kube

# S3 のリージョン。バケットをスクリプトに生成させる場合に指定する。
export AWS_S3_REGION=ap-northeast-1

<補足> デフォルトでは Master や Minion は ubuntu の AMI を使って構築される。AWS_IMAGE という環境変数で使用する AMI を指定することはできるが、現在セットアップスクリプトでサポートされているのは ubuntu と CoreOS だけらしいので、それ以外は動作しない可能性がある。


クラスターの構築

環境変数の設定が終わったら、Kubernets のセットアップスクリプトを実行する。

curl -sS https://get.k8s.io | bash

あとは自動的に進んでいき、クラスターが構築される。Master や Minon のアドレス、ユーザー名・パスワードが記載されたファイルなどの情報が出力される。

$ curl -sS https://get.k8s.io | bash

Downloading kubernetes release v0.19.3 to /home/ec2-user/kubernetes.tar.gz

・・・()

Kubernetes cluster is running. The master is running at:

https://52.68.83.XX

The user name and password to use is located in /home/ec2-user/.kube/config.

... calling validate-cluster
Found 2 nodes.
NAME LABELS STATUS
1 ip-172-20-0-10.ap-northeast-1.compute.internal kubernetes.io/hostname=ip-172-20-0-10.ap-northeast-1.compute.internal Ready
2 ip-172-20-0-11.ap-northeast-1.compute.internal kubernetes.io/hostname=ip-172-20-0-11.ap-northeast-1.compute.internal Ready

・・・()

Done, listing cluster services:

Kubernetes master is running at https://52.68.83.XX
Elasticsearch is running at https://52.68.83.XX/api/v1beta3/proxy/namespaces/default/services/elasticsearch-logging
Kibana is running at https://52.68.83.XX/api/v1beta3/proxy/namespaces/default/services/kibana-logging
KubeDNS is running at https://52.68.83.XX/api/v1beta3/proxy/namespaces/default/services/kube-dns
Grafana is running at https://52.68.83.XX/api/v1beta3/proxy/namespaces/default/services/monitoring-grafana
is running at https://52.68.83.XX/api/v1beta3/proxy/namespaces/default/services/monitoring-heapster
influxGrafana is running at https://52.68.83.XX/api/v1beta3/proxy/namespaces/default/services/monitoring-influxdb

Kubernetes binaries at /home/ec2-user/kubernetes/kubernetes/cluster/
You may want to add this directory to your PATH in $HOME/.profile
Installation successful!

AWS コンソールを見ると、以下のようにEC2インスタンスが作成されていることが分かる(kubernetes-* が自動で作成されたインスタンス)。セットアップスクリプトは EC2 の AutoScaling Group を作成し、その機能によりこれらのインスタンスが作成される。

kube-nodes-ec2.PNG

他にもセットアップスクリプトにより、VPC、S3バケット、IAM Role が作成される。


動作確認

作業用インスタンスから、Master のアドレスにアクセスしてみる。ユーザー名とパスワードは、作業用インスタンスの ~/.kube/config に書かれている。

$ curl -u admin:XXXXXXX -k https://52.68.83.XX

{
"paths": [
"/api",
"/api/v1",
"/api/v1beta3",
"/healthz",
"/healthz/ping",
"/logs/",
"/metrics",
"/static/",
"/swagger-ui/",
"/swaggerapi/",
"/ui/",
"/version"
]
}

$ curl -u admin:XXXXXXX -k https://52.68.83.XX/version
{
"major": "0",
"minor": "19",
"gitVersion": "v0.19.3",
"gitCommit": "3103c8ca0f24514bc39b6e2b7d909bbf46af8d11",
"gitTreeState": "clean"
}

Pod を表示してみる。Kubernetes クラスタを管理するツールである kubectl は、セットアップを実行したディレクトリにある kubernetes/platforms/ 配下に置かれている。

$ ./kubernetes/platforms/linux/amd64/kubectl get pods

NAME READY REASON RESTARTS AGE
elasticsearch-logging-v1-atfii 1/1 Running 0 35m
elasticsearch-logging-v1-f3rge 1/1 Running 0 35m
fluentd-elasticsearch-ip-172-20-0-10.ap-northeast-1.compute.internal 1/1 Running 0 31m
fluentd-elasticsearch-ip-172-20-0-11.ap-northeast-1.compute.internal 1/1 Running 0 31m
kibana-logging-v1-4ije5 1/1 Running 0 35m
kube-apiserver-ip-172-20-0-9 0/1 Pending 0 11m
kube-controller-manager-ip-172-20-0-9 0/1 Pending 0 11m
kube-dns-v3-7rw1g 3/3 Running 1 35m
kube-scheduler-ip-172-20-0-9 0/1 Pending 0 11m
monitoring-heapster-v3-uz6oy 1/1 Running 1 35m
monitoring-influx-grafana-v1-7agvr 2/2 Running 0 35m


クラスターの削除

セットアップスクリプトは、AWS の AutoScaling Group や VPC など様々なリソースを作成しているので、手動でクラスターや各種リソースを削除するのは面倒。作業用インスタンスにダウンロードされている Kubernetes パッケージに含まれる cluster/kube-down.sh を使うのが簡単。

$ export KUBERNETES_PROVIDER=aws

$ export KUBE_AWS_ZONE=ap-northeast-1a
$ kubernetes/cluster/kube-down.sh
Bringing down cluster using provider: aws
Deleting auto-scaling group: kubernetes-minion-group
Deleting auto-scaling launch configuration: kubernetes-minion-group
Deleting instances in VPC: vpc-97e249f2
(中略)
Deleting security group: sg-f1700f94
Deleting security group: sg-f2700f97
Done


参考サイト

Getting started on AWS EC2


修正履歴

2015/8/11 「クラスターの削除」を追記