O recurso de aceleração P2P agiliza o pull de imagens para reduzir o tempo de implantação de aplicações. Quando vários nós em um cluster de contêineres precisam fazer pull de uma imagem simultaneamente, a aceleração P2P melhora significativamente o desempenho. Este tópico descreve como utilizar esse recurso para acelerar o pull de imagens.
Como funciona a aceleração P2P
Quando muitos nós fazem pull de uma imagem ao mesmo tempo, o registro de imagens de contêiner torna-se um gargalo de largura de banda. A aceleração P2P distribui os dados da imagem entre os nós de computação do cluster, reduzindo o tráfego back-to-origin e acelerando o pull para todos os nós simultaneamente.
Em um cluster de 1.000 nós fazendo pull de uma imagem de 1 GB em uma rede de 10 Gbit/s, a aceleração P2P reduz o tempo de pull em mais de 95% em comparação com pulls padrão. O novo modo de aceleração P2P também oferece uma melhoria de desempenho de 30% a 50% em relação ao modo anterior.
Por padrão, o Container Registry utiliza o novo modo de aceleração P2P ao carregar recursos de imagem sob demanda. Para mais detalhes, consulte Carregar recursos de uma imagem de contêiner sob demanda.
A aceleração P2P é compatível com os seguintes tipos de cluster:
Clusters ACK
Clusters on-premises e clusters de provedores de serviços de nuvem terceirizados
Pré-requisitos
Antes de começar, verifique se você possui:
-
Um agente de aceleração P2P instalado no cluster
Para clusters ACK: Instalar um agente de aceleração P2P em um cluster ACK
Para clusters on-premises ou de terceiros: Instalar um agente de aceleração P2P em um cluster on-premises ou de um provedor de serviços de nuvem terceirizado
Como o webhook modifica sua carga de trabalho
Ao ativar a aceleração P2P para um Pod, o webhook do agente de aceleração P2P executa automaticamente as seguintes ações:
-
Substitui o endereço da imagem do contêiner por um endpoint com aceleração P2P. Exemplo:
Original:
test****vpc.cn-hangzhou.cr.aliyuncs.com/docker-builder/nginx:latestSubstituído:
test****vpc.distributed.cn-hangzhou.cr.aliyuncs.com:65001/docker-builder/nginx:latest
Gera um secret de pull de imagem para o endpoint P2P, copiado do seu secret original. O novo secret difere apenas no nome de domínio.
A geração do secret de pull de imagem e a substituição do endereço da imagem são processos assíncronos. Para evitar falhas no pull, crie ou emita o secret de pull de imagem para o endpoint P2P antes de implantar uma carga de trabalho. No exemplo acima, o secret é criado no domínio test-registry-vpc.distributed.cn-hangzhou.cr.aliyuncs.com:65001.
Se as credenciais no seu secret original de pull de imagem forem inválidas, o pull de imagem com aceleração P2P também falhará.
Ativar aceleração P2P
Adicione o rótulo de aceleração P2P (k8s.aliyun.com/image-accelerate-mode: p2p) a uma carga de trabalho ou a um namespace. Não é necessário modificar arquivos YAML de carga de trabalho ao utilizar o método em nível de namespace.
Opção 1: Adicionar o rótulo a uma carga de trabalho
Este exemplo adiciona o rótulo a um Deployment. Edite o Deployment:
kubectl edit deploy <Name of the Deployment>
Adicione o rótulo k8s.aliyun.com/image-accelerate-mode: p2p à seção labels do modelo 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"]
Opção 2: Adicionar o rótulo a um namespace
Aplicar o rótulo no nível de namespace ativa a aceleração P2P para todas as cargas de trabalho elegíveis nesse namespace, sem exigir alterações individuais em cada carga.
Usando o console ACK:
Faça login no console ACKconsole ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, localize o cluster desejado e clique em seu nome. No painel de navegação à esquerda, clique em Namespaces and Quotas.
Na página Namespace, encontre o namespace de destino e clique em Edit na coluna Actions.
Na caixa de diálogo Edit Namespace, clique em +Labels, defina Variable Name como
k8s.aliyun.com/image-accelerate-modee Variable Value comop2pe, em seguida, clique em OK.
Usando kubectl:
kubectl label namespaces <YOUR-NAMESPACE> k8s.aliyun.com/image-accelerate-mode=p2p
Verificar a aceleração P2P
Após ativar a aceleração P2P, confirme se o webhook injetou a anotação, o endereço da imagem P2P e o secret de pull de imagem P2P no Pod.
Execute o seguinte comando:
kubectl get po <Name of the pod> -oyaml
Saída esperada:
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
A aceleração P2P estará ativa quando os três itens abaixo estiverem presentes na saída:
A anotação
k8s.aliyun.com/image-accelerate-mode: p2pO endereço da imagem substituído por um endpoint P2P
.distributed.O secret de pull de imagem P2P (
acr-credential-<original-secret-name>-p2p)
(Opcional) Desativar o carregamento de imagens sob demanda e ativar a aceleração P2P
Utilize este procedimento para configurar um único nó para usar aceleração P2P sem o carregamento de imagens sob demanda.
Essas alterações aplicam-se apenas a um único nó. Operações subsequentes de O&M no nó podem sobrescrevê-las. Reaplique as alterações caso isso ocorra.
Faça login no console ACKconsole ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do cluster que deseja gerenciar. No painel de navegação à esquerda, escolha Nodes > Nodes.
Na página Nodes, clique no ID da instância sob o endereço IP do nó que deseja gerenciar.
Na página de detalhes da instância, use Connect para fazer login no nó.
-
Execute o comando
vipara editar o campop2pConfigno arquivo/etc/overlaybd/overlaybd.json. Definaenablecomofalse:{ "p2pConfig": { "enable": false, "address": "https://localhost:6****/accelerator" }, ... ... } -
Reinicie o serviço overlaybd para recarregar os recursos de imagem sob demanda:
service overlaybd-tcmu restart
(Opcional) Ativar coleta de métricas de aceleração
Ativar coleta de métricas
Ative a coleta de métricas durante a instalação do agente de aceleração P2P. Na configuração YAML do agente, defina exporter.enable como 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
Acessar métricas
O campo exporter no arquivo YAML do P2P define a porta de escuta. Configure-o da seguinte forma:
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.
Para recuperar as métricas, execute:
curl 127.0.0.1:$port/metrics
Exemplo de saída:
# 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
Referência de métricas
Nomes das métricas
|
Métrica |
Descrição |
Unidade |
|
|
Indica se o serviço está ativo |
— |
|
|
Throughput de leitura do serviço P2P |
bytes/s |
|
|
Consultas por segundo |
— |
|
|
Latência máxima de requisição |
μs |
|
|
Tráfego acumulado processado |
bytes |
|
|
Uso de cache por servidor |
bytes |
Tags
|
Tag |
Valores |
Descrição |
|
|
IP:porta |
Endereço de serviço do agente P2P ou raiz |
|
|
|
Processamento de requisição downstream |
|
|
Roteamento back-to-origin |
|
|
|
Distribuição de rede P2P |
|
|
|
Operações de disco |
|
|
|
Processamento de requisição HTTP |
|
|
|
Espaço de cache alocado |
|
|
|
Espaço de cache em uso |
Exemplo:
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.
Logs de auditoria
Ativar logs de auditoria
No ConfigMap p2p, defina logAudit como 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.
Formato do log de auditoria
Cada entrada de log registra o tempo de processamento desde o recebimento da requisição até o retorno da resposta. Unidade: μ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]
Cada entrada contém: timestamp, AUDIT, ponteiro de thread e um código de operação com os campos [pathname=], [size=] e [latency=].
Ignore o marcador
AUDITe o ponteiro de thread — eles são para uso interno.size: tamanho dos dados para uma única requisição. Um valor negativo indica uma exceção.latency: latência de processamento para uma única requisição, em μs.
Códigos de operação comuns:
|
Código |
Descrição |
|
|
Proxy HTTP processando uma requisição de dados de saída |
|
|
Agente P2P obtendo o tamanho do arquivo |
|
|
Agente P2P processando uma requisição de dados de saída |
|
|
Agente P2P baixando dados da origem (upstream) |
|
|
Agente P2P gravando um shard de dados no cache |
|
|
Agente P2P lendo shards de dados do cache |
Exemplo de log:
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.
Apêndice
Referência de desempenho da aceleração P2P
Resultados de testes com 1.000 nós fazendo pull da mesma imagem simultaneamente, com descompressão da imagem após o download.
Ambiente de teste:
|
Componente |
Especificação |
|
Cluster ACK |
1.000 nós |
|
Instância Elastic Compute Service (ECS) |
4 vCPUs, 8 GB de memória |
|
Disco em nuvem |
ESSD PL1 de 200 GB |
|
Agente P2P |
1 vCPU, 1 GB de memória, 4 GB de cache |
Especificações de imagem testadas:
4 GB (512 MB × 8 camadas)
10 GB (10 GB × 1 camada)
20 GB (4 GB × 5 camadas, 10 GB × 2 camadas, 512 MB × 40 camadas, 20 GB × 1 camada, 2 GB × 10 camadas)
Resultados dos testes (tempo de pull P95):
|
Especificação da imagem |
Tempo de pull |
Throughput pico back-to-origin (Gbit/s) |
|
512 MB × 8 camadas |
116 segundos |
2 |
|
10 GB × 1 camada |
6 minutos e 20 segundos |
1,2 |
|
4 GB × 5 camadas |
9 minutos e 15 segundos |
5,1 |
|
10 GB × 2 camadas |
9 minutos e 50 segundos |
6,7 |
|
512 MB × 40 camadas |
7 minutos e 55 segundos |
3,8 |
|
20 GB × 1 camada |
11 minutos |
2,5 |
|
2 GB × 10 camadas |
8 minutos e 13 segundos |
3,2 |