月5ドルの海外VPSでKubernetesを試してみる

これは?

Kubernetes試してみたい!ということで、GKEやAmazon ECSを使うのも良いのですが、そこそこお値段が・・ ということで、格安VPSを使ってKubernetesを試してみます。

 

ほかの選択肢

正直なところ純粋にKubernetesを動かす場合はGKEやAmazonECSを使うほうがおすすめです。が、まぁせっかくやってみたので知識の共有ということで記事にしました。

 

ローカルで試す場合はminikubeがおすすめです

github.com

さて、ここまで読んでまだ格安VPSでKubernetesを試してみたい方は、 続きをご覧ください。

 

※※追記:Kubernetes1.9でのやり方をまとめなおしましたので、下の記事を参照してください※※

inajob.hatenablog.jp

※※追記:以下は古い手順です※※

 

海外VPS

僕が使っているのは海外VPSのvultr。と言ってもTokyoリージョンにもマシンを払い出せます。


紹介コードを介すると僕が幸せになるのでお願いします
こちらから登録! ↓

www.vultr.com

さて、vultrでマシンを作るところは省略。
OSはubuntuでメモリ1GB 1CPU Coreのマシンを作る。 これでだいたい月$5のプランのようだ。

f:id:inajob:20170402181428p:plain

 

f:id:inajob:20170402181333p:plain

swapをつくる

swapができないと確実にメモリが足りなくなるので設定します。(このプランでは根本的にメモリが足りないという話はとりあえず無視する)

 

# dd if=/dev/zero of=/swapfile count=2048 bs=1M
# chmod 600 /swapfile
# mkswap /swapfile
# swapon /swapfile

参考 https://www.vultr.com/docs/setup-swap-file-on-linux

 

注意

kubeadmはまだ開発中のプロダクトのようです。また、master、workerを1台でやるのもセキュリティ上推奨されていないので、あくまでこのやり方はお試し、ということで

 

 kubeadmでクラスタを作る

kubeadmというツールを使うと、kubernetesクラスタを簡単にお試しできる環境を構築できます。

ざっと図にすると下図のように、kubernetesの稼働に必要なコンポーネントを一気にセットアップしてくれます。あくまでお試し、なのでセキュリティ上はよろしくないところや、etcdが1台のみという全く冗長性のない構成のクラスタであるという点には注意が必要です。

f:id:inajob:20170402183104p:plain

 必要なパッケージをインストールします。

# apt-get update && apt-get install -y apt-transport-https
# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
# cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
 deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
# apt-get update
# apt-get install -y docker.io
# apt-get install -y kubelet kubeadm kubectl kubernetes-cni

 

 

kubernetesクラスタの構築をします。
「kube-dns」の設定を変える部分が少々トリッキーです。もちろん、もっと良いマシンを使っていれば素直に立ち上がります。
# kubeadm init
(略 結構待つ)

(1台で全部やりたいので、workerにもPodを配置するように設定)
# kubectl taint nodes --all dedicated-


(ネットワークの設定)
# kubectl create -f https://git.io/weave-kube

(kube-dnsが動かないので無理やり設定を変える)
# kubectl edit deployment kube-dns --namespace=kube-system
(viが起動するのでResourceの制限をすべて消したうえで保存する)

# kubectl get pods --namespace=kube-system
(すべてのpodがRunningになるまで待つ)
これで一応kubernetesができたはず
 
試しにkubernetes-dashboardをデプロイしてみる
 
kubernetes-dashboardにアクセスするには、まずNodePortを確認する。
 
 
# kubectl get svc --namespace=kube-system
NAME                   CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
kube-dns               10.96.0.10       <none>        53/UDP,53/TCP   2h
kubernetes-dashboard   10.106.150.108   <nodes>       80:31982/TCP    27m
ここに出ている31982というのがそれ。
 

これでアクセスできる。(31982は環境によって違うはずです)

ちなみに、これなんの認証もないので、インターネット上の誰でも見える状態になっています。kubernetes-dashboardからは任意のコンテナを実行させたりできるので、これは非常に危険です。確認が終わったら、すぐにkubernetes-dashboardは消すか、外から直接アクセスできないようにすることをお勧めします。

手元のマシンからkubectlを実行する

f:id:inajob:20170402183038p:plain

 

いちいちVPSにログインしてkubectlを実行するのもだるい。

幸いkubectlは各OSごとにバイナリが提供されているので、例えばWindowsのノートパソコンから利用できる。
手元からkubernetesクラスタへアクセスするためには向き先や認証情報を取得する必要がある。

 

 先ほどセットアップしたVPSのv /etc/kubernetes/admin.conf というファイルに必要な情報が入っているので、SCPなどで手元に持ってくる。

手元のマシンにkubectlのインストール

手元のマシンの環境に合ったkubectlをインストール(といってもバイナリを落としてくるだけ)

 OSごとに違うのでやり方は下記を参考

