Slide 1

Slide 1 text

入門 2022/06 李 俊起

Slide 2

Slide 2 text

本日のゴール Who • Istio導入を検討している(すでに導入している)システムの担当者 • Istioという単語を聞いたことはあるけど何をするものかよく分からない方 What • Istioの機能(何を解決してくれるか)を理解した上で、 担当システムへのIstio導入について適切に判断できるようになる • Istioについて何となく分かった気になれる!(李含む)

Slide 3

Slide 3 text

本日の構成 • 座学 • Service Meshとは • Service Meshが登場した(必要となった)背景 • Istioの機能 • Istioの構成 • デモ • Traffic Management • Observerbility • まとめ

Slide 4

Slide 4 text

Service Meshとは • 各アプリ(Service)の隣にProxyを配置し、アプリ(Service)同士の すべての通信を、プロキシーを経由するよう(Mesh)にした状態

Slide 5

Slide 5 text

Service Meshが登場した背景 • マイクロサービスアーキテクチャの台頭 A 機能 B 機能 D 機能 モノリス C 機能 マイクロサービス A 機能 B 機能 D 機能 C 機能 API API API API

Slide 6

Slide 6 text

マイクロサービスに潜む課題 マイクロサービス A 機能 B 機能 D 機能 C 機能 API API API API • ネットワークは不安定という前提 →リトライ、タイムアウト • 過剰なAPI Callから自身を守る必要がある →流量制限 • カスケード障害の恐れ →サーキットブレーカー • 障害/遅延発生時、原因箇所の特定が困難 →俯瞰的な監視 • サービス同士でネットワーク通信が発生 →通信の暗号化 Istioですべて解決!

Slide 7

Slide 7 text

Istioの機能 ✓ タイムアウト ✓ リトライ ✓ フォールトインジェクション ✓ カナリアリリース ✓ B/Gデプロイメント ✓ 流量制限 ✓ サーキットブレーカー ✓ Kiali ✓ テレメトリーデータの生成 (OSSツールとの高い親和性) ✓ mTLS

Slide 8

Slide 8 text

Istioの構成 • Control Plane ➢ サービスメッシュ全体を司る司令塔(istiod) ✓ トラフィックの設定をProxyに反映 ✓ 証明書管理/配布 ✓ Proxyからテレメトリーデータを収集 • Data Plane ➢ Sidecar Proxy(Envoy) ✓ 実際トラフィックを制御 ✓ テレメトリーデータを生成

Slide 9

Slide 9 text

v1.5からIstioの構成がシンプルに 1.5からistiodという 1つのPodになった

Slide 10

Slide 10 text

Demo

Slide 11

Slide 11 text

デモ用アプリの構成 Client Calculate DB Image ・以下をまとめてHTMLをレンダリング - Imageからのペット写真 - DBからのペット情報 - Calculateからの計算結果 ・計算結果を返すAPI ・DB/Image API Gateway ・ペットの情報を返すAPI ・ペットの写真を返すAPI

Slide 12

Slide 12 text

Istioインストール/アプリデプロイ • istioctlインストール ➢ curl -sL https://istio.io/downloadIstioctl | sh - • istioインストール ➢ istioctl install --set profile=default -y • istioインストール確認 ➢ kubectl get po,svc –n istio-system

Slide 13

Slide 13 text

Sidecar Proxy(Envoy)がない!? • Sidecar Proxyを挿入したいnamespace(ns)に以下のラベルを付与 ➢ kubectl label ns <対象namespace> istio-injection=enabled • アプリを削除後、再デプロイ • PodのREADY列の値が「1/1」→「2/2」に変わったことを確認 • IstioのSidecar Injectorが「istio-injection=enabled」ラベルが 付いているnsにPodが払い出される時、PodにEnvoyコンテナを挿入

Slide 14

Slide 14 text

インストール(デプロイ)直後の状態 ELB EKS Cluster Ingress Gateway Client Calculate DB Image Client Calculate DB Image Ingress Gatewayと ClientのServiceを 関連付ける必要がある Ingress Gatewayの受付設定が必要 エッジProxy メッシュProxy

Slide 15

Slide 15 text

IngressGatewayとServiceの紐づけ VirtualService Ingress Gateway Client Gateway Ingress Gatewayが受け付ける Port番号とProtocolを指定 このルールを適用する Ingress Gatewayを指定 webサイトのドメインを指定 Gatewayのhostsに合せる 紐づけるIngress Gatewayを指定 ※Gatewayの[metadata.name]に合せる 設定反映 トラフィックを流すServiceとポート番号を指定 Client ELB 8 0 8 0

