Gateway API は Kubernetes 向けの次世代ルーティングおよび負荷分散 API です。本トピックでは、ACK Edge クラスター内で Inference Extension を備えた Gateway コンポーネントを使用して、HTTP ルートの構成、リクエストヘッダーの変更、重み付けによるリクエストの分散を行う方法について説明します。
仕組み
Inference Extension を備えた Gateway コンポーネントは Envoy Gateway プロジェクトに基づいており、Gateway API および Envoy Gateway 拡張リソースのすべての基本機能をサポートしています。
Envoy Gateway のアーキテクチャは以下のとおりです。
コントロールプレーン:コントロールプレーンは Envoy Gateway コンポーネントで構成されます。クラスター内のトラフィックルールを監視し、Envoy プロキシインスタンスを動的に作成・管理するとともに、転送ルールをリアルタイムで更新します。コントロールプレーンはサービストラフィックを直接転送しません。
データプレーン:データプレーンは Envoy プロキシインスタンスで構成されます。サービストラフィックを処理および転送します。
ACK Edge クラスターでは、Envoy Gateway のデプロイ方法が標準的な ACK クラスターとは異なります。
相違点 | 標準 ACK | ACK Edge |
サービス公開方法 | LoadBalancer | NodePort |
コントロールプレーンのデプロイ | クラスターレベル | ノードプールごとに 1 セットをデプロイ |
データプレーンのデプロイ | クラスターレベル | ノードプール単位でデプロイ |
複数のノードプール | 1 つのゲートウェイを共有 | 各ノードプールごとに個別のゲートウェイを作成する必要があります |
サービストポロジー | 構成不要 |
|
現在のデプロイはノードプールディストリビューションポリシーで構成されています。コンポーネント管理でレプリカ数を調整し、各ノードプールに少なくとも 1 つのコントロールプレーンレプリカが実行されるようにしてください。

適用範囲
バージョン 1.30 以降のクラスターを作成済みです。
推論拡張機能付きゲートウェイ コンポーネントがインストールされています。
事前準備
ステップ 1:テストアプリケーションの作成
次の例を backend.yaml として保存し、kubectl apply -f backend.yaml コマンドを実行して、backend および backend-2 のテストアプリケーションを作成します。
ACK Edge シナリオでは、サービストポロジーを構成する必要があります。openyurt.io/topologyKeys: openyurt.io/nodepool アノテーションを Service に追加し、トラフィックが同じノードプール内の Pod にのみ転送されるようにしてください。詳細については、「ノードプールサービストポロジー管理」をご参照ください。apiVersion: v1
kind: ServiceAccount
metadata:
name: backend
---
apiVersion: v1
kind: Service
metadata:
name: backend
annotations:
openyurt.io/topologyKeys: openyurt.io/nodepool # ノードプールトポロジーを構成
labels:
app: backend
service: backend
spec:
ports:
- name: http
port: 3000
targetPort: 3000
selector:
app: backend
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend
spec:
replicas: 1
selector:
matchLabels:
app: backend
version: v1
template:
metadata:
labels:
app: backend
version: v1
spec:
serviceAccountName: backend
containers:
- image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/envoygateway-echo-basic:v20231214-v1.0.0-140-gf544a46e
imagePullPolicy: IfNotPresent
name: backend
ports:
- containerPort: 3000
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: backend-2
---
apiVersion: v1
kind: Service
metadata:
name: backend-2
annotations:
openyurt.io/topologyKeys: openyurt.io/nodepool # ノードプールトポロジーを構成
labels:
app: backend-2
service: backend-2
spec:
ports:
- name: http
port: 3000
targetPort: 3000
selector:
app: backend-2
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend-2
spec:
replicas: 1
selector:
matchLabels:
app: backend-2
version: v1
template:
metadata:
labels:
app: backend-2
version: v1
spec:
serviceAccountName: backend-2
containers:
- image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/envoygateway-echo-basic:v20231214-v1.0.0-140-gf544a46e
imagePullPolicy: IfNotPresent
name: backend-2
ports:
- containerPort: 3000
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespaceステップ 2:GatewayClass の確認
Inference Extension を備えた Gateway コンポーネントをインストールすると、デフォルトで GatewayClass が作成されます。次のコマンドを実行して確認します。
kubectl get gatewayclass期待される出力:
NAME CONTROLLER ACCEPTED AGE
ack-gateway gateway.envoyproxy.io/gatewayclass-controller True 2m31sGatewayClass リソースが見つからない場合は、手動で作成できます。次の例を gatewayclass.yaml として保存し、kubectl apply -f gatewayclass.yaml コマンドを実行して作成します。
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
name: ack-gateway
spec:
controllerName: gateway.envoyproxy.io/gatewayclass-controllerステップ 3:カスタム EnvoyProxy 構成の作成
ACK Edge クラスターでは、各ノードプールごとにカスタム EnvoyProxy 構成を作成し、データプレーン Pod のスケジューリング先ノードプールおよびサービス公開方法を指定できます。
次の例の NPXXX を実際のノードプール ID に置き換えます。その後、構成を gateway-config.yaml として保存し、kubectl apply -f gateway-config.yaml コマンドを実行します。
ノードプール ID は、ACK コンソールの ページで確認できます。
apiVersion: gateway.envoyproxy.io/v1alpha1
kind: EnvoyProxy
metadata:
name: custom-proxy-config
spec:
provider:
type: Kubernetes
kubernetes:
envoyDeployment:
pod:
nodeSelector:
alibabacloud.com/nodepool-id: NPXXX # 実際のノードプール ID に置き換えてください
envoyService:
annotations:
openyurt.io/topologyKeys: openyurt.io/nodepool # サービストポロジーを構成
type: NodePort # ACK Edge では NodePort を使用してサービスを公開この構成には、ACK Edge シナリオ向けの以下の 3 つの重要な設定が含まれています。
構成項目 | 説明 |
| ゲートウェイデータプレーン Pod を指定されたノードプールにスケジューリング |
| サービストポロジーを構成し、トラフィックがノードプール内に留まるように保証 |
| NodePort を使用してサービスを公開。エッジシナリオでは LoadBalancer は使用しません。 |
ステップ 4:Gateway リソースの作成
次の例を gateway.yaml として保存し、kubectl apply -f gateway.yaml コマンドを実行します。
コンポーネントのコントロールプレーンは、Gateway リソースに基づいて自動的に EnvoyProxy Deployment および NodePort サービスを作成します。また、ノード上の指定されたポートでリスナーを起動します。
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: ack-gateway
spec:
gatewayClassName: ack-gateway
listeners:
- name: http
protocol: HTTP
port: 80
infrastructure:
parametersRef:
group: gateway.envoyproxy.io
kind: EnvoyProxy
name: custom-proxy-config # ステップ 3 で作成したカスタム構成に関連付けステップ 5:ゲートウェイエンドポイントの取得
ゲートウェイサービスは NodePort として公開されます。対応するサービスエンドポイントは、ノードプール内の任意のノードの IP アドレスとそのサービスポートです。
サービスポートを照会します。
kubectl get service -n kube-system -l gateway.envoyproxy.io/owning-gateway-name=ack-gateway期待される出力:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE envoy-default-ack-gateway-7452df7d NodePort 192.168.86.174 <none> 80:30364/TCP 19mゲートウェイホスト環境変数を設定できます。
NODEIPをノードプール内の任意のノードの IP アドレスに、NODEPORTを前のステップで取得したポート番号に置き換えます。export GATEWAY_HOST=NODEIP:NODEPORT