ウェイポイントプロキシの設定

ウェイポイントプロキシとは、定義されたワークロードセットにレイヤー7(L7)処理を追加するための、Envoyベースのプロキシのオプションのデプロイメントです。

ウェイポイントプロキシはアプリケーションとは独立してインストール、アップグレード、およびスケールされます。アプリケーションのオーナーは、その存在を意識する必要はありません。サイドカーデータプレーンモードでは、各ワークロードと並行してEnvoyプロキシのインスタンスを実行しますが、必要なプロキシの数を大幅に削減できます。

ウェイポイント、またはウェイポイントのセットは、類似のセキュリティ境界を持つアプリケーション間で共有できます。これは、特定のワークロードのすべてのインスタンス、または名前空間内のすべてのワークロードである可能性があります。

サイドカーモードとは対照的に、アンビエントモードでは、ポリシーは宛先ウェイポイントによって適用されます。多くの点で、ウェイポイントはリソース(名前空間、サービス、またはポッド)へのゲートウェイとして機能します。Istioは、リソースに入ってくるすべてのトラフィックがウェイポイントを通過し、そのリソースのすべてのポリシーを適用することを強制します。

ウェイポイントプロキシが必要ですか?

アンビエントの階層的なアプローチにより、ユーザーはIstioをより段階的に採用し、メッシュなしの状態から、セキュアなL4オーバーレイ、完全なL7処理へとスムーズに移行できます。

アンビエントモードの機能のほとんどは、ztunnelノードプロキシによって提供されます。Ztunnelは、レイヤー4(L4)でのみトラフィックを処理するようにスコープされているため、共有コンポーネントとして安全に動作できます。

ウェイポイントへのリダイレクトを構成すると、トラフィックはztunnelによってそのウェイポイントに転送されます。アプリケーションが次のL7メッシュ機能のいずれかを必要とする場合は、ウェイポイントプロキシを使用する必要があります

  • トラフィック管理:HTTPルーティングとロードバランシング、サーキットブレーキング、レート制限、フォールトインジェクション、リトライ、タイムアウト
  • セキュリティ:リクエストタイプやHTTPヘッダーなどのL7プリミティブに基づく豊富な認証ポリシー
  • 可観測性:HTTPメトリクス、アクセスロギング、トレース

ウェイポイントプロキシのデプロイ

ウェイポイントプロキシは、Kubernetes Gatewayリソースを使用してデプロイされます。

ほとんどのKubernetesクラスターでは、Kubernetes Gateway API CRDはデフォルトでインストールされていないため、Gateway APIを使用する前にインストールされていることを確認してください

$ kubectl get crd gateways.gateway.networking.k8s.io &> /dev/null || \
  { kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.0/standard-install.yaml; }

これらのリソースを生成、適用、または一覧表示するには、istioctl waypointサブコマンドを使用できます。

ウェイポイントがデプロイされたら、名前空間全体(または選択したサービスまたはポッド)を登録して、それを使用する必要があります。

特定の名前空間にウェイポイントプロキシをデプロイする前に、名前空間にistio.io/dataplane-mode: ambientというラベルが付いていることを確認してください

$ kubectl get ns -L istio.io/dataplane-mode
NAME              STATUS   AGE   DATAPLANE-MODE
istio-system      Active   24h
default           Active   24h   ambient

istioctlは、ウェイポイントプロキシ用のKubernetes Gatewayリソースを生成できます。たとえば、名前空間内のサービスのトラフィックを処理できる、default名前空間のwaypointという名前のウェイポイントプロキシを生成するには、次のようにします。

$ istioctl waypoint generate --for service -n default
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  labels:
    istio.io/waypoint-for: service
  name: waypoint
  namespace: default
spec:
  gatewayClassName: istio-waypoint
  listeners:
  - name: mesh
    port: 15008
    protocol: HBONE

