はじめに
こんにちは、TIGの村田です。GCP連載企画2日目の記事です!
皆さんは普段どのようなアプリケーションを開発されてますか? 私は最近Kubernetes上にデプロイされるマイクロサービスなアプリケーションに携わっています。
今回はIstio on GKEに焦点をあててGCPにおけるサービスメッシュの活用方法をご紹介したいと思います。
GKEクラスタを作成する
まずはクラスタを作成します。
基本的にはデフォルト値のままクラスタ作成してしまおうと思います。
変えるのは一箇所だけ、今回の目玉の部分です。
Additional features
の Enable Istio
にチェック!
チェックを入れると Enable mTLS
欄が登場します。
選べるのは Permissive
と Strict
の2種類ですが、今回はデフォルト値である Permissive
のままとします。詳しくは以下のページを見てみてくださいmm
The service mesh era: Securing your environment with Istio
少し待つとクラスタができました!
クラスタ内に作成されたServiceを確認してみましょう。
$ gcloud container clusters list --project <your-project> |
Istio関連のService(Podも)は istio-system
のNamespaceに作成されます。
$ kubectl get service -n istio-system |
また、デフォルトでは sidecar injection
が有効になっていません。
Istioのメリットを最大限享受するためにはサイドカーとして動くEnvoy proxyが必要です。
以下のコマンドで有効化します。
$ kubectl label namespace default istio-injection=enabled |
クラスタの準備はひとまず完了です。
デモアプリケーションをデプロイする
マイクロサービスのデモアプリケーションといえばこれ、ということで Hipster Shop: Cloud-Native Microservices Demo Application を早速デプロイします。
まずは microservices-demo
をclone。
git clone https://github.com/GoogleCloudPlatform/microservices-demo.git |
Docker
, kubectl
, skaffold
が必要とのことでインストール。筆者環境では skaffold
のみが無かったのでHomebrew経由で入れました。
brew install skaffold |
skaffold
はバージョン制約(≥v0.20)があるので念の為チェック。
$ skaffold version |
問題なさそうですね。次に進みます。
READMEに従う形でMANIFESTをapply。ここの紐解きは後述(★)します。
$ kubectl apply -f ./istio-manifests |
skaffoldを使って一気にイメージ登録からデプロイまでを行います。Docでは30分未満との記述がありましたが、筆者環境では1時間半以上かかりました。。。マシンスペックとネットワークスピードですかね。。
skaffold run --default-repo=gcr.io/<your-project> |
何はともあれ無事にデモアプリのデプロイが完了しました。
Podの稼働状況を見てみます。
$ kubectl get po |
デフォルトのクラスタ設定ではリソースが足らず、半数以上のPodがPending状態となってしまいました。
Autoscalingの設定を入れることで解消しましたが、それに伴いCrashLoopBackoffが発生してしまったPodがいくつか存在しています。
Autoscale後は n1-standard-1
が6台並ぶ構成となりました(初期3台構成)
sidecar injection
を有効にしたので、Podの中も少し覗いてみます。
$ kubectl describe pod adservice-7b456d8f85-29s59 |
istio-proxy
がコンテナとして稼働していることが確認できました。
画面へのアクセスも試みてみましょう。
まずはIPを取得。
$ kubectl get service frontend-external |
35.232.239.135
がIPなのでアクセスすると…
無事にデモ画面が表示されました!!
サービスモニタリングを行う
さて、Istioを使う意義の1つであるモニタリングに踏み込んでいきましょう。
細かい設定手順は公式のMonitoring解説パートがとても丁寧なので参照すると良いです。
以下はAdd ChartよりServer LatencyのChartを作成している画面です。
各項目設定時は選択候補がとてもたくさんありましたが、インクリメンタルサーチでどんどん絞れるのでストレスなく作成を進められました。
いくつかのメトリクスを追加してみると…
簡単にダッシュボードが作成できました。
既に様々なデータがStackdriver Monitoringへ送られているので、それをダッシュボード化すれば良いだけで特段難しいことは無かったです。
サービストレースを行う
簡単ですがトレースも行ってみました。
Stackdriver Traceの画面にて時系列順にLatencyがplotされます。
ちょうど点線のあたりでポチポチ画面を触っていたのですが、気になるほど高Latencyになってるわけではありませんでした。
処理ごとのLatencyも確認できます。
もちろん実装次第ではもっとブレークダウンした形でLatencyを参照できます。
こんなに簡単に見られることが分かってしまうと、OpenCensusを使った可視化にもっともっとチャレンジしたいという気持ちに包まれます!
GKEクラスタに適用したIstio用MANIFESTについて
READMEに従う形でMANIFESTをapply。ここの紐解きは後述(★)します。
ここの布石を回収します。
applyしたのはここにある3つのyamlでした。
1つ目は frontend-gateway.yaml
です。
apiVersion: networking.istio.io/v1alpha3 |
Istioを有効化すると自動的に Ingress Gateway
が有効化されるのですが、具体的にGatewayがどのようなリクエストを受け付けるか定義しているのが kind: Gateway
の箇所です。全てのHTTPリクエストを受け付ける形で定義されています。
Ingress Gateway
自体の詳細はこちらも参照してみてください。
kind: VirtualService
で定義されているのが、Gatewayを通過したリクエストの転送先です。 destination
にて具体的な記載があり frontend
と記載されているため今回のデモアプリではWeb画面を返却するWebサーバへルーティングされます。
Ingress GatewayのIPアドレスは以下のコマンドで取得可能です。
$ INGRESS_HOST="$(kubectl -n istio-system get service istio-ingressgateway \ |
2つ目は frontend.yaml
です。
apiVersion: networking.istio.io/v1alpha3 |
これの存在意義はしっかり腹落ちしきっていないのですが、(1)IstioのIngress gatewayを使ったアクセスと(2)LoadBalancerを使ったアクセスではHTTPレスポンスヘッダに差異がありました。
まずは(1)の場合。
$ curl -v http://34.69.104.178 |
次は(2)の場合。
$ curl -v http://35.232.239.135 |
(2)のLoadBalancerを使ったアクセスの場合のみ x-envoy-decorator-operation
というヘッダが含まれました。Envoyの公式ドキュメントにてこのヘッダについて言及されているのですが、おそらく内部ルーティングにおける名前解決のために本yamlをapplyしているものと思います。
3つ目は whitelist-egress-googleapis.yaml
外部への通信を許可する設定です。
apiVersion: networking.istio.io/v1alpha3 |
※外部への通信に対する挙動はIstioのバージョンによって異なるので利用バージョンの公式ドキュメントを確認してください。
all outbound traffic from an Istio-enabled pod is redirected to its sidecar proxy by default
執筆時点(2020.02.05)での最新バージョンは 1.4.3
で、デフォルトの挙動は「クラスタ外部への通信を許可する」となります。
ちなみに今回検証で利用したGKEクラスタにインストールしたIstioのバージョンは 1.1.7
で、正確には Istio 1.1.17-gke.2
です。
以下のページにて、GKEクラスタのバージョンごとのIstioバージョンのマッピングが確認できます。
https://cloud.google.com/istio/docs/istio-on-gke/versions
さいごに
今回は触りの部分でしたがGKEにおけるIstio活用について皆さんにお伝えできていれば幸いです。Traffic RoutingなどIstioの真髄とも言える部分への踏み込みはまた別に機会でやれたらと思います。
以上、GCP連載企画2日目でした。明日は澁川さんのGoでサーバーレスな管理画面アプリを作るです。お楽しみに!!