Slide 16

Slide 16 text

①Traffic Management

Slide 17

Slide 17 text

タイムアウト、リトライを試すための設定 Client Calculate Clientから計算を求められた時に 20秒間Sleepするようにアプリを修正 Calculate向け通信に タイムアウト時間を設定して、 タイムアウトさせる 1 2 Calculate向け通信にタイムアウト時間を 設定して、タイムアウトが発生した際、 リトライする 3 タイムアウト リトライ

Slide 18

Slide 18 text

タイムアウト、リトライ • タイムアウト • リトライ Calculate向けの通信に 2秒のタイムアウトを設定 「retryOn」に指定した事象が発生した時に 「attempts」の数の分リトライする。 「perTryTimeout」は最初のリクエスト &リト ライ時のタイムアウト時間

Slide 19

Slide 19 text

フォールトインジェクション Client Calculate Calculate向け通信で503エラー発生 「httpStatus」のエラーを 「percentage.value」の確率で発生させる

Slide 20

Slide 20 text

カナリアリリース、 B/Gデプロイメント Client Calculate dog-with-multi Calculate cat-with-plus 90% 10% Calculate向け通信において 「version: cat-plus」ラベルのPodは 「cat-with-plus」というsubsetとして定義 Calculate向け通信において 「version: dog-multi」ラベルのPodは 「dog-with-multi」というsubsetとして定義 Calculate向け通信の90%を 「cat-with-plus」subsetにルーティング Calculate向け通信の10%を 「dog-with-multi」subsetにルーティング

Slide 21

Slide 21 text

Darkリリース (Dark Launching) • Darkリリースとは ユーザに影響を与えず(もしくは一部のユーザのみに)新機能をリリースして リスクなしに(もしくは少ないリスクで)新機能を試すリリース方式 HTTPヘッダーに「version: dog」が ある場合はdog-with-multiに、それ以外場合は cat-with-plusにルーティングする Client Calculate cat-with-plus Calculate dog-with-multi version: dog ヘッダー有 version: dog ヘッダー無

Slide 22

Slide 22 text

流量制限(Rate Limit) • 2種類のRate Limitが存在 1. Global Rate Limit ➢ クラスター全体に適用する流量制限 2. Local Rate Limit ➢ 特定のインスタンス(アプリ)に適用する流量制限

Slide 23

Slide 23 text

Global Rate Limit • rate limit serviceという別コンポーネントのデプロイが必要 • リクエストのたびにrate limit serviceに加算され、 クォータを超えたら“429 Too Many Requests”を返す Ingress Gateway ratelimit 429 クォータ超過時 ※今回は1分以内に5回以上 リクエストが発生したら 429を返すように設定 rate limit service

Slide 24

Slide 24 text

Local Rate Limit • rate limit serviceなど別コンポーネント不要 • tokenのbucketがあり、リクエストのたびにtokenが消費され、 tokenを使い切ったら“429 Too Many Requests”を返す • tokenは一定時間後補充される

Slide 25

Slide 25 text

サーキットブレーカー 10s以内にErrorが 3回以上発生したら 30s間対象Podを切り離す Client Calculate dog-with-multi Calculate cat-with-plus 5秒間Sleep Calculate向け通信に1秒の タイムアウト時間を設定して、 cat-with-plus向け通信を タイムアウトさせる。 タイムアウトが3回以上 発生したらcat-with-plusへの ルーティングを取りやめる

Slide 26

Slide 26 text

②Observability

Slide 27

Slide 27 text

Kiali • Istio専用の観測ツール • Service Map等、クラスター全体の状態が確認できる • サービス(アプリ)ごとのメトリクス/ログも確認可能 • Istioの設定確認/変更もできる

Slide 28

Slide 28 text

メトリクス • Prometheus形式でメトリクスを生成(Envoy) • Istio自身に関するメトリクス • トラフィック関連メトリクス • GrafanaでIstio専用ダッシュボードが用意されている ※ダッシュボードをImportするだけ

Slide 29

Slide 29 text

分散トレーシング • Envoyがトレースデータを生成 • Jaeger等、バックエンド側を用意するだけでOK • が、Istioの分散トレーシングには1つ注意点が・・・。

Slide 30

Slide 30 text

トレースがつながってない理由 • Envoyは自動でContextを生成/伝搬 • アプリはトレースの存在について知らない(伝搬しない) • ヘッダーにあるContextを伝搬するようアプリ側の実装が必要 Client Calculate Ingress Gateway ・x-b3-traceid ・x-b3-spanid ・x-b3-traceid ・x-b3-spanid ・x-b3-traceid ・x-b3-spanid ・x-b3-traceid ・x-b3-spanid Context生成 ・x-b3-traceid ・x-b3-spanid 新Context生成 ・x-b3-traceid ・x-b3-spanid ・x-b3-traceid ・x-b3-spanid 新Context生成

