がべーじこれくしょん

技術系とかいろいろ

海外の格安VPSでk8sクラスタを構築してみた

k8sの勉強のためにk8sクラスタが欲しかったのですが、おうち鯖をキッティングするのが面倒だったので雑に海外VPSを使って建ててみました。これはそのときのメモ。

Time4VPSとは

↓ここからTime4VPSに登録すると僕の実験費用を支援できるのでよろしくお願いします(?) www.time4vps.eu

海外の格安VPSはいくつかあるのですが、今回は「Time4VPS」というものを選択しました。

Time4VPSは、ヨーロッパを中心に展開している企業で、リトアニアに拠点を置いています。データセンターもリトアニアにあります。メインとしているのはVPSホスティングサービスで、VPNとかも提供しています。

Time4VPSの売りはなんといってもランニングコストの低さです。

以下は、日本の主要なVPSとの価格比較の表です。スペックは各社まちまちなので単純に比較できませんが、ここではTime4VPSの一番安価なプラン(RAMが2GB)と同容量のメモリを提供するプランを選択して比較しています。

Time4VPS ConoHa さくらのVPS
プラン Linux2 2GBプラン 2GBプラン
vCPU 1 x 2.6GHz(Intel® Xeon® Gold 6132) 3 x ?GHz(?) 3 x ?GHz(?)
RAM 2GB 2GB 2GB
ストレージ 20GB(HDD or SSD) 50GB(SSD) 100GB(SSD)
通信量(external) 2TB(100Mbps)*1 無制限(100Mbps) 無制限(100Mbps)
価格(月あたり) 3.99EUR(だいたい480円)) 1,750円 1,580円(石狩DC)

ソースにしたのはそれぞれ以下のページ。

www.time4vps.com

www.conoha.jp

vps.sakura.ad.jp

国内企業と比べてる時点で適切な比較になっていない気がしますが、これだけみると明らかにTime4VPSが安いです。単純に1/3くらいです。externalの通信量に制限があるとはいえ、本番環境ではない実験用途というのを加味すると許容範囲だと思います。

ちなみに、Time4VPSはこれでもかというほどよくキャンペーンを行っています。具体的には、以下の時期(やイベント)にキャンペーンが行われることが多いです。

キャンペーンを併用すると大抵の場合は半額になります。さらに1年まとめて契約すると17%引きになります。そんなに割引して大丈夫なのかという気持ちになるくらい頻繁にセールをやってます。

キャンペーンは、Time4VPSの公式Twitterが告知をしているので、見ておくといいかもしれません。

twitter.com

構成

さて、今回の構成はこんな感じにしました。k8sについてはあまり詳しくないので、特に面白みのない、無難な構成です。

Master Node Linux16 x 1
Worker Node Linux2 x 3
OS Ubuntu 18.04 LTS
Deployment Tool kubespray
Container Runtime Docker
CNI Calico

なんでMasterだけLinux16か(正直MasterもLinux2でいい)というと、1年前に「自作アプリを公開するぞ」と調子乗って契約したまま無を貫いていた子を流用してるからです。Resource Utilization大事(?)

Master Nodeの契約が来年の6月くらいまでなので、契約切れたらMasterをランニングコストが低いやつに差し替える予定です。移行の過程でMulti Master構成が試せていいですね。

構築をkubeadmでやろうと意気込んでいたのですが詰むと困る(チキン)のでkubesprayを使いました。

CNIはFlannelとCalicoで悩んだのですが、Flannelの開発が最近あまりアクティブではないことからCalicoにしてみました。業界の標準もCalicoに寄せているような印象です。(これについてはあまり詳しくないので詳しい人にいろいろ聞きたいのですが)

f:id:musaprg:20191205211057p:plain
coreos/flannelのcode frequency

f:id:musaprg:20191205211133p:plain
projectcalico/calicoのcode frequency

構築

さて、さっそくやっていきたいと思います。

まずはkubesprayをcloneして、ansibleの設定を含んだフォルダをコピーします。

$ git clone https://github.com/kubernetes-sigs/kubespray
$ cd kubespray
$ cp -rfp inventory/sample inventory/mycluster

次にクラスタの構成をansibleの構成ファイル(inventory/mycluster/inventory.ini)に書き込みます。以下のような感じにしました。

node1 ansible_host=114.51.48.10
node2 ansible_host=114.51.48.11
node3 ansible_host=114.51.48.12
node4 ansible_host=114.51.48.13

[kube-master]
node1

[etcd]
node1
node2
node3

[kube-node]
node2
node3
node4

[calico-rr]

[k8s-cluster:children]
kube-master
kube-node
calico-rr

詳しいことは以下参照。

github.com

mycluster/group_vars以下は必要に応じて修正してください。今回はいじりません。

いじる際はそれぞれ以下ファイルの中身を確認してみてください。

  • その他全体に関すること: inventory/mycluster/group_vars/all/all.yml
  • k8sクラスターに関する設定(CNI等): inventory/mycluster/group_vars/k8s-cluster/k8s-cluster.yml

ちなみに、初期設定だとkubectl用のconfigが出力されないので、以下を参考にgroup_varsを書き換えます。

medium.com

inventory/mycluster/group_vars/k8s-cluster/k8s-cluster.ymlkubeconfig_localhosttrueにすると出力されます。

その他に、2箇所ほど変更します。

  • PVCを使えるようにlocal_volume_provisioner_enabled: trueにします
  • Let's Encryptをのちのち使うかもしれないのでcert_manager_enabled: trueにします

以下コマンドを叩くとansibleのplaybookが実行されます。

$ ansible-playbook -i inventory/mycluster/hosts.yml cluster.yml -b -v --private-key=~/.ssh/private_key

というわけで、無事構築が終わりました。

動作確認

構築が正しくできているかkubectlから確認してみます。

kubectlはHomebrew経由で簡単にインストールできます。

$ brew install kubernetes-cli

Linux環境やWindows環境の方は公式ドキュメントを参照してください。

kubernetes.io

$ export KUBECONFIG=$PWD/kubespray/inventory/mycluster/artifacts/admin.conf

設定を確認できるか試してみます。

$ kubectl config view

確認ができたら、クラスタの情報を取得してみましょう。

$ kubectl cluster-info

以下コマンドでノードの状態を確認し、正常に立ち上がっていることを確認してください。

$ kubectl get nodes

ここまで正常に実行ができれば、ひとまずデプロイは成功しています。お疲れさまでした。

やること

  • ingress-nginx
  • minio
  • MetalLB
  • cert-manager

あたりを導入するやつをやります。

PVを使えるようにしてあるので、kubevirtとかが動くかもやってみたいですね。

後はおうちクラスタとおうちネットワークを早急に作らなければ…

参考文献

ladicle.com

*1:超過すると翌月まで10Mbpsになる