GKE上でIstio Addonを使ってIstio入りのk8sを立ち上げて、そこにmicroservices-demoをデプロイしてみた。画面をポチポチしながら。
ひととおり遊んで気が済んだら、明日の夜にはGCPのプロジェクトごと削除すると思う。(追記:削除しました)
## やったことのメモ
## 1. VPCを作成
VPCを作って、東京リージョンにカスタムサブネットを作成した。デフォルトのVPCは削除しておいた。
Secondary IP rangesのところは、後でGKEを作ったときにVPC Nativeを選択したら自動で作られた。Pod用とService用みたい。
## 2. Cloud NATを作成
GKEはPrivate Clusterにしようかなと思って。NodeにGlobal IPを持たせないやつ。
なので、外に出ていくのにNATの設定をしておいた。
なんかCloud NATを作成する画面で、Cloud Routerを作成する必要があった。ルーターとしてではなく、コントロールプレーンとして使ってるみたいなことが書いてあった。
## 3. GKEをIstioつきで作成
'Highly available' テンプレートから作ってみた。Regionalクラスター。各Zone1台ずつにしておいた。んで、Privateクラスターにしておいた。24時間で1000円ぐらい。早く勉強をひとくぎりつけてシャットダウンしなければという気持ちになって良い。
Istio authはPermissiveで作っといた。mTLSじゃなくても大丈夫なやつ。
これで、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マイクロサービスのデモアプリをデプロイしてみることにした。
Istio用のデプロイ設定もあるので、これをそのままやった。途中までは終わってるので、具体的には(5)から。
❯ kubectl apply -f ./istio-manifests
このデモアプリのビルドとデプロイにはskaffoldを使ってるので、入れておいた。これも
❯ 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"
だいたい、こういうものは最初は動かないものだと思ってるのでびっくりした。
こんなにするっと行くわけが・・・(疑い
— Mitsuyuki Shiiba (@bufferings) 2019年8月3日
(∩´∀`)∩ワーイ
## 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になった。
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を使わずに自分でインストールしないといけないのかなぁと思い中。
とりあえず一歩前進かな。寝よう。