メインコンテンツまでスキップ

Kubernetes に Istio をデプロイする

· 約7分

kubernetes はすでに運用上の大部分の問題を解決しており、動的スケーリング、スケジューリング、イメージ管理、コンテナダウン時の再起動、コンピュートノードの監視など、優れた自動運用の仕組みを備えています。しかし k8s は、アプリケーション層での監視やトラフィック管理、アプリケーション間の相互呼び出しの調整、サービスレジストリ、設定センターといった機能は提供していません。そこで登場したのが、Service Mesh アーキテクチャの代表的プロダクトである Istio です。

Istio は Google、IBM、Lyft の三社が共同開発したフレームワークで、主な役割は k8s 環境においてマイクロサービス間のトラフィックを制御、接続、保護、設定、観測することです。これにより、マイクロサービスを開発する際に、煩雑で複雑、保守性が低く強く結合した低レベルのマイクロサービス SDK を捨てられるようになります。

Istio のアーキテクチャ

アーキテクチャ上、Istio はデータプレーンとコントロールプレーンに分かれます。

データプレーンの核心となる発想が Sidecar(サイドカーパターン)です。同一 pod 内に proxy 代理コンテナを追加してビジネスコンテナのトラフィックを引き受け、ビジネスコードに一切侵入することなく、さまざまな機能を実現します。例えば、ロードバランシング、トラフィックの暗号化、監視、ポリシー(カナリアリリース、Blue-Green デプロイ)、サーキットブレーカー、フォールバック、リモートサービス呼び出し、設定センター、サービスレジストリなど、よく使われるマイクロサービス機能です(ただし分散トランザクションの管理は担当しません。これは理屈から言っても、確かに Istio が引き受けるべき範疇ではないでしょう)。

コントロールプレーンは、プロキシを管理・設定してトラフィックをルーティングする役割を担います。さらにコントロールプレーンは Mixer を設定してポリシーの適用とテレメトリデータの収集・表示を行い、サービス呼び出しチェーンの分析やサービストポロジー図などの機能を提供します。

ビジネスコードが SpringCloud、Dubbo、Motan、ServiceComb といった強い結合を持つ特定のマイクロサービス SDK に依存しなくなるため、ビジネスシーンに応じて開発言語を選び、異なる言語の開発チームがそれぞれビジネス開発を進められるようになり、全体の効率が上がります。細々としたサービス登録、設定、リモート呼び出しの管理は、すべて Istio に任せてしまえばよいのです。

コンポーネント紹介

citadel:身元認証と証明書管理を担うコアセキュリティコンポーネント。

galley:設定管理を担うコンポーネント。設定ファイルのフォーマットや内容の正しさを検証し、それらの設定情報を pilot や mixer に提供します。

pilot:制御の中枢で、サービスディスカバリとルールの変換・配布を含みます。

proxy:C++ で開発された Envoy と Pilot-agent によって実装され、動的サービスディスカバリ、ロードバランシング、TLS、サーキットブレーカー、ヘルスチェック、トラフィック分割、カナリアなどの機能を提供します。さらにテレメトリデータを生成し、マイクロサービスに可観測性をもたらします。

Ingressgateway:入口の gateway です。つまり、メッシュ外からメッシュ内のサービスへのアクセスはこの gateway を通じて行われます。

詳細な中国語公式ドキュメント:Istio / ドキュメント

デプロイの流れ

ここでは最も簡単な Helm によるインストールを使います。

1)なぜ Helm を使うのか

Helm は K8S クラスタにおけるパッケージ管理ツールの役割を担います。Service、Pod、Ingress といった K8S の各種リソースを宣言するには Yaml ファイルを書く必要があります。しかしマイクロサービスが増え、さらに redis クラスタ、mysql 高可用クラスタ、Hadoop クラスタなどが加わると、書くべき Yaml ファイルはどんどん増え、書き間違いのリスクも伴います。より重要なのは、ビジネスの成長に伴って他の地域にも K8S クラスタをデプロイした場合、マルチリージョン・アクティブ構成では同じ Pod 群をもう一度デプロイし直す必要が出てくることです。このようなとき Helm はこの種の問題をうまく解決してくれます。Helm の Chart には、一つの完全なサービスに必要なすべての Yaml ファイル設定が含まれているのです。

Helm の利点:

  • yaml ファイルの効率的な再利用を実現する。
  • 大量の yaml ファイルを一つのまとまりとして管理できる。
  • アプリケーションレベルのバージョン管理を実現する。

その後は企業内部の Chart リポジトリを構築することもできます。そうすれば、企業が何かのサービスを必要とするときに、煩雑な Yaml ファイルをもう書く必要はなく、Helm で Chart を実行するだけで K8S クラスタに対応する Pod をデプロイし、目的の機能サービスを手に入れられます。

2)Helm のインストール

Helm を使うにはまずインストールが必要です(公式サイト):Helm | ドキュメント (helm.sh)

インストール時は Helm と Kubernetes のバージョンサポートに注意してください:Helm | Helm バージョンサポートポリシー

3)Istio のインストール

インストールの実行:Istio / Helm によるインストール

Istio コンポーネント用の名前空間 istio-system を作成します。

$ kubectl create namespace istio-system

Istio base chart をインストールします。これには Istio コントロールプレーンが使用するクラスタスコープのリソースが含まれています。

# 公式サイトには対応する chart リポジトリが記載されていないので、ここで補足しておく
$ helm repo add istio https://istio-release.storage.googleapis.com/charts
$ helm install istio-base istio/base -n istio-system

Istio discovery chart をインストールします。これは istiod サービスのデプロイに使われます。

$ helm install istiod istio/istiod -n istio-system --wait

(オプション)Istio のイングレスゲートウェイをインストールします。

Linux カーネルは 4.11 以上が必須です。お使いの Linux カーネルバージョンが要件を満たしているか各自確認してください。

# イングレスゲートウェイ用の名前空間を作成し、sidecar の自動注入を有効化する
$ kubectl create namespace istio-ingress
$ kubectl label namespace istio-ingress istio-injection=enabled
$ helm install istio-ingress istio/gateway -n istio-ingress --wait

Istio ingress のデプロイが完了したら、Istio 公式の demo プロジェクトである Bookinfo マイクロサービスをデプロイして、Istio のさまざまな能力を体験できます。

Bookinfo

公式サイト:Istio / Bookinfo アプリケーション

Bookinfo マイクロサービスは Istio によるサイドカーデプロイを採用しており、4 種類の異なる言語のプログラムで構成されています。さらに Java で開発された Reviews サービスは 3 つの異なるバージョンのアプリケーションを提供しており、マルチバージョン管理、トラフィック管理、移行、統合における Istio の能力をよく体現しています。

まとめ

Istio はサービスガバナンスをビジネスコードから切り離します。データプレーンは Sidecar でトラフィックを引き受け、コントロールプレーンはルーティングとポリシーを一元的に配布し、ビジネス側はもはや特定言語のマイクロサービス SDK に縛られません。デプロイ面では Helm の助けを借りれば、install コマンド三つで base、istiod、イングレスゲートウェイをインストールでき、大量の Yaml を手書きするよりずっと楽です。インストール後に公式の Bookinfo サンプルを一通り動かせば、多言語・マルチバージョンのトラフィック管理能力はほぼ体験できます。その先は自分たちのビジネスと組み合わせて、カナリアリリースやサーキットブレーカーといった能力を少しずつ活用していきましょう。

COMMENTS