このページでは、ベアメタル上の Google Distributed Cloud(ソフトウェアのみ)の下り(外向き)トラフィックの DSCP(Differentiated Services Code Point)タグ付けを構成する方法について説明します。
IP ヘッダーに DSCP 値をマークすることで、クラスタからのアウトバウンド ネットワーク トラフィックの優先度を設定できます。アップストリームの物理ネットワーク インフラストラクチャは、DSCP タグを使用して、優先度キューイングや帯域幅シェーピングなどの QoS(Quality of Service)ポリシーを適用します。
始める前に
下り(外向き)の DSCP タグを構成する前に、DSCP タグ付けの概要を読んで、システムが競合を解決する方法を確認してください。環境が次の要件を満たしていることを確認します。
重要: ベアメタル用 Google Distributed Cloud ソフトウェアのみは、送信 IP パケットにタグを追加します。ベアメタル用 Google Distributed Cloud ソフトウェアのみは、トラフィックのシェーピングやキューイングを行いません。DSCP タグを読み取って QoS ポリシーを適用するように、アップストリームの物理ネットワーク インフラストラクチャを構成する必要があります。
要件
DSCP タグ付けを使用するには、次の要件を満たす必要があります。
- ベアメタル バージョン 1.35 以降の Google Distributed Cloud ソフトウェアのみを使用する必要があります。
- クラスタから送信されるアウトバウンド(ノースサウス)トラフィックにのみタグ付けできます。Pod 間の内部トラフィックにタグを付けることはできません。
- タグ付けできるのは IPv4 トラフィックのみです。
DSCP タグ付け機能を有効にする
下り(外向き)DSCP タグ付けを使用するには、クラスタでこの機能を有効にする必要があります。この機能を有効にするには、次の操作を行います。
- クラスタの作成に使用したクラスタ構成ファイル(通常は
bmctl-workspace/<var>CLUSTER_NAME</var>/<var>CLUSTER_NAME</var>.yamlにあります)をテキスト エディタで開きます。 metadataセクションにpreview.baremetal.cluster.gke.io/traffic-selector: "enable"アノテーションを追加します。次の例は、DSCP タグ付けを有効にした場合のクラスタ構成ファイルの例です。apiVersion: baremetal.cluster.gke.io/v1 kind: Cluster metadata: name: my-cluster namespace: cluster-my-cluster annotations: preview.baremetal.cluster.gke.io/traffic-selector: "enable" spec: # Remaining cluster specifications...bmctlを使用してクラスタに構成を適用します。bmctl update cluster -c <var>CLUSTER_NAME</var> --kubeconfig=<var>ADMIN_KUBECONFIG</var>次のように置き換えます。
- CLUSTER_NAME: クラスタの名前。
- ADMIN_KUBECONFIG: 管理クラスタの kubeconfig ファイルのパス。
グローバル DSCP 値を定義する
EgressDSCP カスタム リソースを作成します。このカスタム リソースを作成する手順は次のとおりです。
EgressDSCPカスタム リソースを作成し、0 ~ 63 の数値 DSCP 値を指定します。次の例は、
40の DSCP 値を適用するdscp-high-priorityという名前のEgressDSCPカスタム リソースを示しています。apiVersion: networking.gke.io/v1 kind: EgressDSCP metadata: name: dscp-high-priority spec: dscp: 40次のようにリソースをクラスタに適用します。
kubectl apply -f my-egress-dscp.yamlリソースがアクティブで、クラスタ全体で使用可能であることを確認します。
kubectl get egressdscps
ワークロードからのアウトバウンド トラフィックの優先順位を設定する
特定の Pod をターゲットにして、送信 Pod トラフィックに DSCP タグを適用する TrafficSelector カスタム リソースを作成します。
カスタム リソースを作成します。次の例は、カスタム リソースを作成する方法の例を示しています。この例では、
app: critical-uploadというラベルの付いた Pod から IP アドレス8.8.8.8/32へのアウトバウンド TCP トラフィックを照合します。このルールは、dscp-high-priorityカスタム リソースを参照して、その DSCP 値を一致するすべてのパケットに適用します。apiVersion: networking.gke.io/v2 kind: TrafficSelector metadata: name: ts-pod-upload namespace: default spec: priority: 10 subject: pods: namespaceSelector: matchLabels: kubernetes.io/metadata.name: default podSelector: matchLabels: app: critical-upload egress: to: ipBlock: cidrs: - "8.8.8.8/32" ports: - allPorts: protocol: TCP action: apiVersion: networking.gke.io/v1 kind: EgressDSCP name: dscp-high-priorityトラフィック セレクタを適用します。
kubectl apply -f ts-pod-upload.yaml
重要: この機能はプレビュー版であるため、今後のリリースで EgressDSCP カスタム リソース スキーマと TrafficSelector カスタム リソース スキーマが変更される可能性があります。
外部サービスからの戻りトラフィックの優先度を設定する
外部クライアントに戻るトラフィックにタグを付ける TrafficSelector カスタム リソースを作成します。
重要: LoadBalancer サービスと NodePort サービスのリターントラフィックにのみタグ付けできます。ClusterIP サービスの戻りトラフィックにタグを付けることはできません。
カスタム リソースを作成します。次の例では、
app: video-streamというラベルの付いた任意のサービス バックエンドからの TCP 戻りトラフィックを照合します。このルールはdscp-high-priorityカスタム リソースを参照して、外部クライアントに送り返されるレスポンス ストリームに DSCP 値を適用します。spec.egress.toフィールドを省略すると、このセレクタは、任意の外部クライアント IP アドレスに送信されるトラフィックに DSCP タグを適用します。apiVersion: networking.gke.io/v2 kind: TrafficSelector metadata: name: ts-service-video namespace: media spec: priority: 20 subject: services: namespaceSelector: matchLabels: kubernetes.io/metadata.name: media serviceSelector: matchLabels: app: video-stream egress: ports: - allPorts: protocol: TCP action: apiVersion: networking.gke.io/v1 kind: EgressDSCP name: dscp-high-priorityトラフィック セレクタを適用します。
kubectl apply -f ts-service-video.yaml
その他の構成例
ネットワークのアーキテクチャに応じて、異なる粒度レベルで DSCP タグを適用するように TrafficSelector リソースを設計できます。
- 特定の Pod ラベルでタグ付けして、Namespace 内の特定のアプリケーション ワークロードの下り(外向き)トラフィックをマークします。
- サービスでタグ付けして、外部クライアントに戻るレスポンス ループ トラフィックをマークします。
- 宛先ポートまたは IP アドレスでタグ付けして、特定の通信パスまたはネットワーク制御サービスを優先します。
- Namespace でタグ付けして、アプリケーション サンドボックスまたはビジネス ユニット全体に単一の優先度階層を適用する包括的なポリシーとして使用します。
例: 宛先ポートでトラフィックをタグ付けする
WAN 帯域幅が制限されているエッジ環境では、クラスタの安定性を維持するために、
ネットワーク制御サービス(NTP や DNS など)を優先する必要があります。トラフィックの遅延やドロップは、クロック ドリフト、コントロール プレーンの障害、安全な接続の失敗を引き起こす可能性があります。宛先ポートでタグ付けすることで、このトラフィックは標準の一括データ転送よりも優先されます。
次の例では、TCP ポート 443(HTTPS)や UDP ポート 123(NTP)などの特定の外部ポートに送信されるアウトバウンド トラフィックにタグを付け、このトラフィックが標準のバルクデータ転送よりも優先されるようにします。
apiVersion: networking.gke.io/v2
kind: TrafficSelector
metadata:
name: ts-ports
namespace: default
spec:
priority: 30
subject:
pods:
podSelector:
matchLabels:
app: critical-sync
egress:
to:
ipBlock:
cidrs:
- "0.0.0.0/0"
ports:
- portNumber:
protocol: TCP
port: 443
- portNumber:
protocol: UDP
port: 123
action:
apiVersion: networking.gke.io/v1
kind: EgressDSCP
name: dscp-high-priority
例: Namespace からのすべてのトラフィックにタグを付ける
マルチテナント クラスタでは、名前空間全体にタグを付けることで、サービスレベル契約(SLA)を適用し、ネットワーク管理を効率化できます。たとえば、次の操作が可能です。
- タグを自動キャッチオール ポリシーとして Namespace に直接適用します。スペース内のすべてのワークロードは、個々のデベロッパーが Pod ラベルを構成しなくてもタグを継承します。
- WAN 帯域幅が輻輳した場合は、重要なビジネス ユニットの Namespace に優先度の高い階層(ゴールドやシルバーなど)を割り当てて、アップストリーム ネットワークでトラフィックが優先的に処理されるようにします。
注: 名前空間にデプロイされたワークロードはすべてタグを自動的に継承するため、優先度キューに重要でないワークロードが過負荷にならないように、デプロイ権限を制限してください。
次の例では、frontend-ns Namespace 内のすべてのワークロードからのすべての送信トラフィックにタグを付けます。
apiVersion: networking.gke.io/v2
kind: TrafficSelector
metadata:
name: ts-namespace-full
namespace: frontend-ns
spec:
priority: 40
subject:
pods:
namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: frontend-ns
egress:
to:
ipBlock:
cidrs:
- "0.0.0.0/0"
ports:
- allPorts:
protocol: TCP
- allPorts:
protocol: UDP
action:
apiVersion: networking.gke.io/v1
kind: EgressDSCP
name: dscp-high-priority
確認とトラブルシューティング
DSCP タグの構成を確認するには、次のチェックを行います。
- ワイヤ上のタグを確認します。
tcpdumpを実行して、送信ネットワーク パケットに正しいヘッダー値が含まれているかどうかを確認します。 - タグが見つからない場合のトラブルシューティング。タグが存在しない場合は、リソースのステータスを確認して、コントロール プレーンがルールを受け入れたかどうかを確認します。
適用された DSCP タグを確認する
ライブ ネットワーク トラフィックを検査して、出力ヘッダーを確認します。
重要: tcpdump を実行するには、移行元ワークロードをホストするクラスタノードへの root SSH アクセス権が必要です。
- SSH を使用して、Pod が実行されているホストノードに接続します。
tcpdumpを実行して、Pod の IP アドレスから送信されるパケットをキャプチャします。sudo tcpdump -v host POD_IP_ADDRESStosヘッダー フィールドが構成済みの DSCP 16 進数値と一致していることを確認します。16 進数の予想値は、10 進数の DSCP 値に4を乗算し、その結果を 16 進数に変換することで計算できます。たとえば、DSCP 値42に4を掛けると168になります。これは 16 進数で0xa8です。
タグが見つからない場合のトラブルシューティング
tcpdump でパケットがマークされていないことが示されている場合は、次の操作を行います。
TrafficSelectorカスタム リソースを調べて、優先順位の高いルールがオーバーライドしているかどうかを確認します。kubectl get trafficselector TRAFFIC_SELECTOR_NAME -o yamlstatus.conditionsセクションを確認します。Programmed条件がFalseの場合、ルールに無効な参照が含まれているか、優先度の高いルールによってシャドーイングされています。
次のステップ
- 下り(外向き) DSCP タグ付けの詳細を確認する。
- ネットワーク チームに相談して、アップストリーム ルーターの構成を確認します。