マイクロサービス管理ソフトウェア「Istio」とは

運用

はじめに

マイクロサービスを管理するソフトウェアである「Istio(イスティオ)」について、サンプルアプリケーションを動かしながら説明していきたいと思います。

マイクロサービスとは

マイクロサービスとは、1つのアプリケーションを機能や運用・保守の単位に基づいて、小さな規模のアプリケーションに分解し、それを組み合わせて機能を実現する設計手法です。

対照的な設計パターンとして、モノリシックと呼ばれる1つのアプリケーションの中に、複数の異なる機能を実装する設計パターンがありますが、機能が集中することでコードが巨大になりやすく、異なる機能が混在することで、保守性や拡張性が低下する問題が発生します。

そこでマイクロサービスを取り入れることで、機能改修の際に他の機能に不具合が生じず、1つの機能改修に集中できるメリットが得られます。

一方でアプリケーションを単純に分割して動かしただけでは、マイクロサービスとして機能せず、複雑に張り巡らされた各マイクロサービス間の通信や経路を適切に制御および管理する必要があります。

Istioとは

Istioは、Kubernetes上でマイクロサービスを管理するソフトウェアで、Pod間の通信に関する問題を解決してくれます。

すべてのPodの中にEnvoy(エンヴォイ)と呼ばれる通信を肩代わりするコンテナをアプリケーションに埋め込み、司令塔となるistioのcontrol planeが管理することで、アプリケーションの通信をごっそりEnvoyに移譲することができます。

そのため、開発者はアプリケーションのコアな部分の実装に集中することができるようになります。また、Istioを活用することで、カナリアリリースやカオスエンジニアリングの導入も容易に実現することができます。

https://istio.io/latest/img/service-mesh.svg

Istio Quick Start

Istioは非常に簡単に機能を試すことができるQuick Startが充実しています。Istioはサンプルは、レビューや評価などを含めた書籍の情報を表示するBookInfoアプリケーションを題材にしています。今回はGoogle Kubernetes Engineを利用して、Istioを動かしていきます。

Istioのダウンロード

IstioではKubernetesのリソースを使ってトラフィックをコントロールするため、DeploymentやServiceと同じくマニフェストを作成して適用します。Istioの管理には、Istioctlバイナリを利用します。

curl -L https://istio.io/downloadIstio | sh -
cd istio-1.16.1
export PATH=$PWD/bin:$PATH

Istioのインストール

Istioのコントロールプレーンをデプロイする際には、プロファイル(default、demo、minimal、preview、etc)を選択できるようになっています。デモプロファイルでは、数多くの監視系コンポーネントを結合したIstioをデプロイします。

istioctl install --set profile=demo -y

Envoyの自動インジェクションは、名前空間単位で有効化/無効化することが可能です。有効化と無効化の制御は、Namespaceリソースにつけられた「isito-injection」ラベルを元に判別されます。デフォルトではすべて無効化されているため、ラベルを付与して有効化します。今回はデフォルトの名前空間上にデプロイされたアプリケーションに対して、自動的にEnvoyがインジェクトされるようにラベルを付与します。

kubectl label namespace default istio-injection=enabled

サンプルアプリケーションのデプロイ

IstioのサンプルアプリケーションであるBookInfoを使って動作を確認します。

kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

BookInfoアプリケーションは、「productpage」「reviews」「ratings」「details」の4つのマイクロサービスから成り立っています。ProductPageでリクエストを受けると、書籍のレビューを返すReviewsサービスと書籍の詳細情報を返すDetailsサービスにアクセスし、ProductPageはReviewsとDetailsの結果をもとにユーザにレスポンスを返すようになっています。

また、Reviewsサービスにはv1/v2/v3の3つのバージョンがあり、v1はRatingなし、v2は黒星でのRating表示、v3は色のついた星でのRating表示となっています。

https://istio.io/latest/docs/examples/bookinfo/noistio.svg

GatewayとVirtual Serviceの作成

次に実際にリクエストを受けるために、GatewayVirtual Serviceを作成します。GatewayとVirtual Serviceを利用することで、トラフィックをBookinfoアプリケーションに転送することが可能となります。

kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml

トラフィックはistio-ingressgateway Serviceに送れば良いため、ServiceのIPアドレスを確認し、GATEWAY_URL環境変数に登録しておきます。

export GATEWAY_URL=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')

ここまでくればブラウザで「http://$(GATEWAY_URL)/productpage」にアクセスすることで、BookInfoアプリがデプロイされていることが確認できます。

Kialiダッシュボードによる可視化

Kialiダッシュボードにより、マイクロサービス間の通信状況を可視化することができます。Kialiでは、Istioの設定情報の各ににゃKubernetesのDeploymentやServiceリソースの確認なども行えます。Kialiをインストールするには下記のコマンドを実行します。

kubectl apply -f samples/addons
kubectl rollout status deployment/kiali -n istio-system
istioctl dashboard kiali
Kialiによるマイクロサービス間の可視化

Istioの応用例

応用例としてTrafic Shifting機能を説明します。これは古いバージョンから新しいバージョンへ徐々にトラフィックを切り替えることができる機能で、例えばv1バージョンへ80%、v2バージョンへ20%の割合でトラフィックを流す場合は、下記のようにVirtual Serviceを設定することで実現できます。

まず各マイクロサービスに対するDestinationRuleを作成し、kubectl applyを実行します。

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: productpage
spec:
  host: productpage
  subsets:
  - name: v1
    labels:
      version: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
  - name: v3
    labels:
      version: v3
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: ratings
spec:
  host: ratings
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
  - name: v2-mysql
    labels:
      version: v2-mysql
  - name: v2-mysql-vm
    labels:
      version: v2-mysql-vm
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: details
spec:
  host: details
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
---

次にv1バージョンは80%、v2バージョンは20%の割合でトラフィックを流す設定を行い、kubectl applyします。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
      weight: 80
    - destination:
        host: reviews
        subset: v2
      weight: 20

Kialiで確認すると、reviewsのトラフィックがv1とv2で振り分けられていることが確認できます。

v1とv2にトラフィックを流すReviewsサービスの可視化

このようにIstioを活用することで、カナリアリリースカオスエンジニアリングA/Bテストなどを容易に実現することができます。

まとめ

Istioはマイクロサービスを管理するソフトウェアで、Quick Startで確認したように、Pod間の通信に関する問題を解決してくれるため、開発者はよりアプリケーションのコアな部分の実装に集中することができるようになります。また、Istioを活用することで、カナリアリリースやカオスエンジニアリングの導入も容易に実現することができるため、ぜひ活用してみてください。

コメント

タイトルとURLをコピーしました