kubernetes.io

 

手元のマシンでkubectl proxyを実行

$ kubectl --kubeconfig=admin.conf proxy --port=8080
 
これで、手元のマシンにkubernetesのapiserverへの認証済みのプロキシが作られた。
 

手元のマシンでkubectl を実行

$ kubectl get pods
 
などと、kubectlコマンドを実行できる。
ここまでできればkubernetesのホストにログインする必要はなくなる。
 

メトリクスを収集する

なんといっても非力なスペックのVPSです。メトリクスが気になります。
 この記事に従って、Prometheusを入れてみます。
 
 prometheusのUIを確認してみます。まずはアクセスするためのポートを知る必要があります。
 
$ kubectl get svc prometheus
NAME         CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
prometheus   10.103.242.223   <nodes>       9090:30090/TCP   1m
PORTSのところの30090に注目
  にアクセスすることでprometheusの画面を見ることができます。

f:id:inajob:20170402185713p:plain

 CPUやメモリの様子が見たいのでnode-exporterを入れる

node-exporterをデプロイして、数分待つと、prometheusにメトリクスが収集されます。

f:id:inajob:20170402190115p:plain

prometheusのUIは慣れないとわかりにくいのですが、一番上のテキストエリアに"node_cpu"と入力し「Execute」をクリックするとこの画面になります。 Valueのところに、それっぽい値が出ています。
また、Graphというタブみたいなのをクリックすると

f:id:inajob:20170402190305p:plain

なんかグラフっぽいものを見ることもできます。

気になるメモリは?

"node_memory_MemFree" がそれっぽいですね。

f:id:inajob:20170402190425p:plain

 えーっと、あと80M余ってるということかな・・?

メトリクスを可視化する

f:id:inajob:20170402193918p:plain

Prometheusの可視化もまぁそこそこですが、もう少し見やすくするためにGrafanaを導入します。
先ほど紹介した記事によると

Kubernetes のメトリクスを Prometheus を使って監視する - Qiita

 メトリクスを監視するというタイトルで記事を書き始めましたが, メトリクスを収集するところまでで終わってしまいました. 次は今回収集したメトリクスをどのように可視化するかについてまとめたいと思います.

 次回作に期待・・となっている

しかしリポジトリを見るとすでに用意してあるではないか!

github.com

 
感謝しつつ、これを使ってみることにする。
grafanaにアクセスするためのポートを確認
$ kubectl get svc grafana
NAME      CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
grafana   10.103.143.142   <nodes>       3000:30000/TCP   8s
30000のようだ。
をブラウザに打ち込んでみる。

f:id:inajob:20170402191301p:plain

それっぽい画面が出ました!

graphanaは可視化専用ツールなので、先ほどのprometheusをgraphanaに登録して、そのデータを見ることになる。

左上のロゴマークから、「Data Sources」を選択、その後緑の「+ Add data source」をクリック

f:id:inajob:20170402191441p:plain

設定はどうしようか・・

Name: 好きな名前でOK 画像だと"prometheus"

Type: Prometheusを選択、選択すると、それ以降の項目が変化する

Url: http://prometheus:9090 とする

f:id:inajob:20170402191751p:plain

Urlがhttp://prometheus:9090というのは初見では驚くかもしれない。これで、先ほど作ったprometheusにアクセスできる。

種明かしをするとkubernetesクラスタの中にはdnsサーバが同梱されていて、まずServiceの名前として解決できるかを調べるようになっている。そのため、このような名前でアクセスできる。

 

さて、データベースの登録が終わったので、いよいよ可視化してみよう。

可視化のためには、先ほどのように、"node_cpu"だの"node_memory_MemFree"だの、prometheusやnode_exporterの知識が必要となる。だるい。。

ということで、先人の用意したdashboardを借りてくることにする。

dashboardは下記から探すことができる。

grafana.com

今回はnode-exporter用と思われる https://grafana.com/dashboards/22 をつかう。

 

ロゴからDashboards、からのImport

f:id:inajob:20170402192427p:plain

 Graphana.net Dashboardというところに「https://grafana.com/dashboards/22」と入力

f:id:inajob:20170402192652p:plain

入力してしばらくすると画面が変わる。

OpthinsのPrometheusのところ、ドロップダウンメニューから、先ほど登録したDataSourceの名前を選択して、Sava&Open!

f:id:inajob:20170402192925p:plain

 やった!かっこいいグラフが出たよ!

f:id:inajob:20170402193016p:plain

ここまでできたら、メトリクスもサーバにログインせずに見ることができる。
さぁあとはkubernetesを使い倒すだけだ!
 

注意

kubeadmはまだ開発中のプロダクトのようです。また、master、workerを1台でやるのもセキュリティ上推奨されていないので、あくまでこのやり方はお試し、ということで