すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:オンラインサービスと動画トランスコーディングアプリケーションの混在配置

最終更新日:Mar 26, 2026

ack-koordinator は、サービスレベル目標 (SLO) 対応のワークロードスケジューリングを提供します。これにより、オンラインサービスとオフラインワークロードを同じノードに混在配置し、オンラインサービスのパフォーマンスを維持しながら、クラスター全体のリソース使用率を向上させることができます。このトピックでは、ack-koordinator を使用して、NGINX Web サービスと FFmpeg 動画トランスコーディングアプリケーションを混在配置する手順を説明します。

背景情報

オンラインサービスとオフラインワークロードは、リソース要求が相補的であるため、同じノードに混在配置することが理にかなっています。オンラインサービスは負荷が変動し、リソースをバースト的に消費するのに対し、オフラインのバッチジョブは継続的に実行され、より低いリソース優先度を許容できます。

オンラインワークロードオフラインワークロード
代表的なアプリケーションWeb サービス、API、マイクロサービス動画トランスコーディング、ビッグデータ処理、AI トレーニング
レイテンシー敏感鈍感
SLO
リソース使用パターンバースト的、時間ベース継続的
耐障害性低 — 高可用性が必要高 — 障害とリトライを許容

ack-koordinator は、サービス品質 (QoS) クラスを使用して、混在配置されたワークロード間のリソース優先度を管理します。このトピックで使用される 2 つのクラスは次のとおりです:

QoS クラスラベル値代表的な用途CPU 優先度メモリ優先度
レイテンシーセンシティブ (LS)koordinator.sh/qosClass: LSオンラインサービス (例:NGINX)
ベストエフォート (BE)koordinator.sh/qosClass: BEオフラインバッチジョブ (例:FFmpeg)

仕組み

このトピックでは、NGINX サービス (LS QoS クラス) と FFmpeg 動画トランスコーディングアプリケーション (BE QoS クラス) が同じノードで実行されます。2 つの混在配置機能が連携して NGINX のパフォーマンスを保護します:

  • リソースの再利用:BE ワークロードは、LS ワークロードに割り当てられているが現在アイドル状態のリソースを使用できるため、クラスターのリソース使用率が向上します。詳細については、「動的なリソースオーバーコミットメント」をご参照ください。

  • リソース隔離:さまざまなメカニズムが BE ワークロードのリソース使用を制限し、LS ワークロードのリソース要求を優先します。詳細については、「CPU QoS」、「CPU 抑制」、および「L3 キャッシュと MBA に基づくリソース隔離」をご参照ください。

image

このトピックでは、アプリケーションを 3 つのモードでデプロイし、その結果を比較します:

モード説明
排他的デプロイメント (ベースライン)NGINX のみがノードで実行されます。
デフォルトの Kubernetes 混在配置 (コントロール)NGINX と FFmpeg は、標準の Kubernetes QoS クラスを使用して同じノードで実行されます。拡張リソースや ack-koordinator の隔離機能は使用しません。
SLO 対応の混在配置 (実験)NGINX と FFmpeg は、ack-koordinator の隔離機能を有効にして同じノードで実行されます。

前提条件

開始する前に、以下を確認してください:

CPU QoS には、ノード OS として Alibaba Cloud Linux が必要です。L3 キャッシュと MBA に基づくリソース隔離には、ECS ベアメタルインスタンスが必要です。

NGINX サービスと wrk のデプロイ

テスト対象マシンに NGINX サービスをデプロイし、負荷テストマシンに wrk 負荷テストツールをデプロイします。

