kops を使って AWS 上に k8s を構築してみる
以下を試した時のメモ。
kopsを使ってKubernetesクラスタをAWS上で構成
環境
- EC2
- amzn-ami-2018.03.a-amazon-ecs-optimized(ami-f3f8098c)
Instance profile の作成
- AmazonEC2FullAccess
- AmazonRoute53FullAccess
- AmazonS3FullAccess
- IAMFullAccess
- AmazonVPCFullAccess
EC2 の起動
- 起動するインスタンスには作成した Instance profile を設定
- kops と kubectl のインストールは UserData でやってしまう
#!/bin/bash
yum update -y
yum install wget -y
# install kubectl
wget -O kubectl https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
# install kops
wget -O kubectl https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
上は多分動くけど未検証。
というかそもそも AmazonLinux AMI に docker をインストールする方が適切な気がしてきた。。。
SSH鍵の生成
$ssh-keygen
(すべて enter)
AWS CLI のインストール
Linux に AWS Command Line Interface をインストールします
$curl -O https://bootstrap.pypa.io/get-pip.py
$python get-pip.py --user
# PATH の追加
$echo "export PATH=~/.local/bin:$PATH" >> ~/.bashrc
# AWS CLI のインストール
$pip install awscli --upgrade --user
kops用のS3バケットの作成
# バケット名をランダムに生成し、ステートストアとして設定する
$ 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
make_bucket: example-state-store-vzupjxxxxxxx
# バージョニングを有効にする
$ aws s3api put-bucket-versioning \
--bucket $S3_BUCKET \
--versioning-configuration \
Status=Enabled
$echo "export KOPS_STATE_STORE=s3://example-state-store-xxxxx" >> ~/.bashrc
クラスターの作成
# 実行したが VPC が足りず途中で失敗。。。
$ kops create cluster \
--name example.cluster.k8s.local \
--zones ap-northeast-1a,ap-northeast-1c \
--yes
# 一旦削除
$kops delete cluster \
example.cluster.k8s.local \
--yes
# 再実行。成功
$ kops create cluster \
--name example.cluster.k8s.local \
--zones ap-northeast-1a,ap-northeast-1c \
--yes
# すぐに実行するとエラーになるので待つ。コンソールを見るとEC2が起動中だったのでこちらの起動及びマスター、ノードの準備が完了するまで待つ必要があるということのようだ。確認するとマスター1台、ノード2台が起動していた
# 数分待つと ready になる
$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-32-84.ap-northeast-1.compute.internal node True
ip-172-20-60-80.ap-northeast-1.compute.internal master True
ip-172-20-95-44.ap-northeast-1.compute.internal node True
Your cluster example.cluster.k8s.local is ready
# Ready になっている
$kubectl get node
NAME STATUS ROLES AGE VERSION
ip-172-20-32-84.ap-northeast-1.compute.internal Ready node 3m v1.9.6
ip-172-20-60-80.ap-northeast-1.compute.internal Ready master 4m v1.9.6
ip-172-20-95-44.ap-northeast-1.compute.internal Ready node 3m v1.9.6
とりあえずブログの内容までは出来たのでこれは終了