Envoy Gatewayを使用したKubernetes Gateway APIの実装

Kubernetes Engine (OKE)を使用して作成するクラスタでKubernetes Gateway APIをサポートするようにEnvoy Gatewayを設定する方法をご確認ください。

Kubernetes Gateway API (Gateway API)は、Kubernetesクラスタでイングレスおよびネットワーク・トラフィックを管理するための次世代標準であり、イングレスAPIを継承します。Gateway APIの詳細は、KubernetesドキュメントのGateway APIおよびGateway APIのドキュメントを参照してください。

Envoy Gatewayは、Envoy Proxyをデータ・プレーンとして管理するGateway APIのオープンソース実装です。これは、ベンダー固有のCRDに依存することなく、イングレス・トラフィックを管理する、標準に準拠した方法を提供します。

Envoy Gatewayをデプロイすることで、これを基礎となるコントローラとして使用して、GatewayHTTPRouteおよびその他のゲートウェイAPIリソースを管理できます。

Envoy Gatewayデプロイメントには、連携する複数のコンポーネントが含まれています。

  • ゲートウェイAPI CRDは、GatewayHTTPRouteなどの新しいリソース・タイプでKubernetes APIを拡張し、イングレス・トラフィックの宣言的な管理を可能にします。
  • Envoyゲートウェイ・コントローラは、コントロール・プレーンとして機能し、ゲートウェイAPIリソースを監視して、データ・プレーンの詳細な構成に変換します。
  • Envoyプロキシ・ポッドは、データ・プレーンを形成し、ゲートウェイ・リソースによって定義されたポリシーおよびルートに従ってネットワーク・トラフィックを処理します。
  • OCI Network Load Balancer統合により、外部トラフィックがEnvoyプロキシ・ノードを介してアプリケーションに適切にルーティングされます。

前提条件

Kubernetes Gateway APIをサポートするようにEnvoy Gatewayを設定する前に:

  • Kubernetes Engineによって作成されたクラスタへのkubectlアクセス権が必要です。
  • クラスタにアクセスするマシンには、Helm CLI (v3.0以上)がインストールされている必要があります。
  • カスタム・リソース定義(CRD)およびコントローラをインストールするには、cluster-admin権限が必要です。

ゲートウェイAPIコントローラとしてのEnvoyゲートウェイの設定

Envoy Gatewayの設定手順の概要

ゲートウェイAPIコントローラとして機能するようにEnvoy Gatewayを設定するステップの概要は、次のとおりです。

ステップ1: ゲートウェイAPI CRDのインストール

Gateway APIカスタム・リソース定義(CRD)は、Kubernetesエンジンを使用して作成するクラスタにデフォルトではインストールされません。Envoy GatewayをゲートウェイAPIコントローラとして使用する前に、CRDをインストールする必要があります。

  1. 次のように入力して、標準チャネルCRD (v1.2.0)をインストールします。

    kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.0/standard-install.yaml
    
  2. 次のように入力して、CRDがインストールされていることを確認します。

    kubectl get crd gateways.gateway.networking.k8s.io
    
  3. CRDが出力に表示されていることを確認します。

ステップ2: Envoy Gatewayのインストール

Helmを使用して、Envoyゲートウェイ・コントローラをインストールします。

  1. 次のように入力して、envoy-gateway-systemネームスペースにチャートをインストールします。

    helm install eg oci://docker.io/envoyproxy/gateway-helm --version v1.6.3 -n envoy-gateway-system --create-namespace
    
  2. 次のように入力して、Envoy Gatewayコントローラの準備が整うのを待ちます。

    kubectl wait --namespace envoy-gateway-system \
      --for=condition=ready pod \
      --selector=control-plane=envoy-gateway \
      --timeout=90s
    

ステップ3: OCI Network Load Balancer統合の構成

EnvoyProxyカスタム・リソースを作成して、Envoy Gatewayが作成するServiceに必要なOCI注釈を注入します。

  1. 次の内容を含むoci-envoy-proxy.yamlという名前のファイルを作成します。

    apiVersion: gateway.envoyproxy.io/v1alpha1
    kind: EnvoyProxy
    metadata:
      name: oci-flexible-proxy
      namespace: envoy-gateway-system
    spec:
      provider:
        type: Kubernetes
        kubernetes:
          envoyService:
            annotations:
              oci.oraclecloud.com/load-balancer-type: "nlb"
    
  2. 次を入力して、EnvoyProxyカスタム・リソースを作成します。

    kubectl apply -f oci-envoy-proxy.yaml
    