YAML ファイルの内容を表示

  1. ls-nginx.yaml という名前のファイルを作成し、次の内容を記述します:

    YAML ファイルの内容を表示

    ---
    # NGINX 設定
    apiVersion: v1
    data:
      config: |-
        user  nginx;
        worker_processes  80; # ワーカープロセスの数 — 同時リクエスト処理能力を制御します。
    
        events {
            worker_connections  1024;  # ワーカーあたりの最大接続数。デフォルト:1024。
        }
    
        http {
            server {
                listen  8000;
    
                gzip off;
                gzip_min_length 32;
                gzip_http_version 1.0;
                gzip_comp_level 3;
                gzip_types *;
            }
        }
    
        #daemon off;
    kind: ConfigMap
    metadata:
      name: nginx-conf
    
    ---
    # オンライン NGINX サービス用の Pod (LS QoS クラス)
    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        koordinator.sh/qosClass: LS
        app: nginx
      name: nginx
    spec:
      containers:
        - image: 'koordinatorsh/nginx:v1.18-koord-exmaple'
          imagePullPolicy: IfNotPresent
          name: nginx
          ports:
            - containerPort: 8000
              hostPort: 8000 # 負荷テスト用に公開されるポート。
              protocol: TCP
          resources:
            limits:
              cpu: '80'
              memory: 10Gi
            requests:
              cpu: '80'
              memory: 10Gi
          volumeMounts:
            - mountPath: /apps/nginx/conf
              name: config
      hostNetwork: true
      restartPolicy: Never
      volumes:
        - configMap:
            items:
              - key: config
                path: nginx.conf
            name: nginx-conf
          name: config
      nodeName: cn-beijing.192.168.2.93  # テスト対象マシンのノード名に置き換えてください。
  2. NGINX サービスをデプロイします:

    kubectl apply -f ls-nginx.yaml
  3. Pod が実行中であることを確認します:

    kubectl get pod -l app=nginx -o wide

    期待される出力:

    NAME    READY   STATUS    RESTARTS   AGE    IP               NODE                      NOMINATED NODE   READINESS GATES
    nginx   1/1     Running   0          43s    11.162.XXX.XXX   cn-beijing.192.168.2.93   <none>           <none>

    Running ステータスは、NGINX サービスがテスト対象マシンで起動していることを示します。

負荷テストマシンへの wrk のインストール

ノード 2 (負荷テストマシン) で次のコマンドを実行して、wrk 4.2.0 をインストールします:

wget -O wrk-4.2.0.tar.gz https://github.com/wg/wrk/archive/refs/tags/4.2.0.tar.gz && tar -xvf wrk-4.2.0.tar.gz
cd wrk-4.2.0 && make && chmod +x ./wrk

FFmpeg アプリケーションのデプロイ

オフラインの FFmpeg 動画トランスコーディングアプリケーションをテスト対象マシンにデプロイします。YAML 設定は、デフォルトの Kubernetes 混在配置モードと SLO 対応の混在配置モードでわずかに異なります。ファイル内の関連コメントがそれぞれの違いを説明しています。

  1. be-ffmpeg.yaml という名前のファイルを作成し、次の内容を記述します:

    YAML ファイルの内容を表示

    # オフライン FFmpeg 動画トランスコーディングアプリケーション用の Pod (BE QoS クラス)
    apiVersion: v1
    kind: Pod
    metadata:
      name: be-ffmpeg
      labels:
        app: ffmpeg
      # デフォルトの Kubernetes 混在配置モード:koordinator.sh/qosClass: BE ラベルを削除します。
      # SLO 対応の混在配置モード:koordinator.sh/qosClass: BE ラベルを保持します。
        koordinator.sh/qosClass: BE
    spec:
      containers:
        # トランスコーディングアプリケーションの CPU 使用率を制御するために、プロセス数を増やします。
        # デフォルト:25 プロセス、各 2 並列スレッド。
        - command:
            - start-ffmpeg.sh
            - '25'
            - '2'
            - /apps/ffmpeg/input/HD2-h264.ts
            - /apps/ffmpeg/
          image: 'registry.cn-zhangjiakou.aliyuncs.com/acs/ffmpeg-4-4-1-for-slo-test:v0.1'
          imagePullPolicy: Always
          name: ffmpeg
          resources:
          # デフォルトの Kubernetes 混在配置モード:kubernetes.io/batch-cpu および
          # kubernetes.io/batch-memory 拡張リソースを削除します。
          # SLO 対応の混在配置モード:ノードのリソース仕様に合わせて、これらを保持します。
            limits:
              kubernetes.io/batch-cpu: 70k
              kubernetes.io/batch-memory: 22Gi
            requests:
              kubernetes.io/batch-cpu: 70k
              kubernetes.io/batch-memory: 22Gi
      hostNetwork: true
      restartPolicy: Never
      nodeName: cn-beijing.192.168.2.93  # テスト対象マシンのノード名に置き換えてください。
  2. FFmpeg アプリケーションをデプロイします:

    kubectl apply -f be-ffmpeg.yaml
  3. Pod が実行中であることを確認します:

    kubectl get pod -l app=ffmpeg -o wide

    期待される出力:

    NAME        READY   STATUS    RESTARTS   AGE    IP               NODE                      NOMINATED NODE   READINESS GATES
    be-ffmpeg   1/1     Running   0          15s    11.162.XXX.XXX   cn-beijing.192.168.2.93   <none>           <none>

負荷テストの実行

各混在配置モードでテストを実行し、結果を比較します。主要なメトリックは次のとおりです:

  • 応答時間 (RT) パーセンタイル:RT-P90 はリクエストの 90% を処理するための最大時間、RT-P99 はリクエストの 99% をカバーします。値が低いほど、NGINX のパフォーマンスが優れていることを示します。

  • 平均 CPU 使用率kubectl top node で測定します。

