Create Kubernetes Cluster on DigitalOcean

このブログは DigitalOcean 上で動かしています。サーバの構築は Terraform で、ミドルウェアの設定などは Ansible で行なっているのですが、そろそろ飽きてきたので Kubernetes に移行しようと考えています。

そこで、まずは Kubernetes クラスタを DigitalOcean 上に作成するところからやってみます。

使用するツール

クラスタの構築を全て手動でやるのはかなり苦しそうなので kops (Kubernetes Operations) を使ってみます。

kops は Kubernetes クラスタを構築・運用するためのツールで、 AWS などの各クラウドベンダやプライベートクラウドに対応しています。

DigitalOcean にも α 版ですが対応しています。

※ なお、 kops は Terraform と連携することができる (tf ファイルを吐く) 機能があるのですが、 DigitalOcean には現在対応していませんでした。

brew でインストール。

brew install kops

DigitalOcean 側の準備

基本的にチュートリアルに沿って進めていきます。まずは DigitalOcean 側の準備をします。

DigitalOcean 側の準備は以上です。

環境変数の設定

kops はステートストアと呼ばれる領域にクラスタの設定(ドメイン名やインスタンスのサイズ等)を格納します。

先ほど DigitalOcean Spaces の設定をしましたが、これはステートストアとして使うためです。このステートストアのエンドポイントやアクセスキーを、環境変数に設定していきます。

先ほど設定した値を、以下の環境変数に埋めていきます(ステートストアのエンドポイントを設定する環境変数名が S3 となっていますがご愛嬌w)。

export KOPS_STATE_STORE=do://<bucket-name> # where <bucket-name> is the name of the bucket you set earlier
export DIGITALOCEAN_ACCESS_TOKEN=<access-token>  # where <access-token> is the access token generated earlier to use the V2 API

# DigitalOCcean Spaces is S3 compatible so we just override some S3 configurations to talk to our bucket
export S3_ENDPOINT=nyc3.digitaloceanspaces.com # this can also be ams3.digitaloceanspaces.com or sgp1.digitaloceanspaces.com depending on where you created your Spaces bucket
export S3_ACCESS_KEY_ID=<access-key-id>  # where <access-key-id> is the Spaces API Access Key for your bucket
export S3_SECRET_ACCESS_KEY=<secret-key>  # where <secret-key> is the Spaces API Secret Key for your bucket

# this is required since DigitalOcean support is currently in alpha so it is feature gated
export KOPS_FEATURE_FLAGS="AlphaAllowDO"

環境変数は定番ですが direnv を使うと便利。

クラスタの作成

各準備が終わったのでクラスタの作成に入ります。

流れとしては以下。

  • ステートストアにクラスタの定義を保存する
  • クラスタの定義をもとに実際にクラスタを作成

やっていきます。

まずクラスタの定義。チュートリアルにある以下の例を元にやります。クラスタのノードにどの OS を使うか選べます。

# coreos (the default) + flannel overlay cluster in tor1
kops create cluster --cloud=digitalocean --name=my-cluster.example.com --networking=flannel --zones=tor1 --ssh-public-key=~/.ssh/id_rsa.pub

# ubuntu + weave overlay cluster in nyc1 using larger droplets
kops create cluster --cloud=digitalocean --name=my-cluster.example.com --image=ubuntu-16-04-x64 --networking=weave --zones=nyc1 --ssh-public-key=~/.ssh/id_rsa.pub --node-size=s-8vcpu-32gb

# debian + flannel overlay cluster in ams3 using optimized droplets
kops create cluster --cloud=digitalocean --name=my-cluster.example.com --image=debian-9-x64 --networking=flannel --zones=ams3 --ssh-public-key=~/.ssh/id_rsa.pub --node-size=c-4

私はせっかくなので CoreOS (Container Linux) を選びます。

デフォルトでは、 マスターの Droplet のタイプは s-2vcpu-2gb が使われます。マスターに対しノードのタイプは s-2vcpu-4gb 。

これは $15/月 とかするのでクラスタで複数台立ち上げることを考えると…。高級…。 💸

なので私はマスターもノードも全て s-1vcpu-1gb ($5/月) を使うよ。なお、 Droplet の全てのタイプは CLI から確認できます。

$ doctl compute droplet list -o json | jq -r '.[].region.sizes[]'
32gb
16gb
2gb
1gb
4gb
8gb
512mb
64gb
48gb
c-16
c-48
s-1vcpu-3gb
c-32
c-2
c-4
c-8
m-16gb
s-1vcpu-1gb
s-1vcpu-2gb
s-2vcpu-2gb
s-3vcpu-1gb
s-2vcpu-4gb
s-4vcpu-8gb
s-6vcpu-16gb
s-8vcpu-32gb
s-12vcpu-48gb
s-16vcpu-64gb
s-20vcpu-96gb
s-24vcpu-128gb
c-1vcpu-2gb

また、リージョンは日本から一番近いシンガポールを使います。

最終的に以下のようなコマンドになりました。

  • クラスタの名前は cluster.lorentzca.me
  • master, node 共に Droplet のタイプは s-1vcpu-1gb を使用
$ kops create cluster \
--cloud=digitalocean \
--name=cluster.lorentzca.me \
--networking=flannel \
--zones=sgp1 \
--master-size=s-1vcpu-1gb \
--node-size=s-1vcpu-1gb \
--ssh-public-key=~/.ssh/id_rsa.pub

オプションは他にもいろいろあって、 kops create cluster --help で一覧できます。

$ kops create cluster --help
...

Flags:
      --cloud string                         Cloud provider to use - gce, aws, vsphere

...

      --master-size string                   Set instance size for masters

...

      --node-size string                     Set instance size for nodes

さて、 create cluster を実行すると設定内容がズラーっと出てきます。そして、ステートストアに設定情報ファイルが作成されていることを確認できます。 Droplet 以外にも Volume の作成や、 DNS の設定などが行われていることがわかります。

この設定情報をもとに実際にクラスタを構築するには、以下のコマンドを実行します。

  • --yes オプションが無い場合は dry-run となる親切設計
  • my-cluster.example.com 部分は create cluster で指定した名前
kops update cluster my-cluster.example.com --yes

やったぜ。

$ kops get clusters
I0929 16:02:54.509455   82181 s3context.go:75] Found S3_ENDPOINT="sgp1.digitaloceanspaces.com", using as non-AWS S3 backend
NAME                    CLOUD           ZONES
cluster.lorentzca.me    digitalocean    sgp1

これで Kubernetes 環境の構築は終わりです。

クラスタの削除をしたい場合は以下。

kops delete cluster my-cluster.example.com --yes

感想

多分普通に一から Kubernetes クラスタを作るのはすごい大変だと思うので kops のようなツールは助かりますね。

一から作る場合って、 Certified Kubernetes Administrator に挑戦する人とか、そういう場合にやるイメージ…。あと運用も普通は必要なくて、 GKE とか EKS とか AKS を使うのが一般的な印象。

Certified Kubernetes Administrator への興味はありますがまずは色々いじって遊んでみようと思います。とりあえず、

  • ブログの移行
  • Redash の移行(現在 Heroku 上で動かしている)
  • Vault の移行(現在 Hyper 上で動かしている)

あたりの移行を行なって Kubernetes に一元化したいと思っています。 😃

Hyper には $5/月 程かかっているので、移行後は kops でノードの数をもう一台増やしてもいいかもしれない。 🎈