ステップ4: GatewayClassの作成

作成したEnvoyProxyを使用するようにコントローラに指示するGatewayClassを作成します。

  1. 次の内容を含むoci-gateway-class.yamlという名前のファイルを作成します。

    apiVersion: gateway.networking.k8s.io/v1
    kind: GatewayClass
    metadata:
      name: oci-gateway-class
    spec:
      controllerName: gateway.envoyproxy.io/gatewayclass-controller
      parametersRef:
        group: gateway.envoyproxy.io
        kind: EnvoyProxy
        name: oci-flexible-proxy
        namespace: envoy-gateway-system
    
  2. 次のように入力してGatewayClassを作成します。

    kubectl apply -f oci-gateway-class.yaml
    

ステップ5: ゲートウェイの作成

OCIネットワーク・ロード・バランサの作成をトリガーするGatewayリソースを作成します。

  1. 次の内容を含むmy-gateway.yamlという名前のファイルを作成します。

    apiVersion: gateway.networking.k8s.io/v1
    kind: Gateway
    metadata:
      name: my-envoy-gateway
      namespace: default
    spec:
      gatewayClassName: oci-gateway-class
      listeners:
      - name: http
        protocol: HTTP
        port: 80
        allowedRoutes:
          namespaces:
            from: Same
    
  2. 次のように入力してGatewayを作成します。

    kubectl apply -f my-gateway.yaml
    
  3. 次のように入力して外部IPアドレスを取得します。

    kubectl get gateway my-envoy-gateway -n default
    

    OCIがロード・バランサをプロビジョニングするのに数分かかる場合があります。

    PROGRAMMED列にTrueが含まれ、IPアドレスがADDRESS列に表示されるまで待機します。

ステップ6: サンプル・アプリケーションをデプロイする

単純なエコー・サービスをデプロイしてゲートウェイをテストします。

  1. 次の内容を含むecho-app.yamlという名前のファイルを作成します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: echo-app
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: echo
      template:
        metadata:
          labels:
            app: echo
        spec:
          containers:
          - name: echo
            image: ealen/echo-server:latest
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: echo-service
      namespace: default
    spec:
      selector:
        app: echo
      ports:
      - port: 80
        targetPort: 80
    
  2. 次の情報を入力してサンプル・アプリケーションを作成します:

    kubectl apply -f echo-app.yaml
    

ステップ7: HTTPRouteの作成

HTTPRouteを作成して、Gatewayからアプリケーションにトラフィックを転送します。

  1. 次の内容を含むecho-route.yamlという名前のファイルを作成します。

    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
      name: echo-route
      namespace: default
    spec:
      parentRefs:
      - name: my-envoy-gateway
      rules:
      - matches:
        - path:
            type: PathPrefix
            value: /
        backendRefs:
        - name: echo-service
          port: 80
    
  2. 次のように入力してHTTPRouteを作成します。

    kubectl apply -f echo-route.yaml
    

ステップ8: 接続の確認

Gatewayの外部IPアドレスにリクエストを送信して、接続を確認します。

  1. ゲートウェイのパブリックIPアドレスを取得し、次のように入力して環境変数として保存します:

    export GATEWAY_IP=$(kubectl get gateway my-envoy-gateway -o jsonpath='{.status.addresses[0].value}')
  2. curlを使用して、次のように入力してリクエストをゲートウェイの外部IPアドレスに送信します。

    curl -i http://$GATEWAY_IP/
    
  3. リクエストの詳細(ヘッダー、ホストなど)を表示するJSON本文とともに、200 OKレスポンスを受信することを確認します。

(オプション)クリーンアップ

必要に応じて、次の情報を入力して、このトピックで作成したリソースを削除できます。

kubectl delete -f echo-route.yaml
kubectl delete -f echo-app.yaml
kubectl delete -f my-gateway.yaml
kubectl delete -f oci-gateway-class.yaml
kubectl delete -f oci-envoy-proxy.yaml
helm uninstall eg -n envoy-gateway-system

このクラスタでゲートウェイAPIが不要になった場合は、次のように入力してCRDを削除できます。

kubectl delete -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.0/standard-install.yaml