hidexir’s blog

こんにちはセキュリティとプログラミングすきなweb系エンジニアのhidexのテックブログです

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

f:id:hidexir:20190611165616p:plain istio-ingressgateway LoadBalancerが 35.187.197.186 が外部ipアドレスとして割り当てられている。実際にアクセスしてみましょう。 http://35.187.197.186/productpage f:id:hidexir:20190612002903p:plain このようなページが表示されます何回かリクエストをしてみてください。 次にGrafanaにて実際のメトリクスをみたいので。podをちょくせつportforwardします。 kubectl port-forward -n istio-system <grafanaのpod名> 3000:3000 f:id:hidexir:20190612003130p:plain 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 をつけることで無事にうまく全コンテナが起動した。