モード 1:排他的デプロイメント (ベースライン)

テスト対象マシンでは NGINX サービスのみが実行されます。

  1. NGINX サービスと wrk のデプロイ」で説明されているように NGINX をデプロイします。

  2. 負荷テストマシンから負荷を送信します:

    # node_ip をテスト対象マシンの IP アドレスに置き換えてください。
    ./wrk -t6 -c54 -d60s --latency http://${node_ip}:8000/
  3. CPU 使用率を確認します:

    kubectl top node

    期待される出力:

    NAME                      CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
    cn-beijing.192.168.2.93   29593m       29%    xxxx            xxxx
    cn-beijing.192.168.2.94   6874m        7%     xxxx            xxxx

    テスト対象マシンの CPU 使用率は約 29% です。

  4. テストが完了したら、wrk の出力を確認します。正確な結果を得るために、複数のテストを実行してください。期待される出力:

    Running 1m test @ http://192.168.2.94:8000/
      6 threads and 54 connections
      Thread Stats   Avg      Stdev     Max   +/- Stdev
        Latency   402.18us    1.07ms  59.56ms   99.83%
        Req/Sec    24.22k     1.12k   30.58k    74.15%
      Latency Distribution
         50%  343.00us
         75%  402.00us
         90%  523.00us
         99%  786.00us
      8686569 requests in 1.00m, 6.88GB read
    Requests/sec: 144537.08
    Transfer/sec:    117.16MB

    Latency Distribution セクションには、RT パーセンタイル値が表示されます。排他モードでは、RT-P50 は 343 マイクロ秒、RT-P90 は 523 マイクロ秒、RT-P99 は 786 マイクロ秒です。

モード 2:デフォルトの Kubernetes 混在配置 (コントロール)

NGINX と FFmpeg の両方が、ack-koordinator の隔離機能なしでテスト対象マシンで実行されます。

NGINX サービスと wrk のデプロイ」で説明されているように NGINX をデプロイし、次に以下の変更を加えた be-ffmpeg.yaml を使用して FFmpeg アプリケーションをデプロイします:

  • koordinator.sh/qosClass: BE ラベルを削除します。

  • kubernetes.io/batch-cpu および kubernetes.io/batch-memory 拡張リソースを削除します。

モード 1 と同様に wrk 負荷テストを実行し、CPU 使用率を収集します。このコントロール構成では、ノードの CPU 使用率は約 65% に達します。

モード 3:SLO 対応の混在配置 (実験)

