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 をサポートしています。
V1.24 以降の ASM インスタンスは Gateway API V1.2.0 をサポートしています。
マルチクラスタ モードでは、データ プレーン上の 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: trueenableGatewayAPI を 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 ファイルの${イングレス ゲートウェイの名前}を、デプロイされたイングレス ゲートウェイの名前に置き換えます。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 アドレス}: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 ファイルの
${イングレス ゲートウェイの名前}を、デプロイされたイングレス ゲートウェイの名前に置き換えます。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 アドレス} https://a.aliyun.com/status/418予期される出力:
-=[ teapot ]=- _...._ .' _ _ `. | ."` ^ `". _, \_;`"---"`|// | ;/ \_ _/ `"""`出力は、HTTPS トラフィック ルーティング ルールが有効になっていることを示しています。