kops を使って AWS 上に k8s を構築してみる

kops を使って AWS 上に k8s を構築してみる

以下を試した時のメモ。

[kopsを使ってKubernetesクラスタをAWS上で構成](https://aws.amazon.com/jp/blogs/news/configure-kubernetes-cluster-on-aws-by-kops/)

# 環境

+ EC2
+ amzn-ami-2018.03.a-amazon-ecs-optimized(ami-f3f8098c)


# Instance profile の作成

+ AmazonEC2FullAccess
+ AmazonRoute53FullAccess
+ AmazonS3FullAccess
+ IAMFullAccess
+ AmazonVPCFullAccess

# EC2 の起動

+ 起動するインスタンスには作成した　Instance profile を設定
+ kops と kubectl のインストールは UserData でやってしまう

[Installing kops (Binaries)](https://github.com/kubernetes/kops/blob/master/docs/install.md)

```bash
#!/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鍵の生成

```bash
$ssh-keygen
(すべて enter)
```

# AWS CLI のインストール

[Linux に AWS Command Line Interface をインストールします](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/awscli-install-linux.html)

```bash
$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バケットの作成

```bash
# バケット名をランダムに生成し、ステートストアとして設定する
$ 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

```

# クラスターの作成

```bash
# 実行したが 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
```

とりあえずブログの内容までは出来たのでこれは終了