Destination Rule
DestinationRule
は、ルーティングが行われた後、サービス宛のトラフィックに適用されるポリシーを定義します。これらのルールは、ロードバランシングの設定、サイドカーからの接続プールサイズ、およびロードバランシングプールから異常なホストを検出して排除するための外れ値検出設定を指定します。たとえば、ratings サービスの単純なロードバランシングポリシーは次のようになります。
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: bookinfo-ratings
spec:
host: ratings.prod.svc.cluster.local
trafficPolicy:
loadBalancer:
simple: LEAST_REQUEST
バージョン固有のポリシーは、名前付きの subset
を定義し、サービスレベルで指定された設定をオーバーライドすることで指定できます。次のルールでは、ラベル(version:v3)を持つエンドポイント(例えば、ポッド)で構成される testversion という名前のサブセットに送信されるすべてのトラフィックに対して、ラウンドロビンロードバランシングポリシーを使用します。
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: bookinfo-ratings
spec:
host: ratings.prod.svc.cluster.local
trafficPolicy:
loadBalancer:
simple: LEAST_REQUEST
subsets:
- name: testversion
labels:
version: v3
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
注意: サブセットに指定されたポリシーは、ルートルールが明示的にこのサブセットにトラフィックを送信するまで有効になりません。
トラフィックポリシーは、特定のポートに合わせてカスタマイズすることもできます。次のルールでは、ポート 80 へのすべてのトラフィックに最小接続ロードバランシングポリシーを使用し、ポート 9080 へのトラフィックにラウンドロビンロードバランシング設定を使用します。
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: bookinfo-ratings-port
spec:
host: ratings.prod.svc.cluster.local
trafficPolicy: # Apply to all ports
portLevelSettings:
- port:
number: 80
loadBalancer:
simple: LEAST_REQUEST
- port:
number: 9080
loadBalancer:
simple: ROUND_ROBIN
Destination Rules は、特定のワークロードに合わせてカスタマイズすることもできます。次の例は、workloadSelector 設定を使用して、特定のワークロードにデスティネーションルールを適用する方法を示しています。
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: configure-client-mtls-dr-with-workloadselector
spec:
host: example.com
workloadSelector:
matchLabels:
app: ratings
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
portLevelSettings:
- port:
number: 31443
tls:
credentialName: client-credential
mode: MUTUAL
DestinationRule
DestinationRule は、ルーティングが行われた後、サービス宛のトラフィックに適用されるポリシーを定義します。
TrafficPolicy
すべての宛先ポートにわたって、特定の宛先に適用するトラフィックポリシー。例については、DestinationRule を参照してください。
Subset
サービスの終点のサブセット。サブセットは、A/B テストや、特定のバージョンのサービスへのルーティングなどのシナリオに使用できます。これらのシナリオでのサブセットの使用例については、VirtualService のドキュメントを参照してください。さらに、サービスレベルで定義されたトラフィックポリシーは、サブセットレベルでオーバーライドできます。次のルールでは、ラベル(version:v3)を持つエンドポイント(例えば、ポッド)で構成される testversion という名前のサブセットに送信されるすべてのトラフィックに対して、ラウンドロビンロードバランシングポリシーを使用します。
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: bookinfo-ratings
spec:
host: ratings.prod.svc.cluster.local
trafficPolicy:
loadBalancer:
simple: LEAST_REQUEST
subsets:
- name: testversion
labels:
version: v3
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
注意: サブセットに指定されたポリシーは、ルートルールが明示的にこのサブセットにトラフィックを送信するまで有効になりません。
通常、サブセットの宛先を識別するには1つ以上のラベルが必要ですが、対応する DestinationRule が複数の SNI ホスト(例えば、エグレスゲートウェイ)をサポートするホストを表す場合、ラベルのないサブセットは意味を持つ場合があります。この場合、ClientTLSSettings を持つトラフィックポリシーを使用して、名前付きサブセットに対応する特定の SNI ホストを識別できます。
LoadBalancerSettings
特定の宛先に適用するロードバランシングポリシー。詳細については、Envoy のロードバランシングのドキュメントを参照してください。
たとえば、次のルールでは、ratings サービスに送信されるすべてのトラフィックに対してラウンドロビンロードバランシングポリシーを使用します。
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: bookinfo-ratings
spec:
host: ratings.prod.svc.cluster.local
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
次の例では、User Cookie をハッシュキーとして使用して、同じ ratings サービスに対してハッシュベースのロードバランサーを使用してスティッキーセッションを設定します。
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: bookinfo-ratings
spec:
host: ratings.prod.svc.cluster.local
trafficPolicy:
loadBalancer:
consistentHash:
httpCookie:
name: user
ttl: 0s
ConnectionPoolSettings
アップストリームホストの接続プール設定。この設定は、アップストリームサービスの個々のホストに適用されます。詳細については、Envoy のサーキットブレーカーを参照してください。接続プール設定は、TCP レベルと HTTP レベルの両方で適用できます。
たとえば、次のルールでは、接続タイムアウトが 30 ミリ秒の myredissrv という名前の Redis サービスへの接続数を 100 に制限します。
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: bookinfo-redis
spec:
host: myredissrv.prod.svc.cluster.local
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100
connectTimeout: 30ms
tcpKeepalive:
time: 7200s
interval: 75s
OutlierDetection
アップストリームサービスの個々のホストのステータスを追跡するサーキットブレーカーの実装。HTTP および TCP サービスの両方に適用できます。HTTP サービスの場合、API 呼び出しに対して 5xx エラーを継続的に返すホストは、事前定義された期間、プールから排除されます。TCP サービスの場合、指定されたホストへの接続タイムアウトまたは接続失敗は、連続エラーメトリックを測定する際のエラーとしてカウントされます。詳細については、Envoy の外れ値検出を参照してください。
次のルールでは、"reviews" サービスへの 100 HTTP1 接続の接続プールサイズを 10 req/connection 以下に設定します。さらに、1000 の同時 HTTP2 要求の制限を設定し、5 分ごとにアップストリームホストをスキャンするように構成します。これにより、502、503、または 504 エラーコードで 7 回連続で失敗したホストは 15 分間排除されます。
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: reviews-cb-policy
spec:
host: reviews.prod.svc.cluster.local
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100
http:
http2MaxRequests: 1000
maxRequestsPerConnection: 10
outlierDetection:
consecutive5xxErrors: 7
interval: 5m
baseEjectionTime: 15m
ClientTLSSettings
アップストリーム接続に関するSSL/TLS関連の設定。詳細については、EnvoyのTLSコンテキストを参照してください。これらの設定は、HTTPとTCPの両方のアップストリームに共通です。
たとえば、次のルールでは、クライアントがアップストリームデータベースクラスターへの接続に相互TLSを使用するように構成します。
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: db-mtls
spec:
host: mydbserver.prod.svc.cluster.local
trafficPolicy:
tls:
mode: MUTUAL
clientCertificate: /etc/certs/myclientcert.pem
privateKey: /etc/certs/client_private_key.pem
caCertificates: /etc/certs/rootcacerts.pem
次のルールでは、クライアントがドメインが*.foo.comと一致する外部サービスと通信するときにTLSを使用するように構成します。
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: tls-foo
spec:
host: "*.foo.com"
trafficPolicy:
tls:
mode: SIMPLE
次のルールでは、クライアントが評価サービスと通信するときにIstioの相互TLSを使用するように構成します。
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: ratings-istio-mtls
spec:
host: ratings.prod.svc.cluster.local
trafficPolicy:
tls:
mode: ISTIO_MUTUAL
LocalityLoadBalancerSetting
ロケーションに基づいた負荷分散により、管理者は、トラフィックの発生元と終了先のロケーションに基づいて、エンドポイントへのトラフィックの分散を制御できます。これらのロケーションは、{region}/{zone}/{sub-zone}形式でロケーションの階層を指定する任意のラベルを使用して指定されます。詳細については、ロケーションウェイトを参照してください。次の例は、メッシュ全体でロケーションウェイトを設定する方法を示しています。
ワークロードとそのサービスが「us-west/zone1/」と「us-west/zone2/」に展開されたメッシュを想定します。この例では、サービスにアクセスするトラフィックが「us-west/zone1/」のワークロードから発生した場合、「us-west/zone1/」のエンドポイントにトラフィックの80%が送信され、残りの20%が「us-west/zone2/」のエンドポイントに送信されるように指定しています。この設定は、同じロケーションのエンドポイントへのトラフィックのルーティングを優先することを目的としています。「us-west/zone2/」で発生するトラフィックについても同様の設定が指定されています。
distribute:
- from: us-west/zone1/*
to:
"us-west/zone1/*": 80
"us-west/zone2/*": 20
- from: us-west/zone2/*
to:
"us-west/zone1/*": 20
"us-west/zone2/*": 80
オペレーターの目的が、ゾーンやリージョン間で負荷を分散するのではなく、他の運用要件を満たすためにフェイルオーバーのリージョン性を制限することである場合は、オペレーターは「分散」ポリシーの代わりに「フェイルオーバー」ポリシーを設定できます。
次の例では、リージョンのロケーションフェイルオーバーポリシーを設定します。サービスがus-east、us-west、eu-west内のゾーンにあると仮定すると、この例では、us-east内のエンドポイントが異常になった場合、トラフィックはeu-west内の任意のゾーンまたはサブゾーン内のエンドポイントにフェイルオーバーする必要があり、同様に、us-westはus-eastにフェイルオーバーする必要があることを指定しています。
failover:
- from: us-east
to: eu-west
- from: us-west
to: us-east
ロケーション負荷分散設定。
TrafficPolicy.PortTrafficPolicy
サービスの特定のポートに適用されるトラフィックポリシー
TrafficPolicy.TunnelSettings
TrafficPolicy.ProxyProtocol
LoadBalancerSettings.ConsistentHashLB
一貫性ハッシュベースの負荷分散を使用して、HTTPヘッダー、Cookie、またはその他のプロパティに基づいてソフトセッションアフィニティを提供できます。宛先サービスで1つ以上のホストが追加/削除されると、特定の宛先ホストへのアフィニティが失われる可能性があります。
注:一貫性ハッシュは、Cookieに特定の宛先をエンコードし、バックエンドが残っている限りアフィニティが維持されることを保証する一般的な「スティッキーセッション」の実装よりも、アフィニティを維持する信頼性が低くなります。一貫性ハッシュでは、保証は弱く、ホストの追加または削除によって、1/backends
リクエストのアフィニティが損なわれる可能性があります。
警告:一貫性ハッシュは、各プロキシがエンドポイントの一貫したビューを持っていることに依存します。これは、ロカリティ負荷分散が有効になっている場合には当てはまりません。ロカリティ負荷分散と一貫性ハッシュは、すべてのプロキシが同じロカリティにある場合、または高レベルの負荷分散装置がロカリティアフィニティを処理する場合にのみ連携して機能します。
LoadBalancerSettings.ConsistentHashLB.RingHash
LoadBalancerSettings.ConsistentHashLB.MagLev
LoadBalancerSettings.ConsistentHashLB.HTTPCookie
一貫性ハッシュ負荷分散装置のハッシュキーとして使用されるHTTP Cookieについて説明します。
ConnectionPoolSettings.TCPSettings
HTTP および TCP アップストリーム接続の両方に共通の設定。
ConnectionPoolSettings.HTTPSettings
HTTP1.1/HTTP2/GRPC接続に適用可能な設定。
ConnectionPoolSettings.TCPSettings.TcpKeepalive
TCPキープアライブ。
LocalityLoadBalancerSetting.Distribute
「from」ゾーンまたはサブゾーンで発生したトラフィックを、一連の「to」ゾーンに分散する方法について説明します。ゾーンを指定するための構文は、{region}/{zone}/{sub-zone}であり、仕様の任意のセグメントで終端ワイルドカードを使用できます。例
*
- すべてのロカリティに一致します
us-west/*
- us-westリージョン内のすべてのゾーンとサブゾーン
us-west/zone-1/*
- us-west/zone-1内のすべてのサブゾーン
LocalityLoadBalancerSetting.Failover
リージョン間のトラフィックフェイルオーバーポリシーを指定します。ゾーンとサブゾーンのフェイルオーバーはデフォルトでサポートされているため、これは、オペレーターがトラフィックフェイルオーバーを制約して、グローバルに任意のエンドポイントにフェイルオーバーするデフォルトの動作が適用されないようにする必要がある場合にのみ、リージョンに対して指定する必要があります。これは、リージョン間でトラフィックをフェイルオーバーしてもサービスの健全性が向上しない場合や、規制上の制御などの他の理由で制限する必要がある場合に役立ちます。
google.protobuf.UInt32Value
uint32
のラッパーメッセージ。
UInt32Value
のJSON表現は、JSON番号です。
TrafficPolicy.ProxyProtocol.VERSION
Name | 説明 |
---|---|
V1 | PROXYプロトコルバージョン1。人間が読める形式。 |
V2 | PROXYプロトコルバージョン2。バイナリ形式。 |
LoadBalancerSettings.SimpleLB
調整を必要としない標準的な負荷分散アルゴリズム。
Name | 説明 |
---|---|
UNSPECIFIED | ユーザーによって負荷分散アルゴリズムが指定されていません。Istioは適切なデフォルトを選択します。 |
RANDOM | ランダム負荷分散装置は、ランダムな正常なホストを選択します。ランダム負荷分散装置は、ヘルスチェックポリシーが構成されていない場合、一般にラウンドロビンよりもパフォーマンスが向上します。 |
PASSTHROUGH | このオプションは、負荷分散を実行せずに、呼び出し元によって要求された元のIPアドレスに接続を転送します。このオプションは慎重に使用する必要があります。これは高度なユースケースを対象としています。詳細については、Envoyの元の宛先負荷分散装置を参照してください。 |
ROUND_ROBIN | 基本的なラウンドロビン負荷分散ポリシー。これは、エンドポイントの重み付けが使用されている場合など、多くのシナリオで一般的に安全ではありません。エンドポイントに過負荷をかける可能性があります。一般に、ROUND_ROBINのドロップイン代替としてLEAST_REQUESTを使用することをお勧めします。 |
LEAST_REQUEST | 最小リクエスト負荷分散装置は、未処理のリクエストが最も少ないエンドポイントを優先して、エンドポイント全体に負荷を分散します。これは一般的に安全であり、ほとんどすべての場合でROUND_ROBINよりもパフォーマンスが優れています。ROUND_ROBINのドロップイン代替としてLEAST_REQUESTを使用することをお勧めします。 |
LEAST_CONN | 非推奨。代わりにLEAST_REQUESTを使用してください。 |
ConnectionPoolSettings.HTTPSettings.H2UpgradePolicy
http1.1接続をhttp2にアップグレードするためのポリシー。
Name | 説明 |
---|---|
DEFAULT | グローバルデフォルトを使用します。 |
DO_NOT_UPGRADE | 接続をhttp2にアップグレードしません。このオプトアウトオプションは、デフォルトをオーバーライドします。 |
UPGRADE | 接続をhttp2にアップグレードします。このオプトインオプションは、デフォルトをオーバーライドします。 |
ClientTLSSettings.TLSmode
TLS接続モード
Name | 説明 |
---|---|
DISABLE | アップストリームエンドポイントへのTLS接続を設定しません。 |
SIMPLE | アップストリームエンドポイントへのTLS接続を開始します。 |
MUTUAL | 認証用のクライアント証明書を提示することにより、相互TLSを使用してアップストリームへの接続を保護します。 |
ISTIO_MUTUAL | 認証用のクライアント証明書を提示することにより、相互TLSを使用してアップストリームへの接続を保護します。相互モードと比較して、このモードでは、mTLS認証用にIstioによって自動的に生成された証明書を使用します。このモードを使用する場合は、 |