APISIX Ingress ControllerでGateway APIを使用する方法

Yeqi Peng

November 11, 2022

Products

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構造内の適切な場所で細かいカスタマイズを実現します。

さらに、この仕様には、移植性、共有ゲートウェイ、クロスネームスペース参照などの機能も含まれています。

図に示すように、ロール指向の設計により、クラスタ内のネットワークインフラを異なるチーム間で共有し、クラスタ管理者によって設定されたポリシーや制約を共有することができます。これにより、インフラプロバイダー、クラスタ管理者、アプリケーション開発者などの異なるタイプのロールが、他のロールの責任範囲に気を取られることなく、自身の作業に集中できるようになります。

api-mode.png

異なるロールが異なるレベルのGateway APIリソースを設定し、それらのレベルが連携して動作します:

gateway-roles.png

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の完全なサポートは、現在積極的に開発中です。

Tags: