GKEにistio導入をした話
こんにちは緑の会社のエンジニアの@hidexirです。
今回はプロダクトでistioを導入したのでその際のメリット・デメリットを共有できたらと思います。
istioとは
istioとはサービスメッシュをよりよく実現するためのフレームワークです。
簡単にいうとA,Bというマイクロサービスがそれぞれあった際に書くサービスの通信を監視してくれたり。データーの流れなどをコントールすることができます。istioによってkubenetesでのpod管理であったり。カナリヤリリースをより簡単に行うことができます。
istio インストール手順 (GKE)
お使いのGKEのバージョンによって安定して動作するistioのバージョンも異なるので確認してください。自分はインフラをTerraformで管理していたため。GKE cluster作成の部分にて以下の一行を追加しました。
# GKE resource "google_container_cluster" "hoge" { name = "hoge-gke-cluster" location = "asia-northeast1" remove_default_node_pool = true initial_node_count = 1 provider = "google-beta" #追加する addons_config { istio_config { disabled = false } } master_auth { username = "" password = "" } }
istioの公式サイトよりdownloadpage バージョンにあうファイルをダウンロードする。
# Istio 用の CRD を適用します。 kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml # istioインストール kubectl apply -f istio-1.0.6/install/kubernetes/istio-demo-auth.yaml
これでistio自体のインストールは完成します。これでいろいろな必要なpodやserviceが立ち上がるので少し待ちます。10分ぐらい。
そしてistioのインストールがうまく行ったかどうかを確認するために。 kubectl get pods -n istio-system これで確認します。
ちなみにisitoは namespaceはisito-systemとしていろいろ起動するのでアンインストールする際にはnamespaceがisito-systemまるごと消せば大丈夫です。
kubectl delete all --all -n istio-systemです。
sampleにあるアプリケーションをapplyしてみましょう!
# gataway と virtual serviceを登録します。これはingress proxyになってserviceにたいてL7ロードバランシグをしてくれます。また動的にIPアドレスが割り振られます。 kubectl apply -f istio-1.0.6/samples/bookinfo/networking/bookinfo-gateway.yaml # service と podの定義がしてる。これでアプリケーションがイメージから動作します。 kubectl apply -f istio-1.0.6/samples/bookinfo/platform/kube/bookinfo.yaml
kubenetesに導入するメリットとデメリット
kubeに導入するメリットはたくさんあります。いろいろなエコシステムを使うことができます。
よくPrometheusやGrafanaによる監視をするというWeb系企業を見受けられます。実際にその設定だけでも結構たいへんなのですがisitoは各podに対してistioctlコマンドのinject機能によって自動でenvoyを導入してエコシステムの連携を自動で行ってくれます。
Grafanaによるメトリスク監視
なぜGrafanaをエコシステムとして取り上げるのかというと見た目がかっこいいからです。 あとは実際にリクエストしたときに本当にアクセスレートがあがるのかを体験するためです。 では実際にやってみましょう。
kubectl get service -n istio-system
istio-ingressgateway LoadBalancerが
35.187.197.186 が外部ipアドレスとして割り当てられている。実際にアクセスしてみましょう。
http://35.187.197.186/productpage
このようなページが表示されます何回かリクエストをしてみてください。
次にGrafanaにて実際のメトリクスをみたいので。podをちょくせつportforwardします。
kubectl port-forward -n istio-system <grafanaのpod名> 3000:3000
Grafanaでもいろいろなメトリクスが取れるのですがServiceベースでのメトリクスを画像では表示しております。
めんどくさい設定なしにここまで出来るのは本当に便利だなと感じます。
自分の作ったサービスの istio-proxyをインジェクションする。
実際にbookinfo sampleではなく自分のアプリケーションをisito-proxy経由でリリースしたいですよね。 istioctlにはproxyをinjectする機能があります。それが以下のコマンドです。
istioctl kube-inject -f hoge_deployment.yaml > injected_hoge_deployment.yaml kubectl apply -f injected_hoge_deployment.yaml # sidecarでproxyが立つのでpodの母数が通常のアプライの+1される
CloudSQL(Mysql)とService Entry
自分が作っているプロダクトで実際にうまくたちあがらなかった。その原因はistioから外への通信はrejectされるからである。 なのでService Entryをアプライすることで外向きの許可した通信を決めないといけない。 自分の場合はgoogle apis と cloudsqlが外部通信だったので以下のファイルを作成した。
apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: googleapis-serviceentry-rule spec: hosts: - *.googleapis.com # wildcard使える。 ports: - number: 443 name: https protocol: HTTPS --- apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: mysql-serviceentry-rule spec: hosts: - 11.11.11.11 # cloudsqlのipを指定する。 ports: - number: 3306 name: tcp protocol: TCP
これでcloudsql-proxyがsidecar内部で無事につながった。しかし問題がもう一つあった。
それは goで作ったプログラムが起動のタイミングですぐにcloudsql-proxyに繋ぎに行くのでロスタイムがあり通信にしっぱいした。
goの起動に sleep 3 をつけることで無事にうまく全コンテナが起動した。