Tous les produits
Search
Centre de documentation

Container Service for Kubernetes:Colocate an online service with a video transcoding application

Dernière mise à jour :Aug 11, 2026

ack-koordinator offre une planification des workloads sensible aux objectifs de niveau de service (SLO), ce qui vous permet de colocaliser des workloads en ligne et hors ligne sur le même nœud. Votre service en ligne conserve ainsi ses performances, tandis que l'utilisation globale des ressources du cluster s'améliore. Cette rubrique explique comment colocaliser un service web NGINX et une application de transcodage vidéo FFmpeg à l'aide d'ack-koordinator.

Contexte

La colocalisation de workloads en ligne et hors ligne sur le même nœud est judicieuse car leurs besoins en ressources sont complémentaires : les services en ligne présentent une charge variable et consomment les ressources par à-coups, tandis que les travaux par lots hors ligne s'exécutent en continu et peuvent tolérer une priorité de ressource plus faible.

Workload en ligne Workload hors ligne
Applications typiques Services web, API, microservices Transcodage vidéo, traitement big data, entraînement IA
Latence Sensible Insensible
SLO Élevé Faible
Modèle d'utilisation des ressources Par à-coups, basé sur le temps Continu
Tolérance aux pannes Faible — nécessite une haute disponibilité Élevée — permet l'échec et la nouvelle tentative

ack-koordinator utilise des classes de qualité de service (QoS) pour gérer la priorité des ressources entre les workloads colocalisés. Les deux classes utilisées dans cette rubrique sont :

Classe QoS Valeur du libellé Utilisation typique Priorité CPU Priorité mémoire
Sensible à la latence (LS) koordinator.sh/qosClass: LS Services en ligne (par exemple, NGINX) Élevée Élevée
Best-effort (BE) koordinator.sh/qosClass: BE Travaux par lots hors ligne (par exemple, FFmpeg) Faible Faible

Fonctionnement

Dans cette rubrique, un service NGINX (classe QoS LS) et une application de transcodage vidéo FFmpeg (classe QoS BE) s'exécutent sur le même nœud. Deux fonctionnalités de colocalisation travaillent conjointement pour protéger les performances de NGINX :

  • Réutilisation des ressources : les workloads BE peuvent utiliser les ressources allouées aux workloads LS mais actuellement inactives, améliorant ainsi l'utilisation des ressources du cluster. Pour plus d'informations, consultez Dynamic resource overcommitment.

  • Isolation des ressources : divers mécanismes limitent l'utilisation des ressources par les workloads BE et donnent la priorité à la demande de ressources des workloads LS. Pour plus d'informations, consultez CPU QoS, CPU Suppress et Resource isolation based on the L3 cache and MBA.

image

Cette rubrique déploie les applications selon trois modes et compare les résultats :

Mode Description
Déploiement exclusif (référence) Seul NGINX s'exécute sur le nœud.
Colocalisation Kubernetes par défaut (contrôle) NGINX et FFmpeg s'exécutent sur le même nœud avec les classes QoS Kubernetes standard, sans ressources étendues ni fonctionnalités d'isolation ack-koordinator.
Colocalisation sensible aux SLO (expérimental) NGINX et FFmpeg s'exécutent sur le même nœud avec les fonctionnalités d'isolation ack-koordinator activées.

Prérequis

Avant de commencer, assurez-vous de disposer des éléments suivants :

La fonctionnalité CPU QoS nécessite Alibaba Cloud Linux comme système d'exploitation du nœud. L'isolation des ressources basée sur le cache L3 et MBA nécessite une instance ECS Bare Metal.

Déployer le service NGINX et wrk

Déployez le service NGINX sur la machine de test et l'outil de test de charge wrk sur la machine de test de charge.

Déployer NGINX

  1. Créez un fichier nommé ls-nginx.yaml avec le contenu suivant :

    Afficher le contenu du fichier YAML

    ---
    # NGINX configuration
    apiVersion: v1
    data:
      config: |-
        user  nginx;
        worker_processes  80; # Number of worker processes — controls concurrent request capacity.
    
        events {
            worker_connections  1024;  # Maximum connections per worker. Default: 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
    
    ---
    # Pod for the online NGINX service (LS QoS class)
    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 # Port exposed for load testing.
              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  # Replace with the node name of your tested machine.
  2. Déployez le service NGINX :

    kubectl apply -f ls-nginx.yaml
  3. Vérifiez que le pod est en cours d'exécution :

    kubectl get pod -l app=nginx -o wide

    Sortie attendue :

    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>

    Le statut Running confirme que le service NGINX est actif sur la machine de test.

Installer wrk sur la machine de test de charge

Exécutez les commandes suivantes sur le nœud 2 (la machine de test de charge) pour installer 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

Déployer l'application FFmpeg

Déployez l'application hors ligne de transcodage vidéo FFmpeg sur la machine de test. La configuration YAML diffère légèrement entre le mode de colocalisation Kubernetes par défaut et le mode de colocalisation sensible aux SLO ; les commentaires pertinents dans le fichier expliquent chaque différence.

  1. Créez un fichier nommé be-ffmpeg.yaml avec le contenu suivant :

    Afficher le contenu du fichier YAML

    # Pod for the offline FFmpeg video transcoding application (BE QoS class)
    apiVersion: v1
    kind: Pod
    metadata:
      name: be-ffmpeg
      labels:
        app: ffmpeg
      # Default Kubernetes colocation mode: remove the koordinator.sh/qosClass: BE label.
      # SLO-aware colocation mode: keep the koordinator.sh/qosClass: BE label.
        koordinator.sh/qosClass: BE
    spec:
      containers:
        # Increase the process count to control CPU utilization of the transcoding application.
        # Default: 25 processes, each with 2 parallel threads.
        - 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:
          # Default Kubernetes colocation mode: remove the kubernetes.io/batch-cpu and
          # kubernetes.io/batch-memory extended resources.
          # SLO-aware colocation mode: keep them, sized to your node's resource spec.
            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  # Replace with the node name of your tested machine.
  2. Déployez l'application FFmpeg :

    kubectl apply -f be-ffmpeg.yaml
  3. Vérifiez que le pod est en cours d'exécution :

    kubectl get pod -l app=ffmpeg -o wide

    Sortie attendue :

    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>

Exécuter les tests de charge

Exécutez des tests dans chaque mode de colocalisation et comparez les résultats. Les métriques clés sont :

  • Percentiles du temps de réponse (RT) : RT-P90 correspond au temps maximal pour traiter 90 % des requêtes ; RT-P99 couvre 99 % des requêtes. Des valeurs plus faibles indiquent de meilleures performances NGINX.

  • Utilisation moyenne du processeur : mesurée avec kubectl top node.

Mode 1 : Déploiement exclusif (référence)

Seul le service NGINX s'exécute sur la machine de test.

  1. Déployez NGINX comme décrit dans Déployer le service NGINX et wrk.

  2. Envoyez la charge depuis la machine de test de charge :

    # Replace node_ip with the IP address of the tested machine.
    ./wrk -t6 -c54 -d60s --latency http://${node_ip}:8000/
  3. Vérifiez l'utilisation du processeur :

    kubectl top node

    Sortie attendue :

    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

    L'utilisation du processeur sur la machine de test est d'environ 29 %.

  4. Une fois le test terminé, examinez la sortie wrk. Pour des résultats précis, exécutez plusieurs tests. Sortie attendue :

    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

    La section Latency Distribution affiche les valeurs percentiles RT. En mode exclusif : RT-P50 est de 343 microsecondes, RT-P90 est de 523 microsecondes et RT-P99 est de 786 microsecondes.

Mode 2 : Colocalisation Kubernetes par défaut (contrôle)

NGINX et FFmpeg s'exécutent tous deux sur la machine de test sans les fonctionnalités d'isolation ack-koordinator.

Déployez NGINX comme décrit dans Déployer le service NGINX et wrk, puis déployez l'application FFmpeg en utilisant be-ffmpeg.yaml avec les modifications suivantes :

  • Supprimez le libellé koordinator.sh/qosClass: BE.

  • Supprimez les ressources étendues kubernetes.io/batch-cpu et kubernetes.io/batch-memory.

Exécutez le test de charge wrk et collectez l'utilisation du processeur comme dans le mode 1. Dans cette configuration de contrôle, l'utilisation du processeur du nœud atteint environ 65 %.

Mode 3 : Colocalisation sensible aux SLO (expérimental)

NGINX et FFmpeg s'exécutent tous deux sur la machine de test avec les fonctionnalités d'isolation ack-koordinator activées.

  1. Suivez le guide Getting started pour activer la colocalisation sensible aux SLO, puis configurez chaque fonctionnalité :

    • Dynamic resource overcommitment : Utilisez la configuration par défaut. Cela permet au système d'allouer les ressources inactives des pods LS aux pods BE sous forme de ressources par lots surengagées (kubernetes.io/batch-cpu et kubernetes.io/batch-memory).

    • CPU Suppress : Définissez cpuSuppressThresholdPercent sur 65. Conservez les paramètres par défaut pour les autres réglages. Lorsque l'utilisation du processeur du nœud dépasse 65 %, cette fonctionnalité limite l'utilisation du processeur des pods BE pour protéger les performances des pods LS.

    • CPU QoS : Utilisez la configuration par défaut. Cela active la capacité CPU Identity sur Alibaba Cloud Linux, donnant aux pods LS la priorité de planification sur les pods BE, y compris lorsque le multithreading simultané (SMT) exécute des threads des deux pods sur le même cœur physique.

    • Resource isolation based on the L3 cache and MBA : Utilisez la configuration par défaut. Sur les instances ECS Bare Metal, cela isole le cache L3 (cache de dernier niveau) et l'allocation de bande passante mémoire (MBA) afin que les pods LS obtiennent un accès prioritaire.

    Important

    La fonctionnalité CPU QoS nécessite Alibaba Cloud Linux comme système d'exploitation du nœud. L'isolation du cache L3 et MBA nécessite une instance ECS Bare Metal.

  2. Déployez NGINX comme décrit dans Déployer le service NGINX et wrk.

  3. Créez un fichier nommé besteffort-ffmpeg.yaml avec le contenu suivant : Afficher le contenu du fichier YAML

    # Pod for the offline FFmpeg video transcoding application (BE QoS class, SLO-aware mode)
    apiVersion: v1
    kind: Pod
    metadata:
      name: besteffort-ffmpeg
      labels:
        app: ffmpeg
        # Set the QoS class to BE for SLO-aware scheduling.
        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:
            # Request dynamically overcommitted 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  # Replace with the node name of your tested machine.
  4. Déployez l'application FFmpeg :

    kubectl apply -f besteffort-ffmpeg.yaml
  5. Vérifiez que le pod FFmpeg est en cours d'exécution :

    kubectl get pod -l app=ffmpeg -o wide

    Sortie attendue :

    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. Envoyez la charge depuis la machine de test de charge :

    # Replace node_ip with the IP address of the tested machine.
    ./wrk -t6 -c54 -d60s --latency http://${node_ip}:8000/
  7. Vérifiez l'utilisation du processeur :

    kubectl top node

    Sortie attendue :

    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

    L'utilisation du processeur sur la machine de test est d'environ 63 %.

  8. Une fois le test terminé, examinez la sortie wrk et comparez-la avec les résultats des autres modes.

Résultats des tests

Le tableau suivant compare le temps de réponse NGINX et l'utilisation du processeur du nœud dans les trois modes.

Métrique Référence (exclusif) Contrôle (Kubernetes par défaut) Expérimental (sensible aux SLO)
NGINX RT-P90 (ms) 0,533 0,574 (+7,7 %) 0,548 (2,8 %)
NGINX RT-P99 (ms) 0,93 1,07 (+16 %) 0,96 (+3,2 %)
Utilisation moyenne du processeur 29,6 % 65,1 % 64,8 %

Observations clés :

  • Colocalisation Kubernetes par défaut par rapport à la référence : l'utilisation du processeur augmente de 29,6 % à 65,1 %, mais le RT-P90 de NGINX augmente de 7,7 % et le RT-P99 de 16 %. La distribution de la latence présente une longue traîne.

  • Colocalisation sensible aux SLO par rapport à la référence : l'utilisation du processeur augmente de 29,6 % à 64,8 %, tandis que le RT-P90 n'augmente que de 2,8 % et le RT-P99 que de 3,2 %.

  • Colocalisation sensible aux SLO par rapport à la colocalisation Kubernetes par défaut : l'utilisation du processeur est similaire (~65 %), mais les temps de réponse NGINX sont nettement inférieurs et proches de la référence de déploiement exclusif.

La colocalisation sensible aux SLO permet d'obtenir à peu près la même amélioration de l'utilisation du processeur que la colocalisation standard, tout en maintenant la latence NGINX beaucoup plus proche de la référence sans colocalisation.

FAQ

Pourquoi wrk signale-t-il « Socket errors: connect 54, » ?

Cette erreur signifie que le client wrk ne peut pas établir de connexions avec le serveur NGINX car le nombre de connexions dépasse la limite du système d'exploitation. Corrigez le problème en activant la réutilisation des connexions TCP sur la machine de test de charge (et non sur la machine de test).

  1. Vérifiez si la réutilisation des connexions TCP est activée :

    sudo sysctl -n net.ipv4.tcp_tw_reuse

    Une valeur de retour de 0 ou 2 signifie que la fonctionnalité est désactivée.

  2. Activez la réutilisation des connexions TCP :

    sudo sysctl -w net.ipv4.tcp_tw_reuse=1
  3. Relancez le test de charge wrk. Si Socket errors: connect 54 n'apparaît plus, la correction a fonctionné.

Une fois les tests terminés, désactivez la réutilisation des connexions TCP pour éviter des effets indésirables sur d'autres services : sysctl -w net.ipv4.tcp_tw_reuse=0 .

Étapes suivantes