下り(外向き)トラフィックの DSCP タグを構成する

このページでは、ベアメタル上の 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 タグ付けを使用するには、クラスタでこの機能を有効にする必要があります。この機能を有効にするには、次の操作を行います。

  1. クラスタの作成に使用したクラスタ構成ファイル(通常は bmctl-workspace/<var>CLUSTER_NAME</var>/<var>CLUSTER_NAME</var>.yaml にあります)をテキスト エディタで開きます。
  2. 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...
    
  3. bmctl を使用してクラスタに構成を適用します。

    bmctl update cluster -c <var>CLUSTER_NAME</var> --kubeconfig=<var>ADMIN_KUBECONFIG</var>

    次のように置き換えます。

    • CLUSTER_NAME: クラスタの名前。
    • ADMIN_KUBECONFIG: 管理クラスタの kubeconfig ファイルのパス。

グローバル DSCP 値を定義する

EgressDSCP カスタム リソースを作成します。このカスタム リソースを作成する手順は次のとおりです。

  1. 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
    
  2. 次のようにリソースをクラスタに適用します。

    kubectl apply -f my-egress-dscp.yaml
  3. リソースがアクティブで、クラスタ全体で使用可能であることを確認します。

    kubectl get egressdscps

ワークロードからのアウトバウンド トラフィックの優先順位を設定する

特定の Pod をターゲットにして、送信 Pod トラフィックに DSCP タグを適用する TrafficSelector カスタム リソースを作成します。

  1. カスタム リソースを作成します。次の例は、カスタム リソースを作成する方法の例を示しています。この例では、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
    
  2. トラフィック セレクタを適用します。

    kubectl apply -f ts-pod-upload.yaml

重要: この機能はプレビュー版であるため、今後のリリースで EgressDSCP カスタム リソース スキーマと TrafficSelector カスタム リソース スキーマが変更される可能性があります。

外部サービスからの戻りトラフィックの優先度を設定する

外部クライアントに戻るトラフィックにタグを付ける TrafficSelector カスタム リソースを作成します。

重要: LoadBalancer サービスと NodePort サービスのリターントラフィックにのみタグ付けできます。ClusterIP サービスの戻りトラフィックにタグを付けることはできません。

  1. カスタム リソースを作成します。次の例では、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
    
  2. トラフィック セレクタを適用します。

    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 タグの構成を確認するには、次のチェックを行います。

  1. ワイヤ上のタグを確認します。tcpdump を実行して、送信ネットワーク パケットに正しいヘッダー値が含まれているかどうかを確認します。
  2. タグが見つからない場合のトラブルシューティング。タグが存在しない場合は、リソースのステータスを確認して、コントロール プレーンがルールを受け入れたかどうかを確認します。

適用された DSCP タグを確認する

ライブ ネットワーク トラフィックを検査して、出力ヘッダーを確認します。

重要: tcpdump を実行するには、移行元ワークロードをホストするクラスタノードへの root SSH アクセス権が必要です。

  1. SSH を使用して、Pod が実行されているホストノードに接続します。
  2. tcpdump を実行して、Pod の IP アドレスから送信されるパケットをキャプチャします。

    sudo tcpdump -v host POD_IP_ADDRESS
  3. tos ヘッダー フィールドが構成済みの DSCP 16 進数値と一致していることを確認します。16 進数の予想値は、10 進数の DSCP 値に 4 を乗算し、その結果を 16 進数に変換することで計算できます。たとえば、DSCP 値 424 を掛けると 168 になります。これは 16 進数で 0xa8 です。

タグが見つからない場合のトラブルシューティング

tcpdump でパケットがマークされていないことが示されている場合は、次の操作を行います。

  1. TrafficSelector カスタム リソースを調べて、優先順位の高いルールがオーバーライドしているかどうかを確認します。

    kubectl get trafficselector TRAFFIC_SELECTOR_NAME -o yaml
  2. status.conditions セクションを確認します。Programmed 条件が False の場合、ルールに無効な参照が含まれているか、優先度の高いルールによってシャドーイングされています。

次のステップ