雰囲気でマイクロサービス入門をやってみた
ごんげお兄さんのエントリーを見て、興味あったのでやってみた。
TL;DR
- お兄さんのエントリー通りやると、雰囲気が分かるので超お勧め
- 動かしてからドキュメント眺めたらいいと思う
- GCP初めての人は$300のクレジットが貰えるぞ!
ありがたいなぁ。
補足
僕の環境はArch Linuxでかつ、GCPを触るのが初めてだったこともあって、いくつか追加の作業が必要だったのでそれだけ書いておく。最初にGCPのアカウントを開設して$300のクレジットを貰っておくように。
コマンドラインツールのインストール
AURにある。
$ yaourt -S google-cloud-sdk $ gcloud auth login # /opt以下に入るのでsudoで実行 $ sudo gcloud components install kubectl
初めてのコマンド前に認証が必要。ターミナルのコマンドからブラウザが起動してターミナルに処理が戻るの初めて見たかも知れない。
結構頑張ってついて行ってるのに、out-of-dateフラグ立てられてるのがかわいそう。僕もheroku-cliパッケージでたまに立てられるので気持ちは分かる。
コマンドラインツールの設定
リージョンやらプロジェクトやら色々設定しておいたほうが毎回オプションを渡さなくて済む。configの設定については https://cloud.google.com/sdk/gcloud/reference/config/set を眺める。
$ gcloud config set project micro-sample-XXXXX
Container Registry 有効化
dockerのimageをpushする際、Container Registryというサービスにpushするのだけど、これは有効化されてないとpushできない。ブラウザのコンソールから有効化するとよい。
環境変数の設定
対象のコードではBACKEND_SERVICE_NAME
という環境変数を使ってるので、その設定がいる。暗号化の仕組みも用意されてそうだった。バックエンドのIPを見たら設定しておく。たぶんドキュメントとかにコマンドラインとかから渡す方法が書いてあるんじゃないのって思ってるんだけど、どうなんすかね?
2017/10/06 追記
お兄さんにDNSあるよって教えてもらったので、そっちを使うほうが良さそう。IP変わるのでおっしゃる通りすぎる。コメントを参照のこと。ハマりどころがあって勉強になったぞ!!!!!!!1
ドキュメントによればKubernetes 1.3からDNSがビルトインされたようで、Serviceの名前がfooでKubernetesのネームスペースがbarの場合、foo.barで対象のServiceのクラスタIPが解決できる模様。ネームスペースやDNSの様子は以下のコマンドで眺められた。
$ kubectl get namespaces NAME STATUS AGE default Active 19m kube-public Active 19m kube-system Active 19m $ kubectl get svc --namespace=kube-system NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE default-http-backend 10.31.249.157 <nodes> 80:31925/TCP 21m heapster 10.31.247.113 <none> 80/TCP 21m kube-dns 10.31.240.10 <none> 53/UDP,53/TCP 21m kubernetes-dashboard 10.31.245.255 <none> 80/TCP 21m $ kubectl get svc --namespace=default NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.31.240.1 <none> 443/TCP 22m micro-sample-service-backend 10.31.244.62 <none> 8000/TCP 17m micro-sample-service-frontend 10.31.249.64 XX.XX.XX.XXX 80:32186/TCP 21m
ということで、バックエンドはmicro-sample-service-backend.default
で引けることになる。
ちなみにPodの中にはresolv.confが用意してあって、ドキュメントに書いてあるように以下のような定義になっている。
$ kubectl get pods NAME READY STATUS RESTARTS AGE micro-sample-backend-deployment-3300239719-22qdm 1/1 Running 0 38m micro-sample-backend-deployment-3300239719-mpjh9 1/1 Running 0 38m micro-sample-frontend-deployment-836517767-3vgzv 1/1 Running 0 10m micro-sample-frontend-deployment-836517767-vbbrp 1/1 Running 0 10m $ kubectl exec -ti micro-sample-frontend-deployment-836517767-3vgzv -- cat /etc/resolv.conf nameserver 10.31.240.10 search default.svc.cluster.local svc.cluster.local cluster.local c.micro-sample-XXXXX.internal google.internal options ndots:5
なのでネームスペースがdefaultの場合は、micro-sample-service-backend
だけでも引けるわけだけど、ネームスペースがいつもdefaultとは限らないので、ネームスペースと組み合わせた名前で指定しておくのがいいと思う。
追記終わり。
...
containers:
- name: micro-sample-frontend
image: gcr.io/micro-sample-XXXXX/micro-sample-frontend:v0.1
env:
- name: BACKEND_SERVICE_NAME
#value: 10.31.XXX.XXX
value: micro-sample-service-backend.default
ports:
...
Podの削除
せっかくなので、Podを消してみると不死鳥のように蘇る様子を見ることが出来る。
$ kubectl get pods NAME READY STATUS RESTARTS AGE micro-sample-backend-deployment-3300239719-ghw8q 1/1 Running 0 5m micro-sample-backend-deployment-3300239719-h8nwp 1/1 Running 0 5m micro-sample-frontend-deployment-602895698-qrwfk 1/1 Running 0 4m micro-sample-frontend-deployment-602895698-ts2kr 1/1 Running 0 4m $ kubectl delete pod micro-sample-backend-deployment-3300239719-ghw8q pod "micro-sample-backend-deployment-3300239719-ghw8q" deleted $ kubectl get pods NAME READY STATUS RESTARTS AGE micro-sample-backend-deployment-3300239719-h8nwp 1/1 Running 0 6m micro-sample-backend-deployment-3300239719-ppzf9 1/1 Running 0 9s micro-sample-frontend-deployment-602895698-qrwfk 1/1 Running 0 5m micro-sample-frontend-deployment-602895698-ts2kr 1/1 Running 0 5m
ありがたいなぁ。