NGINX と FFmpeg の両方が、ack-koordinator の隔離機能を有効にしてテスト対象マシンで実行されます。

  1. クイックスタート」ガイドに従って SLO 対応の混在配置を有効にし、各機能を設定します:

    • 動的なリソースオーバーコミットメント:デフォルト設定を使用します。これにより、システムはアイドル状態の LS Pod リソースを、オーバーコミットされたバッチリソース (kubernetes.io/batch-cpu および kubernetes.io/batch-memory) として BE Pod に割り当てることができます。

    • CPU 抑制cpuSuppressThresholdPercent65 に設定します。他の設定はデフォルトを使用します。ノードの CPU 使用率が 65% を超えると、この機能は BE Pod の CPU 使用をスロットリングして LS Pod のパフォーマンスを保護します。

    • CPU QoS:デフォルト設定を使用します。これにより、Alibaba Cloud Linux 上で CPU Identity 機能が有効になり、LS Pod は BE Pod よりもスケジューリング優先度が高くなります。これには、同時マルチスレッディング (SMT) が両方の Pod のスレッドを同じ物理コアで実行する場合も含まれます。

    • L3 キャッシュと MBA に基づくリソース隔離:デフォルト設定を使用します。ECS ベアメタルインスタンスでは、これにより L3 キャッシュ (最終レベルキャッシュ) とメモリ帯域幅割り当て (MBA) が隔離され、LS Pod が優先的にアクセスできるようになります。

    重要

    CPU QoS には、ノード OS として Alibaba Cloud Linux が必要です。L3 キャッシュと MBA の隔離には、ECS ベアメタルインスタンスが必要です。

  2. NGINX サービスと wrk のデプロイ」で説明されているように NGINX をデプロイします。

  3. besteffort-ffmpeg.yaml という名前のファイルを作成し、次の内容を記述します:YAML ファイルの内容を表示

    # オフライン FFmpeg 動画トランスコーディングアプリケーション用の Pod (BE QoS クラス、SLO 対応モード)
    apiVersion: v1
    kind: Pod
    metadata:
      name: besteffort-ffmpeg
      labels:
        app: ffmpeg
        # SLO 対応スケジューリングのために QoS クラスを BE に設定します。
        koordinator.sh/qosClass: BE
    spec:
      containers:
        - command:
            - start-ffmpeg.sh
            - '30'
            - '2'
            - /apps/ffmpeg/input/HD2-h264.ts
            - /apps/ffmpeg/
          image: 'registry.cn-zhangjiakou.aliyuncs.com/acs/ffmpeg-4-4-1-for-slo-test:v0.1'
          imagePullPolicy: Always
          name: ffmpeg
          resources:
            # 動的にオーバーコミットされたリソースを要求します。
            limits:
              kubernetes.io/batch-cpu: 70k
              kubernetes.io/batch-memory: 22Gi
            requests:
              kubernetes.io/batch-cpu: 70k
              kubernetes.io/batch-memory: 22Gi
      hostNetwork: true
      restartPolicy: Never
      nodeName: cn-beijing.192.168.2.93  # テスト対象マシンのノード名に置き換えてください。
  4. FFmpeg アプリケーションをデプロイします:

    kubectl apply -f besteffort-ffmpeg.yaml
  5. FFmpeg Pod が実行中であることを確認します:

    kubectl get pod -l app=ffmpeg -o wide

    期待される出力:

    NAME                READY   STATUS    RESTARTS   AGE    IP               NODE                      NOMINATED NODE   READINESS GATES
    besteffort-ffmpeg   1/1     Running   0          15s    11.162.XXX.XXX   cn-beijing.192.168.2.93   <none>           <none>
  6. 負荷テストマシンから負荷を送信します:

    # node_ip をテスト対象マシンの IP アドレスに置き換えてください。
    ./wrk -t6 -c54 -d60s --latency http://${node_ip}:8000/
  7. CPU 使用率を確認します:

    kubectl top node

    期待される出力:

    NAME                      CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
    cn-beijing.192.168.2.93   65424m       63%    xxxx            xxxx
    cn-beijing.192.168.2.94   7040m        7%     xxxx            xxxx

    テスト対象マシンの CPU 使用率は約 63% です。

  8. テストが完了したら、wrk の出力を確認し、他のモードの結果と比較します。

テスト結果

次の表は、3 つのモードすべてにおける NGINX の応答時間とノードの CPU 使用率を比較したものです。

メトリックベースライン (排他的)コントロール (デフォルト Kubernetes)実験 (SLO 対応)
NGINX RT-P90 (ms)0.5330.574 (+7.7%)0.548 (2.8%)
NGINX RT-P99 (ms)0.931.07 (+16%)0.96 (+3.2%)
平均 CPU 使用率29.6%65.1%64.8%

主な観測結果

  • デフォルトの Kubernetes 混在配置 vs. ベースライン:CPU 使用率は 29.6% から 65.1% に増加しますが、NGINX の RT-P90 は 7.7%、RT-P99 は 16% 上昇します。レイテンシー分布には長いテールがあります。

  • SLO 対応の混在配置 vs. ベースライン:CPU 使用率は 29.6% から 64.8% に増加しますが、RT-P90 はわずか 2.8%、RT-P99 はわずか 3.2% の上昇にとどまります。

  • SLO 対応の混在配置 vs. デフォルトの Kubernetes 混在配置:CPU 使用率は同程度 (約 65%) ですが、NGINX の応答時間は大幅に低く、排他的デプロイメントのベースラインに近い値です。

SLO 対応の混在配置は、標準の混在配置とほぼ同じ CPU 使用率の向上を達成しながら、NGINX のレイテンシーを混在配置なしのベースラインにはるかに近い値に保ちます。

よくある質問

wrk が "Socket errors: connect 54," を報告するのはなぜですか?

このエラーは、接続数が OS の制限を超えたために、wrk クライアントが NGINX サーバーへの接続を確立できないことを意味します。この問題を解決するには、テスト対象マシンではなく、負荷テストマシンで TCP 接続の再利用を有効にします。

  1. TCP 接続の再利用が有効になっているか確認します:

    sudo sysctl -n net.ipv4.tcp_tw_reuse

    戻り値が 0 または 2 の場合、この機能は無効です。

  2. TCP 接続の再利用を有効にします:

    sudo sysctl -w net.ipv4.tcp_tw_reuse=1
  3. wrk 負荷テストを再実行します。Socket errors: connect 54 が表示されなくなれば、修正は成功です。

テスト完了後、他のサービスへの意図しない影響を避けるために、TCP 接続の再利用を無効にしてください:sysctl -w net.ipv4.tcp_tw_reuse=0

次のステップ