IstioでKubernetesのサービスメッシュを構築してみる
本記事
どうやらKubernetesクラスタへのHTTPリクエストのレスポンスタイムがスパイクするということで引き続き原因を探っています。
以前の記事で同じくサービスメッシュを構築できるLinkerd
というものを検証してみました。
その記事が以下のものとなります。
しかしながら、いま勢いがあるのはIstioです。今回はLinkerdの良し悪しも評価することを含めてIstioを導入しようと思います。
Istioについて
Istioとは
アーキテクチャ
以下のようなアーキテクチャになっています。
大まかな機能を説明します。
Pilot
: サービスディスカバリと高度なトラフィックマネジメント(A/Bテスト、カナリアデプロイなど)を提供する。Proxy
: Envoy Proxyを使ってSidecarとしてデプロイをしている。Mixer
: プラットフォームに依存するもの。アクセスコントロールやサービスメッシュに渡る制御をしたり、それぞれのEnvoyやサービスからテレメトリーを収集する。Citadel
: サービス間とエンドユーザー認証を行う。Galley
: Control Planeを代表してユーザー認証されたIstio APIを提供する。
Helmによるインストール方法について
1. インストールする
今回はhelmのTemplateを使ってControl Planeをデプロイしていきます。
以下のようにデプロイします。
kubectl create namespace istio-system helm template install/kubernetes/helm/istio --name istio --namespace istio-system | kubectl apply -f
GrafanaでIstio自体を監視したい人は以下のオプションをつけてください。
--set grafana.enabled=true --set grafana.persist=true --set grafana.storageClassName=standard
確認すると正しくデプロイができています。
NAME READY STATUS RESTARTS AGE istio-citadel-86c9878bd9-4ss2j 1/1 Running 0 55s istio-cleanup-secrets-78tjv 0/1 Completed 0 58s istio-egressgateway-6c7949d598-2rq95 1/1 Running 0 55s istio-galley-656946f9d-sb6sw 1/1 Running 0 55s istio-ingressgateway-699794bf9c-kfh6m 1/1 Running 0 55s istio-pilot-5f757f67d8-plp44 1/2 Running 0 55s istio-policy-6978f6fff4-9brxk 2/2 Running 0 55s istio-sidecar-injector-58996b77bd-vxnwh 0/1 Running 0 55s istio-statsd-prom-bridge-55965ff9c8-tfgrk 1/1 Running 0 56s istio-telemetry-bb6b55b67-5mrld 2/2 Running 0 55s prometheus-7456f56c96-wq4x6 1/1 Running 0 55s grafana-59bdd9c89c-9zfl7 1/1 Running 0 55s
2. SidecarのInjection
Data Planeを作るには、以下のようにSidecarをデプロイしていきます。
istioctl kube-inject -f samples/sleep/sleep.yaml | kubectl apply -f -
ここでsamples...
は例です。
また、特定のnamespaceにできるPodにEnvoyを自動的に挿入することも可能です。
その場合は以下のラベルを名前空間につけます。
kubectl label namespace default istio-injection=enabled
普段のkubectl apply
をするマニフェストファイルにこれを入れるだけで十分です。
確認すると以下のようにContainer数が2になっていました。
NAME READY STATUS RESTARTS AGE test-1-6cf9fc7dd-w7mzk 2/2 Running 0 14s
以上でインストールは終わりになります。
Task
Traffic管理
ここはA/Bテストやカナリアデプロイなど、トラフィックに関することを行う。
項目が多いため、別途使うときになれば記事にしようと思います。
セキュリティ
私はセキュリティには詳しくないため割愛します。
Policies
これはポリシーという制限をかけるものである。
Rate Limits
どのくらいのトラフィックがくるかを制御できるものである。
ブラック・ホワイトリスト
NginxやSELinuxを使った人がある人ならわかるかもしれません。
ブラックリストとは全アクセスを許容する中で特定のIPアドレスは例外で受け付けない様にするIPのリストです。
Telemetrics
分散トレーシング
CNCFプロジェクトであるJaegerを使っています。これは--set tracing.enabled=true
を指定することで設定できます。
記事の内容からそれるので、Jaegerそのものについては説明はしません。
マイクロサービスは複数のサービスで構成されているのでサービスを跨いで(分散して)処理したリクエストもトレースできるのが分散トレース。
以下のようになります。
以下のようにしてポート転送をします。
kubectl port-forward -n istio-system $(kubectl get pod -n istio-system -l app=jaeger -o jsonpath='{.items[0].metadata.name}') 16686:16686 &
すると以下の様な画面が出ます。
GrafanaでIstioの監視
Grafanaを開くと一部だか、以下のようなダッシュボードがある。
Pilot Dashboard
Wordload Dashboard
以上のようなものがありIstio自体の監視をすることができます。
それ以外にもGrafanaはIstio本体だけではなくて、サービスメッシュも確認することができます。
なぜかServiceMeshが出ていません、解決次第、修正します。
これはLinkerdのOverviewとよく似ています。
サービスグラフによる可視化
これによってIstioメッシュのサービスのグラフを作成することができる。
以下のようにしてポート転送をします。
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=servicegraph -o jsonpath='{.items[0].metadata.name}') 8088:8088 &
ここでhttp://localhost:8088/force/forcegraph.htmlにアクセスしてください。
このようにサービス間と元のデプロイメントにpolicy
とtelemetry
が接続されていることがわかります。
クリーンアップ
Istioのアンインストール
以下のようにするとistio
をアンインストールすることができます。
helm delete --purge istio
addons
先ほどもgrafana
を追加したように、デフォルトではインストールされないものがあります。
これはこのリストから選ぶことができます。
dependencies: - name: sidecarInjectorWebhook version: 1.0.1 condition: sidecarInjectorWebhook.enabled - name: security version: 1.0.1 condition: security.enabled - name: ingress version: 1.0.1 condition: ingress.enabled - name: gateways version: 1.0.1 condition: gateways.enabled - name: mixer version: 1.0.1 condition: mixer.enabled - name: pilot version: 1.0.1 condition: pilot.enabled - name: grafana version: 1.0.1 condition: grafana.enabled - name: prometheus version: 1.0.1 condition: prometheus.enabled - name: servicegraph version: 1.0.1 condition: servicegraph.enabled - name: tracing version: 1.0.1 condition: tracing.enabled - name: galley version: 1.0.1 condition: galley.enabled - name: kiali version: 1.0.1 condition: kiali.enabled - name: certmanager version: 1.0.1 condition: certmanager.enabled
これを
-set [CONDITON]=[BOOL]
で渡すことによって有効化や無効化ができます。
まとめ
Istioは圧倒的にできることが多いので、学習コストが高いように感じた。
特にレイテンシなどを調査したいときに使うべきはLinkerdだなと感じた。
追記: 2019/05/24
GKEでIstio addonがBeta版になっています。
すでに存在するクラスタには
gcloud beta container clusters update istio-cluster \ --update-addons=Istio=ENABLED --istio-config=auth=MTLS_STRICT
のようにするとaddonを導入することができます。