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 のアクセスキー発行
- Spaces (DigitalOcean 版の S3) バケットの作成とバケット API キーの発行
- バケット API キーは DigitalOcean 外から直にバケットのデータを扱うためのアクセスキーです
- ドメインと DNS の設定
- 私は お名前.com でドメインを取得しているので、 お名前.com 側で NS を DigitalOcean に指定してあげます
- DigitalOcean に SSH キーを設定
- 起動するインスタンスにログインするための SSH キーの設定です
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 でノードの数をもう一台増やしてもいいかもしれない。 🎈