Gatewayリソースには、istio-waypointラベルがgatewayClassNameに設定されていることに注意してください。これは、Istioによって提供されるウェイポイントであることを示します。Gatewayリソースにはistio.io/waypoint-for: serviceというラベルが付いており、ウェイポイントがサービスのトラフィックを処理できることを示しています。これはデフォルトです。

ウェイポイントプロキシを直接デプロイするには、generateの代わりにapplyを使用します。

$ istioctl waypoint apply -n default
waypoint default/waypoint applied

または、生成されたGatewayリソースをデプロイできます。

$ kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  labels:
    istio.io/waypoint-for: service
  name: waypoint
  namespace: default
spec:
  gatewayClassName: istio-waypoint
  listeners:
  - name: mesh
    port: 15008
    protocol: HBONE
EOF

Gatewayリソースが適用されると、Istiodはリソースを監視し、ユーザーに対応するウェイポイントのデプロイとサービスを自動的にデプロイおよび管理します。

ウェイポイントのトラフィックタイプ

デフォルトでは、ウェイポイントはその名前空間内のサービス宛てのトラフィックのみを処理します。ポッド単独に向けられたトラフィックはまれであり、多くの場合Prometheusスクレイピングなどの内部目的で使用され、L7処理の追加のオーバーヘッドが望ましくない可能性があるため、この選択が行われました。

ウェイポイントは、すべてのトラフィックを処理したり、クラスター内のワークロード(ポッドまたはVM)に直接送信されたトラフィックのみを処理したり、まったくトラフィックを処理しないようにすることもできます。ウェイポイントにリダイレクトされるトラフィックのタイプは、Gatewayオブジェクトのistio.io/waypoint-forラベルによって決定されます。

ウェイポイントにリダイレクトできるトラフィックのタイプを変更するには、istioctl waypoint apply--for引数を使用します。

waypoint-forの値元の宛先タイプ
サービスKubernetesサービス
ワークロードPod IPまたはVM IP
すべてサービスとワークロードの両方のトラフィック
なしトラフィックなし(テストに便利)

ウェイポイントの選択は、トラフィックがもともとアドレス指定された宛先タイプserviceまたはworkloadに基づいて行われます。ウェイポイントを持たないサービスにトラフィックがアドレス指定されている場合、ウェイポイントは通過しません。最終的に到達するワークロードにウェイポイントがアタッチされていても同様です。

ウェイポイントプロキシの使用

ウェイポイントプロキシがデプロイされても、明示的にそれを使用するようにリソースを構成するまで、リソースによって使用されることはありません。

名前空間、サービス、またはポッドがウェイポイントを使用できるようにするには、ウェイポイント名に値istio.io/use-waypointラベルを追加します。

istioctlを使用して名前空間ウェイポイントをデプロイする場合は、--enroll-namespaceパラメーターを使用して名前空間に自動的にラベルを付けることができます

$ istioctl waypoint apply -n default --enroll-namespace
waypoint default/waypoint applied
namespace default labeled with "istio.io/use-waypoint: waypoint"

または、kubectlを使用してdefault名前空間にistio.io/use-waypoint: waypointラベルを追加することもできます。

$ kubectl label ns default istio.io/use-waypoint=waypoint
namespace/default labeled

名前空間がウェイポイントを使用するように登録されると、アンビエントデータプレーンモードを使用するポッドからの、その名前空間で実行されているサービスへのすべてのリクエストは、L7処理とポリシー適用のためにウェイポイントを通過してルーティングされます。

名前空間全体にウェイポイントを使用するよりも細かい粒度が望ましい場合は、特定のサービスまたはポッドのみをウェイポイントを使用するように登録できます。これは、名前空間内の一部のサービスにのみL7機能が必要な場合、特定のサービスにのみWasmPluginのような拡張機能を適用する場合、またはKubernetesheadless serviceをポッドIPアドレスで呼び出す場合に役立ちます。

特定のウェイポイントを使用するようにサービスを構成

サンプルbookinfoアプリケーションのサービスを使用して、reviewsサービス用にreviews-svc-waypointという名前のウェイポイントをデプロイできます。