Slide 31

Slide 31 text

③Security

Slide 32

Slide 32 text

mTLS • クラスター内のIn/Outすべての通信を暗号化 • デフォルトで適用 Client Calculate DB Image Ingress Gateway EKS Cluster

Slide 33

Slide 33 text

まとめ

Slide 34

Slide 34 text

Service Meshは本当に必要なのか • Istio利用にはそれなりの稼働が必要。(定期的なバージョンアップなど) • システムにService Meshのどの機能が必要で、代替手段はないか確認 • 必要な機能によってはマネージドサービス(App Mesh)の利用を検討 ※YouTube https://www.youtube.com/watch?v=ZwfdLAClzsc ※資料 https://speakerdeck.com/toricls/service-meshes-do-we-really-need-them-what- problems-do-they-solve

Slide 35

Slide 35 text

✓ タイムアウト ✓ リトライ → 共通ライブラリ ✓ カナリアリリース ✓ フォールトインジェクション → 利用シーンが少ない ✓ B/Gデプロイメント → Argo Rollouts等 ✓ 流量制限 → OWL、OWX ✓ サーキットブレーカー → 閾値設定の難しさ ✓ Kiali ✓ テレメトリーデータ → Opentelemetry、X-Ray Datadog、Prometheus等 ✓ mTLS → 閉域網内で完結 する場合がほとんど Service Meshは本当に必要なのか

Slide 36

Slide 36 text

Istio VS AWS App Mesh 機能 / ツール Istio AWS App Mesh Proxy Envoy Envoy Operations Cost High (自前構築/運用) Low (マネージドサービス) (追加料金なし) Retry / Timeout 〇 〇 Weighted routing 〇 〇 Rate Limit 〇 X (※1) Curcuit Breaker 〇 〇 mTLS 〇 〇 Observability 〇 〇 (※2) ※1 一応ロードマップにはRate Limitの機能追加が載っている ※2 分散トレーシング利用のためには有効化する必要がある

Slide 37

Slide 37 text

資材公開しています • 本日使用した資材はすべてgitに上げています! ぜひ付録のハンズオン手順をもとに実際手を動かして試してみて下さい! • 実行環境 • EKS v1.21

Slide 38

Slide 38 text

※付録 ハンズオン手順

Slide 39

Slide 39 text

Istioインストール • istioctlインストール ➢ curl -sL https://istio.io/downloadIstioctl | sh - • istioインストール ➢ istioctl install --set profile=default -y • istioインストール確認 ➢ kubectl get po,svc –n istio-system • default namespaceに以下のラベルを付与 ➢ kubectl label ns default istio-injection=enabled

Slide 40

Slide 40 text

デモ用アプリ/Gatewayデプロイ • デモ用アプリのデプロイ ➢ git clone https://github.com/nutslove/python.git ➢ cd python/FastAPI ➢ kubectl apply -f 00_Application/ • Gatewayデプロイ ➢ kubectl apply –f 01_IngressGateway/ • ブラウザから下記コマンドで出力されるLoadBalancerの EXTERNAL-IPにアクセスし、デモ用アプリが表示されることを確認 ➢ kubectl get svc –n istio-system ※ELBのSGから80ポートを、ワーカーノードのSGから30000~32767を許可しておくこと

Slide 41

Slide 41 text

タイムアウト • Timeout用アプリのデプロイし、新しいcalculate-v1のPodが動いていることを確認 ➢ kubectl apply -f 02_Timeout/calculate_v1_sleep.yml • ブラウザから画面下部の数字1と数字2に適当に数字を入れて 「足し算」を押下し、しばらく(20秒間)結果が返ってこないことを確認 • IstioのTimeoutの設定を適用する ➢ kubectl apply -f 02_Timeout/Istio_Timeout.yml • 再度ブラウザから数字1と数字2に適当に数字を入れて 「足し算」を押下し、2秒後「Timeout Error」が返ってくることを確認 • IstioのTimeoutの設定を削除する ➢ kubectl delete -f 02_Timeout/Istio_Timeout.yml

Slide 42

Slide 42 text

リトライ • IstioのRetryの設定を適用する ➢ kubectl apply -f 03_Retry/ • ブラウザから数字1と数字2に適当に数字を入れて 「足し算」を押下し、8秒後「Timeout Error」が返ってくることを確認 • IstioのRetryの設定を削除する ➢ kubectl delete -f 03_Retry/ ➢ kubectl apply -f 00_Application/

