Gateway API は、SIG-NETWORK コミュニティによって管理されているオープンソースプロジェクトです。このプロジェクトは、表現力豊かで拡張性があり、ロール指向のインターフェースを提供することにより、サービスネットワーキングを進化させることを目的としています。 Gateway API を使用して、クラスター内のアプリケーションにアクセスするためのルーティングルールを定義できます。このトピックでは、Gateway API を使用して、クラスター内のアプリケーションにアクセスするためのルーティングルールを定義する方法について説明します。
前提条件
Container Service for Kubernetes(ACK)クラスターが、v1.18 以後の Service Mesh(ASM)インスタンスに追加されていること。詳細については、「ASM インスタンスへのクラスターの追加」をご参照ください。
イングレスゲートウェイがデプロイされており、イングレスゲートウェイでポート 80 と 443 が有効になっていること。詳細については、「イングレスゲートウェイの作成」をご参照ください。
httpbin アプリケーションがデプロイされていること。詳細については、「手順 1」の「httpbin アプリケーションのデプロイ」をご参照ください。
使用方法
バージョンの説明:
V1.18 の ASM インスタンスは Gateway API V0.6.0 をサポートしています
V1.22 以後の ASM インスタンスは Gateway API V1.1 および GRPCRoute をサポートしています。
マルチクラスターモードでは、データプレーン上の 2 つのクラスターの同じ名前空間で同じ名前のゲートウェイリソースが構成されている場合、後で適用されたリソースによって以前に作成されたリソースが上書きされます。
手順 1:Gateway API コンポーネントの CRD が ACK クラスターに作成されていることを確認する
デフォルトでは、Gateway API コンポーネントの CustomResourceDefinitions(CRD)は、バージョンが V1.24 以後の ACK クラスターに自動的に作成されます。次の操作を実行して、CRD が ACK クラスターに作成されていることを確認できます。
次のコマンドを実行して、CRD が ACK クラスターに作成されているかどうかを確認します。
kubectl get crds | grep gateway.networking.k8s.io
出力が次のコードブロックのようになっている場合、CRD は作成されています。
gatewayclasses.gateway.networking.k8s.io 2023-05-10T02:51:33Z gateways.gateway.networking.k8s.io 2023-05-10T02:51:33Z httproutes.gateway.networking.k8s.io 2023-05-10T02:51:33Z referencegrants.gateway.networking.k8s.io 2023-05-10T02:51:33Z
次のコマンドを実行して、CRD のバージョンを確認します。
kubectl get crds -o yaml | grep 'gateway.networking.k8s.io/bundle-version'
予期される出力:
gateway.networking.k8s.io/bundle-version: v0.6.0 gateway.networking.k8s.io/bundle-version: v0.6.0 gateway.networking.k8s.io/bundle-version: v0.6.0 gateway.networking.k8s.io/bundle-version: v0.6.0
出力が Gateway API コンポーネントの CRD を含まない場合は、ACK コンソール にログインし、[アドオン] ページで Gateway API コンポーネントをインストールします。詳細については、「コンポーネントの管理」をご参照ください。
手順 2:ASM インスタンスの Gateway API を有効にする
kubeconfig ファイルの情報に基づいて kubectl を使用して ASM インスタンスに接続し、default という名前の ASMMeshConfig に enableGatewayAPI: true
フィールドを追加します。
apiVersion: istio.alibabacloud.com/v1beta1
kind: ASMMeshConfig
metadata:
name: default
spec:
enableGatewayAPI: true
enableGatewayAPI
を true として指定すると、コントロールプレーンは Gateway API コンポーネントの CRD を生成します。 Gateway API コンポーネントと Istio の両方にゲートウェイリソースが含まれています。そのため、kubectl を使用して同じコマンドを実行して 2 つのゲートウェイリソースをクエリすると、競合が発生する可能性があります。 Gateway API コンポーネントのゲートウェイリソースをクエリするには、kubectl get gtw
コマンドを実行します。 Istio のゲートウェイリソースをクエリするには、kubectl get gw
コマンドを実行します。
手順 3:HTTP トラフィックルーティングルールを構成する
次のセクションでは、Gateway API を使用して HTTP トラフィックルーティングルールを構成する方法について説明します。ルーティングルールは、イングレスゲートウェイで httpbin アプリケーションを公開するために使用されます。 ACK クラスターにゲートウェイと HTTPRoute を作成する必要があります。
ゲートウェイを作成します。
次の内容を含む gateway.yaml ファイルを作成します。
ファイル内の構成は、ゲートウェイが指定されたイングレスゲートウェイに適用され、
host
が*.aliyun.com
であるリスナーが作成されることを示しています。すべての名前空間のルーティングルールでリスナーを使用できます。リスナーはポート 80(HTTP)を使用します。 YAML ファイルの${Name of the ingress gateway}
を、デプロイされたイングレスゲートウェイの名前に置き換えます。kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスターに接続し、次のコマンドを実行してゲートウェイをデプロイします。
kubectl apply -f gateway.yaml
HTTPRoute を作成します。
次の内容を含む http-route.yaml ファイルを作成します。
ファイル内の構成は、ルーティングルールが istio-system 名前空間の
gateway
という名前のゲートウェイを使用することを示しています。使用するリスナーの名前を指定していないため、ここではゲートウェイのすべてのリスナーが使用されます。パスが/get
で始まるリクエストは、同じ名前空間の httpbin アプリケーションのポート 8000 にルーティングされます。kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスターに接続し、次のコマンドを実行して HTTPRoute をデプロイします。
kubectl apply -f http-route.yaml
次のコマンドを実行して、イングレスゲートウェイを使用して httpbin アプリケーションにアクセスし、HTTP トラフィックルーティングルールが有効になっているかどうかを確認します。
curl -I -HHost:httpbin.aliyun.com "http://${IP address of the ingress gateway}:80/get"
予期される出力:
HTTP/1.1 200 OK server: istio-envoy date: Fri, 12 May 2023 08:16:30 GMT content-type: application/json content-length: 516 access-control-allow-origin: * access-control-allow-credentials: true x-envoy-upstream-service-time: 4
上記の出力では、
200 OK
が返されていることがわかります。これは、HTTP トラフィックルーティングルールが有効になっていることを示しています。
手順 4:HTTPS トラフィックルーティングルールを構成する
次のセクションでは、Gateway API を使用して HTTPS トラフィックルーティングルールを構成し、ルールを使用してイングレスゲートウェイで httpbin アプリケーションを公開し、イングレスゲートウェイで Transport Level Security(TLS)ターミネーションを実行する方法について説明します。 ACK クラスターにゲートウェイと HTTPRoute を作成する必要があります。
ASM の証明書管理機能を使用して、a.aliyun.com ホストが HTTPS を使用する証明書を作成します。証明書の名前を myexample-credential に設定します。詳細については、「手順 1:複数のサーバーのサーバー証明書と秘密鍵を準備する」をご参照ください。
ゲートウェイを作成します。
次の内容を含む gateway-https.yaml ファイルを作成します。
YAML ファイルの
${Name of the ingress gateway}
を、デプロイされたイングレスゲートウェイの名前に置き換えます。kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスターに接続し、次のコマンドを実行してゲートウェイをデプロイします。
kubectl apply -f gateway-https.yaml
HTTPRoute を作成します。
次の内容を含む httpbin-https.yaml ファイルを作成します。
kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスターに接続し、次のコマンドを実行して HTTPRoute をデプロイします。
kubectl apply -f httpbin-https.yaml
次のコマンドを実行して、イングレスゲートウェイを使用して httpbin アプリケーションにアクセスし、HTTPS トラフィックルーティングルールが有効になっているかどうかを確認します。
curl -k -H Host:a.aliyun.com --resolve a.aliyun.com:443:{IP address of the deployed ingress gateway} https://a.aliyun.com/status/418
予期される出力:
-=[ teapot ]=- _...._ .' _ _ `. | ."` ^ `". _, \_;`"---"`|// | ;/ \_ _/ `"""`
出力は、HTTPS トラフィックルーティングルールが有効になっていることを示しています。