GKE + Istio Addonにmicroservices-demoをデプロイ

GKE上でIstio Addonを使ってIstio入りのk8sを立ち上げて、そこにmicroservices-demoをデプロイしてみた。画面をポチポチしながら。

ひととおり遊んで気が済んだら、明日の夜にはGCPのプロジェクトごと削除すると思う。(追記:削除しました)

https://shop.shiiba.dev/

f:id:bufferings:20190803225404p:plain

## やったことのメモ

  1. VPCを作成
  2. Cloud NATを作成
  3. GKEをIstioつきで作成
  4. microservices-demoをIstioにデプロイ
  5. HTTPSのLoad Balancerを作成

## 1. VPCを作成

VPCを作って、東京リージョンにカスタムサブネットを作成した。デフォルトのVPCは削除しておいた。

f:id:bufferings:20190803230744p:plain

Secondary IP rangesのところは、後でGKEを作ったときにVPC Nativeを選択したら自動で作られた。Pod用とService用みたい。

## 2. Cloud NATを作成

GKEはPrivate Clusterにしようかなと思って。NodeにGlobal IPを持たせないやつ。

なので、外に出ていくのにNATの設定をしておいた。

f:id:bufferings:20190803231028p:plain

なんかCloud NATを作成する画面で、Cloud Routerを作成する必要があった。ルーターとしてではなく、コントロールプレーンとして使ってるみたいなことが書いてあった。

## 3. GKEをIstioつきで作成

'Highly available' テンプレートから作ってみた。Regionalクラスター。各Zone1台ずつにしておいた。んで、Privateクラスターにしておいた。24時間で1000円ぐらい。早く勉強をひとくぎりつけてシャットダウンしなければという気持ちになって良い。

f:id:bufferings:20190803231559p:plain

Istio authはPermissiveで作っといた。mTLSじゃなくても大丈夫なやつ。

f:id:bufferings:20190803231836p:plain

これで、Istio入りのk8sクラスターが立ち上がる。へー。

接続情報を取得して

❯ gcloud config set project [プロジェクトID]
❯ gcloud container clusters get-credentials [クラスター名]

サイドカーの自動Injectionをenabledにしとく。

kubectl label namespace default istio-injection=enabled

ここまで5分くらいかな。Istioつきのk8sがこんなに簡単に作れるなんて。楽だー!(ただし、分かってない

## 4. microservices-demoをIstioにデプロイ

ということで何かを動かしたいなと思って。でも、IstioのBookstoreはちょっと飽きたから、ECマイクロサービスのデモアプリをデプロイしてみることにした。

github.com

Istio用のデプロイ設定もあるので、これをそのままやった。途中までは終わってるので、具体的には(5)から。

https://github.com/GoogleCloudPlatform/microservices-demo#optional-deploying-on-a-istio-installed-gke-cluster

❯ kubectl apply -f ./istio-manifests

このデモアプリのビルドとデプロイにはskaffoldを使ってるので、入れておいた。これも

https://skaffold.dev/

❯ skaffold run --default-repo=gcr.io/[PROJECT_ID]

しばらく待つと、デプロイが完了して動き出した。こんな感じでアクセスできる。

INGRESS_HOST="$(kubectl -n istio-system get service istio-ingressgateway \
   -o jsonpath='{.status.loadBalancer.ingress[0].ip}')"
❯ curl -v "http://$INGRESS_HOST"

だいたい、こういうものは最初は動かないものだと思ってるのでびっくりした。

(∩´∀`)∩ワーイ

## 5. HTTPSのLoad Balancerを作成

ここまでで動いてるから終わりでもいいんだけど。なんとなくLoad Balancerはk8sから作られるものじゃなくて、自分で別でコントロールしたいなと思っている。のでやってみることにした。その方がGCPの機能を柔軟に使えそうだなぁと思って。

なので、IstioのIngress Gatewayから作られるものじゃなくて、自分でもういっこHTTPS LBを作成した。ついでに、Google Managedの証明書を使った。

HTTPSのLBをStatic IPで作成。そのときに証明書はGoogle Managedを選択。んで、shop.shiiba.devのAレコードを登録しといたら、Activeになった。

f:id:bufferings:20190803233949p:plain

LBのバックエンドは、IstioのHTTPのNodePortを使った。

❯ kubectl get -n istio-system svc istio-ingressgateway
NAME                   TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)                                                                                                                   AGE
istio-ingressgateway   LoadBalancer   10.12.3.172   xxx.xxx.xxx.xxx   80:31183/TCP,443:32628/TCP,31400:32302/TCP,15011:30717/TCP,8060:32017/TCP,853:30377/TCP,15030:30985/TCP,15031:30336/TCP   10h

ここでいう 31183 。あとは、この通信をFirewallで許可したら動いた。

## 感想

GKEのIstio AddonでIstioが設定されたk8sを作るのはすごく簡単だし、使うのも簡単だなぁという印象。ただ、この中身を理解して、何か問題が起こったときにそれを調査できるようになるのは、なかなか大変そうだなぁ。

あと、個人的には、IstioのIngress GatewayをLBじゃなくてNodePortまでにしておいて、LBはGoogle Cloud Load BalancerをCloud ArmorやCDNつきで動かせたらいいなぁと思うので、そうなるとAddonを使わずに自分でインストールしないといけないのかなぁと思い中。

とりあえず一歩前進かな。寝よう。