Slide 43

Slide 43 text

フォールトインジェクション • IstioのFault Injectionの設定を適用する ➢ kubectl apply -f 04_Fault_Injection/ • ブラウザからアクセスし、「503 Service Unavailable」が表示されることを確認 • IstioのFault Injectionの設定を削除する ➢ kubectl delete -f 04_Fault_Injection/

Slide 44

Slide 44 text

カナリアリリース • v2のcalculateをデプロイ ➢ kubectl apply -f 05_CanaryRelease_BG_Deployment/calculate_v2/ • ブラウザから何回かアクセスし、犬/猫が交互に表示されることを確認 • IstioのWeighted routingの設定を適用する ➢ kubectl apply -f 05_CanaryRelease_BG_Deployment/ • ブラウザから何回かアクセスし主に猫が、たまに犬が表示されることを確認

Slide 45

Slide 45 text

B/Gデプロイメント • viでdogのweightを100、catのweightを0にして再適用する ➢ vi 05_CanaryRelease_BG_Deployment/Istio_Canary_Release.yml ➢ kubectl apply –f 05_CanaryRelease_BG_Deployment/ • ブラウザからアクセスし、犬だけが表示されることを確認 • IstioのCanary Releaseの設定を削除する ➢ kubectl delete -f 05_CanaryRelease_BG_Deployment/

Slide 46

Slide 46 text

Darkリリース • ブラウザ(Chrome/Edge)の拡張機能「Mod Header」をインストールする • IstioのDark Releaseの設定を適用する ➢ kubectl apply -f 06_Dark_Release/ • ブラウザからアクセスし、猫だけが表示されることを確認 • Mod HeaderのRequest headersから「version: dog」を設定した後、 ブラウザからアクセスし、犬だけが表示されることを確認 • IstioのDark Releaseの設定を削除する ➢ kubectl delete -f 05_CanaryRelease_BG_Deployment/calculate_v2/ ➢ kubectl delete -f 06_Dark_Release/

Slide 47

Slide 47 text

流量制限(Global Rate Limit) • IstioのGlobal Rate Limitの設定を適用する ➢ kubectl apply -f 07_RateLimits/Istio_Global_RateLimiting.yml • ブラウザから6回目のアクセスで429エラーが表示されることを確認 • IstioのGlobal Rate Limitの設定を削除する ➢ kubectl delete -f 07_RateLimits/Istio_Global_RateLimiting.yml

Slide 48

Slide 48 text

流量制限(Local Rate Limit) • IstioのLocal Rate Limitの設定を適用する ➢ kubectl apply -f 07_RateLimits/Istio_Local_RateLimiting.yml • ブラウザから数字1と数字2に適当に数字を6回入れて、 6回目で「Too Many Requests」が返ってくることを確認 ※初回は6回目以上クリックが必要だったり、 60s経過前に制限が解除されたりすることがある • IstioのLocal Rate Limitの設定を削除する ➢ kubectl delete -f 07_RateLimits/Istio_Local_RateLimiting.yml

Slide 49

Slide 49 text

サーキットブレーカー • IstioのCircuit Breakerの設定をデプロイ ➢ kubectl apply -f 08_CircuitBreakers/ • 以下curlで一定数の“Timeout Error”が発生した後、 “犬と掛け算の部屋”だけが表示されることを確認 ➢ while true; do curl -s http:/// ¥ | grep '

' && sleep 0.5 ;done • IstioのCircuit Breakerの設定を削除する ➢ kubectl delete -f 08_CircuitBreakers/ ➢ kubectl apply -f 00_Application/

Slide 50

Slide 50 text

Observability • 各種Observabilityツールをデプロイ ➢ kubectl apply -f 09_Observability/ • トレースのサンプリングの数値を修正 ➢ kubectl -n istio-system edit deploy istiod ➢ 「PILOT_TRACE_SAMPLING」の値を100に修正してから「:wq」で保存 • Kiali → ブラウザより「<ワーカーノードのPublic IP>:32000」にアクセス • Grafana →ブラウザより「<ワーカーノードのPublic IP>:32001」にアクセス • Jaeger → ブラウザより「<ワーカーノードのPublic IP>:32002」にアクセス

Slide 51

Slide 51 text

ヘッダーの伝搬 • ヘッダー伝搬対応バージョンをデプロイ ➢ kubectl apply -f 10_Header_Propagation/ • JaegerにてトレースがIngress GatewayからDB/Imageまで つながっていることを確認