APISIX Ingress ControllerでGateway APIを使用する方法
Yeqi Peng
November 11, 2022
Kubernetes Gateway APIとは
Gateway APIは、KubernetesのネイティブなServiceやIngressに加えて、クラスタ外にサービスを公開するためのもう一つのコミュニティ主導の仕様(sig-networkによって管理されています)です。
Gateway APIは、HTTP、TCP、UDPなどの一般的なネットワークプロトコルやTLSをサポートしています。さらに、Gateway APIにはGatewayリソースが含まれており、Kubernetes APIを通じてプロキシやゲートウェイのライフサイクルを管理することが可能です。
Gateway APIが必要な理由
Ingressと比較して、Gateway APIはIngressの機能的な上位互換であり、以下のような改善点があります:
- ロール指向: Gatewayは、Kubernetesのサービスネットワーキングを使用および設定する組織のロールをモデル化したAPIリソースで構成されています。
- 表現力が豊か: Gateway APIリソースは、ヘッダーベースのマッチング、トラフィックの重み付けなどのコア機能をサポートしており、これらはIngressではカスタムアノテーションを通じてのみ実現可能でした。
- 拡張性: Gateway APIは、APIのさまざまな層でカスタムリソースをリンクすることを可能にし、API構造内の適切な場所で細かいカスタマイズを実現します。
さらに、この仕様には、移植性、共有ゲートウェイ、クロスネームスペース参照などの機能も含まれています。
図に示すように、ロール指向の設計により、クラスタ内のネットワークインフラを異なるチーム間で共有し、クラスタ管理者によって設定されたポリシーや制約を共有することができます。これにより、インフラプロバイダー、クラスタ管理者、アプリケーション開発者などの異なるタイプのロールが、他のロールの責任範囲に気を取られることなく、自身の作業に集中できるようになります。
異なるロールが異なるレベルのGateway APIリソースを設定し、それらのレベルが連携して動作します:
Gateway APIの現状
現在、Gateway API v0.5.0のリリースに伴い、GatewayClass、Gateway、HTTPRouteなどの重要なコアAPIが初めてBeta版となりました。
APISIX IngressでGateway APIを使用する方法
APISIX Ingress ControllerのGateway APIサポートは開発中であり、現在はAlpha段階で、HTTPRouteやTCPRouteなどのリソースをサポートしています。
Gateway API CRDのインストール
Gateway APIを使用するには、まずGateway APIのCRDをインストールする必要があります。これは、APISIX Ingress Controllerリポジトリのコピーまたは公式リポジトリkubernetes-sigs/gateway-apiからインストールできます。ここでは、APISIX Ingress ControllerリポジトリのCRDのコピーを使用する例を示します。
以下のコマンドを実行して、Gateway APIのCRDをインストールします。
git pull git@github.com:apache/apisix-ingress-controller.git
cd apisix-ingress-controller
kubectl apply -f ./samples/deploy/gateway-api/
APISIX Ingress Controllerのインストール
APISIX Ingress Controllerでは、デフォルトでGateway APIサポートが有効になっていないため、-enable-gateway-api=true
パラメータを使用して有効にすることができます。
Helmを使用してインストールする場合、valuesを設定することで有効にできます。
以下のコマンドを使用して、APISIXとAPISIX Ingress Controllerをインストールします。
helm repo add apisix https://charts.apiseven.com
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
kubectl create ns apisix-ingress
helm install apisix apisix/apisix --namespace apisix-ingress \
--set gateway.type=NodePort \
--set ingress-controller.enabled=true \
--set ingress-controller.config.apisix.serviceNamespace=apisix-ingress \
--set ingress-controller.config.kubernetes.enableGatewayAPI=true
-set ingress-controller.config.kubernetes.enableGatewayAPI=true
パラメータに注意してください。これはGateway APIサポートを有効にするために使用されます。
これらのコマンドは、apisix-ingress
ネームスペースの下にAPISIX、etcd、APISIX Ingress Controllerを含む完全なテスト環境を作成します。
テストロードのデプロイ
kennethreitz/httpbin
イメージをテストロードとして使用します。
以下のコマンドを使用して、これらのロードをデフォルトのネームスペースにデプロイします。
kubectl run httpbin --image kennethreitz/httpbin --port 80
kubectl expose pod httpbin --port 80
HTTPRouteの設定
現在、APISIX Ingress ControllerはGateway APIリソースのv1alpha2
バージョンをサポートしています。
テストのために、以下のHTTPRoute設定を使用し、httproute.yaml
ファイルに保存します:
# httproute.yaml
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: HTTPRoute
metadata:
name: basic-http-route
spec:
hostnames:
- local.httpbin.org
rules:
- backendRefs:
- name: httpbin
port: 80
matches:
- path:
type: PathPrefix
value: /
以下のコマンドを使用して、このHTTPRoute設定をデプロイします:
kubectl apply -f ./httproute.yaml
検証
APISIX Pod内で直接以下のコマンドを実行して検証できます:
kubectl -n apisix-ingress exec -it $(kubectl -n apisix-ingress get Pods -l "app.kubernetes.io/name=apisix" -o name) -c apisix -- curl -H "Host: local.httpbin.org" localhost:9080/ip
期待される出力は以下の通りです:
{
"origin": "127.0.0.1"
}
これは、設定が正常に適用されたことを示しています。
APISIX IngressがGateway APIをサポートする方法
現在、APISIX Ingress ControllerはGateway APIのサポートを追加中であり、HTTPRoute、TCPRouteなどのリソースをサポートしています。
APISIX Ingress ControllerのGatewayおよびGateway Classのサポートは積極的に開発中であるため、これらのリソースの設定は現時点では有効になりません。
まとめ
この記事では、クラスタ外にサービスを公開するためのコミュニティの新しい仕様であるGateway APIを紹介し、APISIX Ingress Controllerでそれをどのように使用するかを説明しました。
APISIX Ingress ControllerでのGateway APIの完全なサポートは、現在積極的に開発中です。