解せぬ日記

雑な話をする

雰囲気でマイクロサービス入門をやってみた

ごんげお兄さんのエントリーを見て、興味あったのでやってみた。

gong023.hatenablog.com

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

ありがたいなぁ。