概要
Cloud Service Mesh は、高度なトラフィック管理、オブザーバビリティ、セキュリティなどのサービス ネットワーキング機能をアプリケーションに提供します。ただし、サービス メッシュの構成と運用は複雑なタスクです。このページでは、Kubernetes Gateway API を使用して Cloud Service Mesh を構成する方法について説明します。これらの API は、メッシュ構成の全体的な作業を省力化し、改善するように設計されています。
メッシュ用 Kubernetes Gateway API を使用すると、プロキシレス gRPC と Envoy プロキシの両方のデプロイ用に Cloud Service Mesh を構成できます。メッシュ用 Gateway API のモデルには、いくつかの主な利点があります。
- Gateway API は、Kubernetes クラスタ内の Ingress(南北)トラフィックとサービス メッシュ(東西)トラフィックの両方を管理するための単一の一貫したインターフェースを提供します。
- サービス メッシュを使用すると、高度なトラフィック ルーティング パターンを実現できます。Gateway API を使用すると、複雑なルーティング ルールを設計して管理できます。
- Gateway API を使用すると、デベロッパーは基盤となるサービス メッシュの実装について深く理解する必要がないため、マイクロサービスへの高レベルのルーティング ルールとポリシーの定義に集中できます。
- この API は拡張可能な設計となっているため、将来の拡張や新しいプロトコルとユースケースのサポートが可能です。
- Gateway API には強力なコミュニティの支援があり、拡大するサービス メッシュ プロバイダとツールのエコシステムによってサポートされています。
サービス メッシュのユースケースをサポートする GAMMA イニシアチブは、v1.1.0 以降、Standard チャンネルの一部であり、一般提供と見なされます。
仕様は、アプリケーション オーナーが、parentRef
として Kubernetes Service
リソースを使用して Route resource
(xRoute
とも呼ばれます)を構成することにより、メッシュ サービスのトラフィック ルールを構成することを推奨しています。このアプローチは、GEP-1324: Gateway API のサービス メッシュで定義されている Kubernetes Service
の「フロントエンド」ロールと「バックエンド」ロールによって異なります。ここでは、「フロントエンド」ロールが parentRef
として使用され、Service
の「バックエンド」ロールが backendRef
として使用されます。準拠実装では、Service
名を使用して、トラフィックと正規 IP アドレスの backendRef
エンドポイントを照合します。
メッシュ用 Gateway API
Kubernetes プロジェクトである Gateway API は、Kubernetes 内のレイヤ 4 と 7 のルーティングに重点を置いています。これは、Ingress、ロード バランシング、サービス メッシュ API の後継となります。汎用性があり、説明的、かつロール中心となるように設計されており、その構成は主にルーティング レイヤにあります。
HTTPRoute
や GRPCRoute
などのプロトコル固有のリソースを使用すると、高度な上り(内向き)ルーティングとメッシュ ルーティングを可能にします。
GAMMA イニシアチブ(サービス メッシュ用 Gateway API)は、同じクラスタ内のサービス間またはEast/West トラフィックに Gateway API を使用する方法を定義します。GAMMA は、Gateway API のロール指向の性質を維持しながら、Gateway API への変更を最小限にとどめながらサービス メッシュを構成するように Gateway API を使用する方法を確立することを目的としています。GAMMA では、基盤となるテクノロジーやプロキシに関係なく、Gateway API のさまざまなサービス メッシュ実装間で整合性を促進することの重要性も強調しています。
GAMMA は Gateway API 仕様の既存の拡張ポイントを利用するため、API の変更や新しいリソースは必要ありません。これは、サービス メッシュのユースケースを通知するようにルートリソースの定義(Gateway API の GRPCRoute または HTTPRoute)を拡張することで行われます。具体的には、サービス メッシュ用の Gateway API で説明されているように、ルートリソースを Service リソースに関連付けます。
次の例は、HTTPRoute の使用におけるメッシュのユースケースを示しています。
apiVersion: gateway.networking.k8s.io
kind: HTTPRoute
metadata:
name: echo-route
spec:
parentRefs:
- kind: Service
group: ""
name: echo-service
rules:
- backendRefs:
- name: echo-v1
port: 80
weight: 9
- backendRefs:
- name: echo-v2
port: 80
weight: 1
HTTPRoute は Service
を parentRef
として参照します。これは、HTTPRoute ルートがサービス メッシュのユースケース用に構成されていることを示します。上の例では、echo-service Service が parentRef
として指定されています。これは、HTTPRoute が echo-service のフロントエンドに接続されていることを意味します。クライアントから echo-service に送信されるトラフィックは、HTTPRoute echo-route に従ってルーティングされます。
GRPCRoute はまた別の Kubernetes Gateway API リソースであり、gRPC トラフィックを Kubernetes サービスに転送するために使用されます。ユーザーは、gRPC トラフィックを明示的にルーティングし、gRPC メソッドとサービス マッチングなど、gRPC 向けに調整された機能を利用する場合は、HTTPRoute ではなく GRPCRoute を使用します。
次の例は、GRPCRoute の使用方法を示しています。
apiVersion: gateway.networking.k8s.io
kind: GRPCRoute
metadata:
name: echo-route
spec:
parentRefs:
- kind: Service
group: ""
name: echo-service
rules:
- matches:
- method:
service:echo_basic.grpcecho.GrpcEcho
method: Echo
backendRefs:
- name: grpc-infra-backend-v1
port: 8080
- matches:
- method:
service:echo_basic.grpcecho.GrpcEcho
method: EchoTwo
backendRefs:
- name: grpc-infra-backend-v2
port: 8080
HTTPRoute の例と同様に、この GRPCRoute はサービス メッシュのユースケース用に構成されています。プロキシレス gRPC クライアントによって xds:///echo-service.default.svc.cluster.local:8080
に送信されたトラフィックは、GRPCRoute echo-route に従ってルーティングされます。この例のルートルールは gRPC メソッドと一致し、トラフィックを特定の backendRef
に転送します。GRPCRoutes は、xds:///
接頭辞がドロップされたときに、Envoy などのサイドカー インジェクションを使用してプロキシされたクライアントからのリクエストをルーティングするためにも使用できます。