$ istioctl waypoint apply -n default --name reviews-svc-waypoint
waypoint default/reviews-svc-waypoint applied

reviewsサービスに、reviews-svc-waypointウェイポイントを使用するようにラベル付けします。

$ kubectl label service reviews istio.io/use-waypoint=reviews-svc-waypoint
service/reviews labeled

メッシュ内のポッドからのreviewsサービスへのすべてのリクエストは、reviews-svc-waypointウェイポイントを通過してルーティングされるようになります。

特定のウェイポイントを使用するようにPodを構成

reviews-v2ポッド用にreviews-v2-pod-waypointという名前のウェイポイントをデプロイします。

$ istioctl waypoint apply -n default --name reviews-v2-pod-waypoint --for workload
waypoint default/reviews-v2-pod-waypoint applied

reviews-v2ポッドに、reviews-v2-pod-waypointウェイポイントを使用するようにラベル付けします。

$ kubectl label pod -l version=v2,app=reviews istio.io/use-waypoint=reviews-v2-pod-waypoint
pod/reviews-v2-5b667bcbf8-spnnh labeled

アンビエントメッシュ内のポッドからのreviews-v2ポッドIPへのすべてのリクエストは、L7処理とポリシー適用のためにreviews-v2-pod-waypointウェイポイントを通過してルーティングされるようになります。

クロスネームスペースウェイポイントの使用

ウェイポイントプロキシは、すぐに利用できる状態では、同じ名前空間内のリソースで使用できます。Istio 1.23以降では、異なる名前空間でウェイポイントを使用できます。このセクションでは、名前空間をまたいだ使用を有効にするために必要なゲートウェイ構成と、異なる名前空間からウェイポイントを使用するようにリソースを構成する方法について説明します。

クロスネームスペースで使用するためのウェイポイントの構成

ウェイポイントのクロスネームスペースでの利用を有効にするには、Gateway を、他の名前空間からのルートを許可するように設定する必要があります。

次の Gateway は、「cross-namespace-waypoint-consumer」という名前の名前空間にあるリソースが、この egress-gateway を使用できるようにします。

kind: Gateway
metadata:
  name: egress-gateway
  namespace: common-infrastructure
spec:
  gatewayClassName: istio-waypoint
  listeners:
  - name: mesh
    port: 15008
    protocol: HBONE
    allowedRoutes:
      namespaces:
        from: Selector
        selector:
          matchLabels:
            kubernetes.io/metadata.name: cross-namespace-waypoint-consumer

クロスネームスペースウェイポイントプロキシを使用するようにリソースを構成

デフォルトでは、Istioコントロールプレーンは、istio.io/use-waypoint ラベルを使用して指定されたウェイポイントを、そのラベルが適用されたリソースと同じ名前空間で探します。別の名前空間のウェイポイントを使用するには、新しいラベル istio.io/use-waypoint-namespace を追加します。istio.io/use-waypoint-namespace は、istio.io/use-waypoint ラベルをサポートするすべてのリソースで機能します。2つのラベルを組み合わせることで、ウェイポイントの名前と名前空間をそれぞれ指定します。例えば、istio-site という名前の ServiceEntry が、common-infrastructure という名前の名前空間にある egress-gateway という名前のウェイポイントを使用するように設定するには、次のコマンドを使用できます。

$ kubectl label serviceentries.networking.istio.io istio-site istio.io/use-waypoint=egress-gateway
serviceentries.networking.istio.io/istio-site labeled
$ kubectl label serviceentries.networking.istio.io istio-site istio.io/use-waypoint-namespace=common-infrastructure
serviceentries.networking.istio.io/istio-site labeled

クリーンアップ

次の操作を行うことで、名前空間からすべてのウェイポイントを削除できます。

$ istioctl waypoint delete --all -n default
$ kubectl label ns default istio.io/use-waypoint-

Kubernetes Gateway API CRD を削除します。

$ kubectl delete -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.0/standard-install.yaml
この情報は役に立ちましたか?
改善のための提案はありますか?

フィードバックありがとうございます!