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をデプロイすることで、これを基礎となるコントローラとして使用して、Gateway、HTTPRouteおよびその他のゲートウェイAPIリソースを管理できます。
Envoy Gatewayデプロイメントには、連携する複数のコンポーネントが含まれています。
- ゲートウェイAPI CRDは、
GatewayやHTTPRouteなどの新しいリソース・タイプで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をインストールする必要があります。
-
次のように入力して、標準チャネルCRD (v1.2.0)をインストールします。
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.0/standard-install.yaml -
次のように入力して、CRDがインストールされていることを確認します。
kubectl get crd gateways.gateway.networking.k8s.io - CRDが出力に表示されていることを確認します。
ステップ2: Envoy Gatewayのインストール
Helmを使用して、Envoyゲートウェイ・コントローラをインストールします。
-
次のように入力して、
envoy-gateway-systemネームスペースにチャートをインストールします。helm install eg oci://docker.io/envoyproxy/gateway-helm --version v1.6.3 -n envoy-gateway-system --create-namespace -
次のように入力して、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注釈を注入します。
-
次の内容を含む
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" -
次を入力して、
EnvoyProxyカスタム・リソースを作成します。kubectl apply -f oci-envoy-proxy.yaml
ステップ4: GatewayClassの作成
作成したEnvoyProxyを使用するようにコントローラに指示するGatewayClassを作成します。
-
次の内容を含む
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 -
次のように入力して
GatewayClassを作成します。kubectl apply -f oci-gateway-class.yaml
ステップ5: ゲートウェイの作成
OCIネットワーク・ロード・バランサの作成をトリガーするGatewayリソースを作成します。
-
次の内容を含む
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 -
次のように入力して
Gatewayを作成します。kubectl apply -f my-gateway.yaml -
次のように入力して外部IPアドレスを取得します。
kubectl get gateway my-envoy-gateway -n defaultOCIがロード・バランサをプロビジョニングするのに数分かかる場合があります。
PROGRAMMED列にTrueが含まれ、IPアドレスがADDRESS列に表示されるまで待機します。
ステップ6: サンプル・アプリケーションをデプロイする
単純なエコー・サービスをデプロイしてゲートウェイをテストします。
-
次の内容を含む
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 -
次の情報を入力してサンプル・アプリケーションを作成します:
kubectl apply -f echo-app.yaml
ステップ7: HTTPRouteの作成
HTTPRouteを作成して、Gatewayからアプリケーションにトラフィックを転送します。
-
次の内容を含む
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 -
次のように入力して
HTTPRouteを作成します。kubectl apply -f echo-route.yaml
ステップ8: 接続の確認
Gatewayの外部IPアドレスにリクエストを送信して、接続を確認します。
-
ゲートウェイのパブリックIPアドレスを取得し、次のように入力して環境変数として保存します:
export GATEWAY_IP=$(kubectl get gateway my-envoy-gateway -o jsonpath='{.status.addresses[0].value}') -
curlを使用して、次のように入力してリクエストをゲートウェイの外部IPアドレスに送信します。curl -i http://$GATEWAY_IP/ - リクエストの詳細(ヘッダー、ホストなど)を表示する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