ウェイポイントプロキシの設定
ウェイポイントプロキシとは、定義されたワークロードセットにレイヤー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