IstioとAmeshを使用したAPISIX Service Mesh
June 16, 2023
Apache APISIX は主に南北トラフィックを処理するために使用され、クライアントアプリケーションとバックエンドサービスの境界に位置することが多いです。
APISIX Ingress Controller を使用することで、APISIX は Kubernetes クラスター内のイングレス・エグレストラフィックをネイティブな設定で制御することもできます。
しかし、組織がマイクロサービスを採用するにつれて、これらのマイクロサービス間の東西トラフィックを処理する新しい課題が生じています。
Istio のようなサービスメッシュは、マイクロサービスの開発者からネットワーキングの責任を取り除き、追加の L4/L7 ネットワーキングレイヤーを提供することでこれを解決します。
新しい Amesh ライブラリと Istio を使用することで、Apache APISIX もサービスメッシュとして使用できるようになります。具体的には、Istio のデータプレーンとして機能し、そのすべてのトラフィック管理機能をサービス間通信に適用します。
この記事では、Amesh とは何か、どのように開発されたのか、そして APISIX をサービスメッシュに組み込むためにどのように使用されるのかを検討します。
Istio と xDS プロトコル
Istio は、最も広く使用されているサービスメッシュの一つです。
内部では、Istio はサイドカーコンテナ内のリバースプロキシとして Envoy を使用しています。
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 が Istio のデータプレーンとして Envoy を置き換えます。
Istio は xDS API を介してデータプレーンと通信します。Amesh はこれらの API をサポートし、それを APISIX の設定に変換します。
これは、APISIX と APISIX Ingress コントローラーがどのように動作するかと似ています。Ingress コントローラーは、Ingress または Gateway API を使用して定義された設定を APISIX 形式に変換します。
xDS API は Linkerd や Open 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 を開くと、サンプルアプリケーションが表示されます。
ページを更新するたびに、レビューが異なるバージョンのレビューサービスから取得されます(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 バージョンにのみルーティングされます。
レビューセクションの外観が変わったことに注目してください。ページを更新しても同じままです。
まとめると、Istio でルールを設定し、Istio がそのサイドカーコンテナを使用して Apache APISIX でそれを実装します。素晴らしいですね!
Amesh の今後
Amesh は実験的なプロジェクトであり、まだ初期段階にあります。
将来のバージョンでは、仮想サービスを通じてさらに多くの機能をサポートすることを目指しています。
プロジェクトの改善に貢献したり、新しいバージョンを追跡したりするには、GitHub をご覧ください。