IstioとAmeshを使用したAPISIX Service Mesh

Navendu Pottekkat

Navendu Pottekkat

June 16, 2023

Technology

Apache APISIX は主に南北トラフィックを処理するために使用され、クライアントアプリケーションとバックエンドサービスの境界に位置することが多いです。

APISIX Ingress Controller を使用することで、APISIX は Kubernetes クラスター内のイングレス・エグレストラフィックをネイティブな設定で制御することもできます。

しかし、組織がマイクロサービスを採用するにつれて、これらのマイクロサービス間の東西トラフィックを処理する新しい課題が生じています。

Istio のようなサービスメッシュは、マイクロサービスの開発者からネットワーキングの責任を取り除き、追加の L4/L7 ネットワーキングレイヤーを提供することでこれを解決します。

新しい Amesh ライブラリと Istio を使用することで、Apache APISIX もサービスメッシュとして使用できるようになります。具体的には、Istio のデータプレーンとして機能し、そのすべてのトラフィック管理機能をサービス間通信に適用します。

この記事では、Amesh とは何か、どのように開発されたのか、そして APISIX をサービスメッシュに組み込むためにどのように使用されるのかを検討します。

Istio と xDS プロトコル

Istio は、最も広く使用されているサービスメッシュの一つです。

内部では、Istio はサイドカーコンテナ内のリバースプロキシとして Envoy を使用しています。

Istio サービスメッシュ

Istio は、Envoy の xDS API を使用してサイドカーを動的に設定することでトラフィックを管理します。

xDS API は、静的なファイルによる単純な設定ではなく、増分変更で Envoy を設定する方法です。

これらの API は当初 Envoy を設定するために設計されましたが、ユニバーサルデータプレーン API として進化しました。どのデータプレーンプロキシもこれらの API を実装でき、どのコントロールプレーンもこの API を使用してこれらのデータプレーンプロキシと連携できます。

Istio では、これはデフォルトの Envoy データプレーンを xDS API を実装する任意のデータプレーンに置き換えることができることを意味します。したがって、Envoy を APISIX に置き換えて、サービスメッシュ内でそのトラフィック管理機能を利用できます。

しかし、APISIX は xDS API をデフォルトでサポートしていません。そこで Amesh が登場します。

Amesh

Amesh は、Istio のコントロールプレーンからのデータを APISIX の設定に変換するライブラリです。

APISIX サービスメッシュ

APISIX が Istio のデータプレーンとして Envoy を置き換えます。

Istio は xDS API を介してデータプレーンと通信します。Amesh はこれらの API をサポートし、それを APISIX の設定に変換します。

これは、APISIX と APISIX Ingress コントローラーがどのように動作するかと似ています。Ingress コントローラーは、Ingress または Gateway API を使用して定義された設定を APISIX 形式に変換します。

xDS API は LinkerdOpen Service Mesh などの他のサービスメッシュでもサポートされているため、APISIX は Amesh ライブラリを使用してこれらと連携することもできます。Amesh はまだ開発の初期段階にあり、現在は Istio v1.13.1 で動作します。

Amesh + APISIX を使用すると、通常通り Istio を使用できます。Istio の 仮想サービス でトラフィックルールを設定すると、APISIX がこれらのルールを実装します。

APISIX の拡張機能は、80以上のプラグイン を通じて提供されます。Istio で APISIX プラグインを使用するために、Amesh コントロールプレーンコンポーネントである Amesh コントローラーをデプロイします。

Amesh コントローラーは、AmeshPluginConfig CRD で定義されたプラグイン設定を受け取り、それを APISIX プラグイン設定に変換します。

これにより、サイドカーコンテナ内で APISIX の全機能を活用できるようになります。

APISIX + Istio メッシュ

ここまで学んだことを実際に試してみましょう。

Amesh イメージをビルドし、Istio を設定して APISIX サイドカーを使用し、Istio をデプロイし、サンプルアプリケーションを実行してすべてをテストします。

イメージのビルド

以下の3つのイメージをビルドします:

  • amesh-iptables: すべてのトラフィックを APISIX 経由で流すための iptables ルールを設定する init コンテナを作成するために使用されます。
  • amesh-sidecar: サイドカーコンテナを作成するために使用されます。
  • amesh-controller: Amesh コントローラーコントロールプレーンコンポーネントを作成するために使用されます。このコントローラーは APISIX プラグインを設定するために使用されます。

まず、Amesh リポジトリ をクローンします:

git clone https://github.com/api7/Amesh.git
cd Amesh

これらのイメージをビルドして、自分のレジストリにプッシュできます。

ビルドを実行する前に、以下のように環境変数にレジストリのアドレスを追加します:

export REGISTRY="docker.io/navendu"
make prepare-images

独自のイメージをビルドしたくない場合は、以下のイメージを使用できます:

docker pull navendup/amesh-iptables:dev
docker pull navendup/amesh-sidecar:dev
docker pull navendup/amesh-controller:latest

Amesh コントローラーのデプロイと CRD のインストール

Kubernetes クラスターにすべてをデプロイするために Helm を使用します。これらの例では minikube を使用しています。

まず、新しい名前空間 istio-system を作成します:

kubectl create namespace istio-system

Amesh コントローラーをデプロイするには、以下を実行します:

helm install amesh-controller -n istio-system \
./controller/charts/amesh-controller

また、Amesh コントローラーと連携するために CRD をインストールする必要があります:

kubectl apply -k controller/config/crd/

Istio + APISIX の設定とデプロイ

サービスメッシュをデプロイする前に、いくつかの環境変数を設定します:

export ISTIO_RELEASE=1.13.1
export REGISTRY="docker.io/navendup"

次に、Helm を使用してサービスメッシュをデプロイします:

helm install amesh \
--namespace istio-system \
--set pilot.image=istio/pilot:"$ISTIO_RELEASE" \
--set global.proxy.privileged=true \
--set global.proxy_init.image="$REGISTRY"/amesh-iptables:dev \
--set global.proxy.image="$REGISTRY"/amesh-sidecar:dev \
--set global.imagePullPolicy=IfNotPresent \
--set global.hub="docker.io/istio" \
--set global.tag="$ISTIO_RELEASE" \
./charts/amesh

これで、サービスメッシュと Amesh コントローラーがデプロイされました。次に、サンプルアプリケーションをデプロイしてサービスメッシュをテストします。

Bookinfo のデプロイ

Istio の Bookinfo サンプルアプリを使用します。

まず、デフォルトの名前空間にラベルを追加して、名前空間内のすべてのポッドにサイドカーを自動的に注入できるようにします:

kubectl label ns default istio-injection=enabled

次に、Bookinfo をデプロイします:

kubectl apply -f e2e/bookinfo/bookinfo.yaml

これにより、Bookinfo アプリケーションが起動し、各ポッドに APISIX サイドカーが含まれます:

$ kubectl get pods

NAME                              READY   STATUS    RESTARTS   AGE
details-v1-79f774bdb9-cbn87       2/2     Running   0          55s
productpage-v1-6b746f74dc-tntc8   2/2     Running   0          55s
ratings-v1-b6994bb9-r5j45         2/2     Running   0          55s
reviews-v1-545db77b95-n657s       2/2     Running   0          55s
reviews-v2-7bf8c9648f-zn97s       2/2     Running   0          55s
reviews-v3-84779c7bbc-wn8k2       2/2     Running   0          55s

メッシュのテスト

Bookinfo アプリケーションにアクセスするには、イングレスゲートウェイが必要です。

APISIX をこのイングレスゲートウェイとして使用できますが、それはまた別の機会にしましょう。今のところ、port-forward を使用して product-page サービスにアクセスできます:

kubectl port-forward productpage-v1-6b746f74dc-tntc8 9080:9080

これで、localhost:9080 を開くと、サンプルアプリケーションが表示されます。

Bookinfo ホームページ

ページを更新するたびに、レビューが異なるバージョンのレビューサービスから取得されます(3つのバージョンをデプロイしました)。

次に、すべてのトラフィックをサービスの v1 バージョンにルーティングする仮想サービスを使用してルールを適用します。

このルールは自明で、以下のようになります:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: productpage
spec:
  hosts:
  - productpage
  http:
  - route:
    - destination:
        host: productpage
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - route:
    - destination:
        host: ratings
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: details
spec:
  hosts:
  - details
  http:
  - route:
    - destination:
        host: details
        subset: v1
---

このルールをクラスターに適用するには、以下を実行します:

kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.18/samples/bookinfo/networking/virtual-service-all-v1.yaml

これで、アプリケーションに戻ってページを更新すると、レビューサービスの複数のバージョンを循環するのをやめ、v1 バージョンにのみルーティングされます。

Bookinfo v1 のみ

レビューセクションの外観が変わったことに注目してください。ページを更新しても同じままです。

まとめると、Istio でルールを設定し、Istio がそのサイドカーコンテナを使用して Apache APISIX でそれを実装します。素晴らしいですね!

Amesh の今後

Amesh は実験的なプロジェクトであり、まだ初期段階にあります。

将来のバージョンでは、仮想サービスを通じてさらに多くの機能をサポートすることを目指しています。

プロジェクトの改善に貢献したり、新しいバージョンを追跡したりするには、GitHub をご覧ください。

Tags: