La fonctionnalité d'accélération P2P accélère l'extraction des images afin de réduire le temps de déploiement des applications. Lorsque de nombreux nœuds d'un cluster de conteneurs doivent extraire une image simultanément, vous pouvez utiliser l'accélération P2P pour améliorer les performances. Cette rubrique décrit comment utiliser la fonctionnalité d'accélération P2P pour accélérer l'extraction des images.
Fonctionnement de l'accélération P2P
Lorsque de nombreux nœuds extraient une image en même temps, le registre d'images de conteneur devient un goulot d'étranglement en termes de bande passante. L'accélération P2P répartit les données d'image entre les nœuds de calcul du cluster, ce qui réduit le trafic vers l'origine et accélère les extractions pour tous les nœuds simultanément.
Dans un cluster de 1 000 nœuds extrayant une image de 1 Go sur un réseau de 10 Gbit/s, l'accélération P2P réduit le temps d'extraction de plus de 95 % par rapport aux extractions d'images standard. Le nouveau mode d'accélération P2P améliore également les performances de 30 à 50 % par rapport à l'ancien mode.
Par défaut, le nouveau mode d'accélération P2P est utilisé lorsque Container Registry charge les ressources d'image à la demande. Pour plus de détails, consultez la rubrique Charger les ressources d'une image de conteneur à la demande.
L'accélération P2P est prise en charge dans les types de clusters suivants :
Clusters ACK
Clusters sur site et clusters de fournisseurs de services cloud tiers
Prérequis
Avant de commencer, assurez-vous que vous avez :
-
Installé un agent d'accélération P2P dans le cluster
Pour les clusters ACK : Installer un agent d'accélération P2P dans un cluster ACK
Pour les clusters sur site ou les clusters tiers : <a data-tag="xref" data-node="4448359" href="t2482715.xdita#">Installer un agent d'accélération P2P dans un cluster sur site ou un cluster d'un fournisseur de services cloud tiers</a>
Modification de votre charge de travail par le webhook
Lorsque l'accélération P2P est activée pour un Pod, le webhook de l'agent d'accélération P2P effectue automatiquement les actions suivantes :
-
Remplace l'adresse de l'image de conteneur par un endpoint accéléré par P2P. Par exemple :
Original :
test****vpc.cn-hangzhou.cr.aliyuncs.com/docker-builder/nginx:latestRemplacé :
test****vpc.distributed.cn-hangzhou.cr.aliyuncs.com:65001/docker-builder/nginx:latest
Génère un secret d'extraction d'image pour l'endpoint P2P, copié à partir de votre secret d'extraction d'image original. Le nouveau secret ne diffère que par le nom de domaine.
La génération du secret d'extraction d'image et le remplacement de l'adresse de l'image sont asynchrones. Pour éviter les échecs d'extraction, créez ou émettez le secret d'extraction d'image pour l'endpoint P2P avant de déployer une charge de travail. Dans l'exemple ci-dessus, le secret est créé dans le domaine test-registry-vpc.distributed.cn-hangzhou.cr.aliyuncs.com:65001.
Si les identifiants de votre secret d'extraction d'image original ne sont pas valides, l'extraction d'image accélérée par P2P échouera également.
Activer l'accélération P2P
Ajoutez le libellé d'accélération P2P (k8s.aliyun.com/image-accelerate-mode: p2p) à une charge de travail ou à un namespace. Vous n'avez pas besoin de modifier les fichiers YAML des charges de travail lorsque vous utilisez la méthode au niveau du namespace.
Option 1 : Ajouter le libellé à une charge de travail
Cet exemple ajoute le libellé à un Deployment. Modifiez le Deployment :
kubectl edit deploy <Name of the Deployment>
Ajoutez le libellé k8s.aliyun.com/image-accelerate-mode: p2p à la section labels du modèle de Pod :
apiVersion: apps/v1
kind: Deployment
metadata:
name: test
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
# enable P2P
k8s.aliyun.com/image-accelerate-mode: p2p
app: nginx
spec:
# your ACR instance image pull secret
imagePullSecrets:
- name: test-registry
containers:
# your ACR instance image
- image: test-registry-vpc.cn-hangzhou.cr.aliyuncs.com/docker-builder/nginx:latest
name: test
command: ["sleep", "3600"]
Option 2 : Ajouter le libellé à un namespace
L'application du libellé au niveau du namespace active l'accélération P2P pour toutes les charges de travail éligibles de ce namespace, sans nécessiter de modifications individuelles pour chaque charge de travail.
Utilisation de la console ACK :
Connectez-vous à la console ACKconsole ACK. Dans le volet de navigation de gauche, cliquez sur Clusters.
Sur la page Clusters, recherchez le cluster souhaité et cliquez sur son nom. Dans le volet de navigation de gauche, cliquez sur Namespaces and Quotas.
Sur la page Namespace, recherchez le namespace cible et cliquez sur Edit dans la colonne Actions.
Dans la boîte de dialogue Edit Namespace, cliquez sur +Labels, définissez Variable Name sur
k8s.aliyun.com/image-accelerate-modeet Variable Value surp2p, puis cliquez sur OK.
Utilisation de kubectl :
kubectl label namespaces <YOUR-NAMESPACE> k8s.aliyun.com/image-accelerate-mode=p2p
Vérifier l'accélération P2P
Après avoir activé l'accélération P2P, confirmez que le webhook a injecté l'annotation, l'adresse d'image P2P et le secret d'extraction d'image P2P dans le Pod.
Exécutez la commande suivante :
kubectl get po <Name of the pod> -oyaml
Sortie attendue :
apiVersion: v1
kind: Pod
metadata:
annotations:
# injected automatically
k8s.aliyun.com/image-accelerate-mode: p2p
k8s.aliyun.com/p2p-config: '...'
spec:
containers:
# image replaced with P2P endpoint
- image: test-registry-vpc.distributed.cn-hangzhou.cr.aliyuncs.com:65001/docker-builder/nginx:latest
imagePullSecrets:
- name: test-registry
# image pull secret for P2P endpoint
- name: acr-credential-test-registry-p2p
L'accélération P2P est active lorsque les trois éléments suivants sont présents dans la sortie :
L'annotation
k8s.aliyun.com/image-accelerate-mode: p2pL'adresse de l'image remplacée par un endpoint P2P
.distributed.Le secret d'extraction d'image P2P (
acr-credential-<original-secret-name>-p2p)
(Facultatif) Désactiver le chargement des images à la demande et activer l'accélération P2P
Suivez cette procédure pour configurer un seul nœud afin qu'il utilise l'accélération P2P sans chargement d'image à la demande.
Ces modifications s'appliquent à un seul nœud uniquement. Les opérations d'exploitation et de maintenance ultérieures sur le nœud peuvent les écraser. Réappliquez les modifications si cela se produit.
Connectez-vous à la console ACKconsole ACK. Dans le volet de navigation de gauche, cliquez sur Clusters.
Sur la page Clusters, cliquez sur le nom du cluster que vous souhaitez gérer. Dans le volet de navigation de gauche, choisissez Nodes > Nodes.
Sur la page Nodes, cliquez sur l'ID d'instance sous l'adresse IP du nœud que vous souhaitez gérer.
Sur la page des détails de l'instance, utilisez Connect pour vous connecter au nœud.
-
Exécutez la commande
vipour modifier le champp2pConfigdans le fichier/etc/overlaybd/overlaybd.json. Définissezenablesurfalse:{ "p2pConfig": { "enable": false, "address": "https://localhost:6****/accelerator" }, ... ... } -
Redémarrez le service overlaybd pour recharger les ressources d'image à la demande :
service overlaybd-tcmu restart
(Facultatif) Activer la collecte de métriques d'accélération
Activer la collecte de métriques
Activez la collecte de métriques lors de l'installation de l'agent d'accélération P2P. Dans la configuration YAML de l'agent, définissez exporter.enable sur true :
p2p:
v2:
# Component for P2P v2
image: registry-vpc.__ACK_REGION_ID__.aliyuncs.com/acs/dadi-agent
imageTag: v0.1.2-72276d4-aliyun
# Concurrency limit on the number of layers each node proxy downloads simultaneously
proxyConcurrencyLimit: 128
# Port for communication between P2P nodes
p2pPort: 65002
cache:
# Disk cache capacity in bytes, default 4 GB
capacity: 4294967296
# Set to 1 if you are using high-performance disks, e.g. ESSD PL2/PL3
aioEnable: 0
exporter:
# Set to true to enable metric collection
enable: false
port: 65003
# Downstream throughput limit in MB/s
throttleLimitMB: 512
Accéder aux métriques
Le champ exporter dans le fichier YAML P2P définit le port d'écoute. Configurez-le comme suit :
ExporterConfig:
enable: true # Enables the metric collection feature.
port: 65006 # Listening port.
standaloneExporterPort: true # Exposes a standalone port. If set to false, throughput is reported over the HTTP service port.
Pour récupérer les métriques, exécutez :
curl 127.0.0.1:$port/metrics
Exemple de sortie :
# HELP DADIP2P_Alive
# TYPE DADIP2P_Alive gauge
DADIP2P_Alive{node="192.168.69.172:65005",mode="agent"} 1.000000 1692156721833
# HELP DADIP2P_Read_Throughtput Bytes / sec
# TYPE DADIP2P_Read_Throughtput gauge
DADIP2P_Read_Throughtput{node="192.168.69.172:65005",type="pread",mode="agent"} 0.000000 1692156721833
DADIP2P_Read_Throughtput{node="192.168.69.172:65005",type="download",mode="agent"} 0.000000 1692156721833
DADIP2P_Read_Throughtput{node="192.168.69.172:65005",type="peer",mode="agent"} 0.000000 1692156721833
DADIP2P_Read_Throughtput{node="192.168.69.172:65005",type="disk",mode="agent"} 0.000000 1692156721833
DADIP2P_Read_Throughtput{node="192.168.69.172:65005",type="http",mode="agent"} 0.000000 1692156721833
# HELP DADIP2P_QPS
# TYPE DADIP2P_QPS gauge
DADIP2P_QPS{node="192.168.69.172:65005",type="pread",mode="agent"} 0.000000 1692156721833
DADIP2P_QPS{node="192.168.69.172:65005",type="download",mode="agent"} 0.000000 1692156721833
DADIP2P_QPS{node="192.168.69.172:65005",type="peer",mode="agent"} 0.000000 1692156721833
DADIP2P_QPS{node="192.168.69.172:65005",type="disk",mode="agent"} 0.000000 1692156721833
DADIP2P_QPS{node="192.168.69.172:65005",type="http",mode="agent"} 0.000000 1692156721833
# HELP DADIP2P_MaxLatency us
# TYPE DADIP2P_MaxLatency gauge
DADIP2P_MaxLatency{node="192.168.69.172:65005",type="pread",mode="agent"} 0.000000 1692156721833
DADIP2P_MaxLatency{node="192.168.69.172:65005",type="download",mode="agent"} 0.000000 1692156721833
DADIP2P_MaxLatency{node="192.168.69.172:65005",type="peer",mode="agent"} 0.000000 1692156721833
DADIP2P_MaxLatency{node="192.168.69.172:65005",type="disk",mode="agent"} 0.000000 1692156721833
DADIP2P_MaxLatency{node="192.168.69.172:65005",type="http",mode="agent"} 0.000000 1692156721833
# HELP DADIP2P_Count Bytes
# TYPE DADIP2P_Count gauge
DADIP2P_Count{node="192.168.69.172:65005",type="pread",mode="agent"} 0.000000 1692156721833
DADIP2P_Count{node="192.168.69.172:65005",type="download",mode="agent"} 0.000000 1692156721833
DADIP2P_Count{node="192.168.69.172:65005",type="peer",mode="agent"} 0.000000 1692156721833
DADIP2P_Count{node="192.168.69.172:65005",type="disk",mode="agent"} 0.000000 1692156721833
DADIP2P_Count{node="192.168.69.172:65005",type="http",mode="agent"} 0.000000 1692156721833
# HELP DADIP2P_Cache
# TYPE DADIP2P_Cache gauge
DADIP2P_Cache{node="192.168.69.172:65005",type="allocated",mode="agent"} 4294967296.000000 1692156721833
DADIP2P_Cache{node="192.168.69.172:65005",type="used",mode="agent"} 4294971392.000000 1692156721833
# HELP DADIP2P_Label
# TYPE DADIP2P_Label gauge
Référence des métriques
Noms des métriques
| Metric | Description | Unit |
|---|---|---|
DADIP2P_Alive |
Indique si le service est actif | — |
DADIP2P_Read_Throughtput |
Débit de lecture du service P2P | octets/s |
DADIP2P_QPS |
Requêtes par seconde | — |
DADIP2P_MaxLatency |
Latence maximale des requêtes | μs |
DADIP2P_Count |
Trafic cumulé traité | octets |
DADIP2P_Cache |
Utilisation du cache par serveur | octets |
Tags
| Tag | Values | Description |
|---|---|---|
node |
IP:port | Adresse de service de l'agent P2P ou de la racine |
type |
pread |
Traitement des requêtes descendantes |
download |
Routage vers l'origine | |
peer |
Distribution via le réseau P2P | |
disk |
Opérations sur disque | |
http |
Traitement des requêtes HTTP | |
allocated |
Espace cache alloué | |
used |
Espace cache utilisé |
Exemple :
DADIP2P_Count{node="11.238.108.XXX:9877",type="http",mode="agent"} 4248808352.000000 1692157615810
The total HTTP request traffic processed by the agent service: 4248808352 bytes.
DADIP2P_Cache{node="11.238.108.XXX:9877",type="used",mode="agent"} 2147487744.000000 1692157615810
The cache used by the agent: 2147487744 bytes.
Journaux d'audit
Activer les journaux d'audit
Dans le ConfigMap p2p, définissez logAudit sur true :
DeployConfig:
mode: agent
logDir: /dadi-p2p/log
logAudit: true
logAuditMode: stdout # stdout sends logs to the console. Set to file to write logs to /dadi-p2p/log/audit.log.
Format des journaux d'audit
Chaque entrée de journal enregistre le temps de traitement depuis la réception de la requête jusqu'au retour de la réponse. Unité : μs.
2022/08/30 15:44:52|AUDIT|th=00007FBA247C5280|download[pathname=/https://cri-pi840la*****-registry.oss-cn-hangzhou.aliyuncs.com/docker/registry/v2/blobs/sha256/dd/dd65726c224b09836aeb6ecebd6baf58c96be727ba86da14e62835569896008a/data][offset=125829120][size=2097152][latency=267172]
....
2022/08/30 15:44:55|AUDIT|th=00007FBA2EFEAEC0|http:pread[pathname=/https://cri-pi840lacia*****-registry.oss-cn-hangzhou.aliyuncs.com/docker/registry/v2/blobs/sha256/dd/dd65726c224b09836aeb6ecebd6baf58c96be727ba86da14e62835569896008a/data][offset=127467520][size=65536][latency=21]
Chaque entrée contient : l'horodatage, AUDIT, le pointeur de thread et un code d'opération avec les champs [pathname=], [size=] et [latency=].
Ignorez le marqueur
AUDITet le pointeur de thread — ils sont destinés à un usage interne.size: taille des données pour une seule requête. Une valeur négative indique une exception.latency: latence de traitement pour une seule requête, en μs.
Codes d'opération courants :
| Code | Description |
|---|---|
http:pread |
Le proxy HTTP traite une requête de données de sortie |
rpc:stat |
L'agent P2P obtient la taille du fichier |
rpc:pread |
L'agent P2P traite une requête de données de sortie |
download |
L'agent P2P télécharge des données depuis l'amont |
filewrite |
L'agent P2P écrit un fragment de données dans le cache |
fileread |
L'agent P2P lit des fragments de données depuis le cache |
Exemple de journal :
download[pathname=mytest][offset=0][size=65536][latency=26461]
## The latency when the P2P agent downloads the [0,65536) data of the mytest file from the upstream is 26461 μs.
rpc:pread[pathname=mytest][offset=0][size=65536][latency=2]
## The latency when the P2P agent returns the [0,65536) data of the mytest file to the downstream is 2 μs.
http:pread[pathname=mytest][offset=0][size=65536][latency=26461]
## The latency when the proxy downloads the [0,65536) data of the mytest file from the upstream is 26461 μs.
Annexe
Référence des performances de l'accélération P2P
Résultats des tests pour 1 000 nœuds extrayant la même image simultanément, avec décompression de l'image après le téléchargement.
Environnement de test :
| Component | Specification |
|---|---|
| Cluster ACK | 1 000 nœuds |
| Instance Elastic Compute Service (ECS) | 4 vCPU, 8 Go de mémoire |
| Disque cloud | ESSD PL1 de 200 Go |
| Agent P2P | 1 vCPU, 1 Go de mémoire, 4 Go de cache |
Spécifications d'image testées :
4 Go (512 Mo × 8 couches)
10 Go (10 Go × 1 couche)
20 Go (4 Go × 5 couches, 10 Go × 2 couches, 512 Mo × 40 couches, 20 Go × 1 couche, 2 Go × 10 couches)
Résultats des tests (temps d'extraction P95) :
| Image specification | Pull time | Peak back-to-origin throughput (Gbit/s) |
|---|---|---|
| 512 Mo × 8 couches | 116 secondes | 2 |
| 10 Go × 1 couche | 6 minutes 20 secondes | 1,2 |
| 4 Go × 5 couches | 9 minutes 15 secondes | 5,1 |
| 10 Go × 2 couches | 9 minutes 50 secondes | 6,7 |
| 512 Mo × 40 couches | 7 minutes 55 secondes | 3,8 |
| 20 Go × 1 couche | 11 minutes | 2,5 |
| 2 Go × 10 couches | 8 minutes 13 secondes | 3,2 |