Contando a largura de banda de um contêiner Docker

13

Estou tentando descobrir como rastrear a largura de banda proveniente de um contêiner do Docker.

Normalmente, uso --uid-owner como marca para acompanhar o uso da largura de banda para um determinado usuário. No entanto, mesmo quando executo todos os processos, o usuário dentro do contêiner do docker --uid-owner não está funcionando. Em vez de usar --uid-owner , tentei apenas rastrear todos os pacotes provenientes do dispositivo de ethernet virtual criado pelo docker.

Isso, no entanto, acabou não fazendo nada também: não importa o que eu tente, nenhum pacote está sendo capturado.

Fora de puro desespero, tentei apenas colocar as regras em todas as correntes, mas não tive resultado nenhum.

Chain PREROUTING (policy ACCEPT 3041 packets, 7849454 bytes)
num      pkts      bytes target     prot opt in     out     source               destination
1           0        0 MARK       tcp  --  veth5a36 any     anywhere             anywhere             MARK set 0x1

Chain INPUT (policy ACCEPT 273 packets, 23305 bytes)
num      pkts      bytes target     prot opt in     out     source               destination
1           0        0 MARK       tcp  --  veth5a36 any     anywhere             anywhere             MARK set 0x1

Chain FORWARD (policy ACCEPT 2750 packets, 7821109 bytes)
num      pkts      bytes target     prot opt in     out     source               destination
1           0        0 MARK       tcp  --  any    veth5a36  anywhere             anywhere             MARK set 0x1
2           0        0 MARK       tcp  --  veth5a36 any     anywhere             anywhere             MARK set 0x1
3           0        0            all  --  veth5a36 eth0    anywhere             anywhere             mark match 0x1

Chain OUTPUT (policy ACCEPT 293 packets, 80020 bytes)
num      pkts      bytes target     prot opt in     out     source               destination
1           0        0 MARK       tcp  --  any    veth5a36  anywhere             anywhere             MARK set 0x1

Chain POSTROUTING (policy ACCEPT 3043 packets, 7901129 bytes)
num      pkts      bytes target     prot opt in     out     source               destination
1           0        0 MARK       tcp  --  any    veth5a36  anywhere             anywhere             MARK set 0x1

Alguém pode me dizer como marcar pacotes com êxito a partir de um contêiner docker? De preferência, usando --uid-owner , mas vou pegar qualquer coisa nesse ponto :)

    
por Maran 27.07.2014 / 20:23

2 respostas

4

O problema está relacionado aos namespaces. O Docker os usa para isolar recursos, o que também significa que eles não contam para os totais do host.

Quando você executa iptables no host, basicamente, você está apenas examinando o namespace do host, e os pacotes nos quais você está interessado são computados no namespace do contêiner. Para contornar esse problema, você pode usar ip netns para ainda executar o iptables no host, mas no namespace de rede do contêiner.

Primeiro, ip netns tem uma interface um pouco intuitiva. Para anexar ao namespace de um processo existente (neste caso, seu contêiner), você deve criar um link em /var/run/netns/ para o namespace do processo:

# ln -sf /proc/'docker inspect -f '{{ .State.Pid }}' YOUR_CONTAINER'/ns/net /var/run/netns/SOME_NAME

(você pode ter que mkdir /var/run/netns )

Agora você está livre para executar o iptables no namespace do seu contêiner:

# ip netns exec SOME_NAME iptables -L -nv

Note que isso gera o conjunto de regras do iptables dentro do container, que provavelmente estará vazio.

Se você está usando atualmente --uid-owner apenas para ter contadores por usuário, você nem precisa mais dele, porque nesse caso os contadores de cadeia se aplicam apenas ao contêiner e devem ser suficientes.

Finalmente, você pode limpar /var/run/netns .

Vários contêineres por usuário

Se você tiver vários contêineres por usuário e quiser agrupá-los, poderá iniciar seus contêineres com --net=container:OTHER_CONTAINER_FROM_USER , para que os namespaces deles sejam mesclados.

Isso tem a desvantagem de mesclar todos os aspectos da pilha de rede, incluindo portas abertas, portanto, você não pode ter dois contêineres para o mesmo usuário que está ouvindo na mesma porta.

Se essa for uma limitação proibitiva, você poderá contar os contêineres individualmente e agrupar com base no uid mais tarde.

Você pode encontrar mais algumas informações sobre esse assunto aqui .

    
por 11.08.2014 / 04:36
0

Não é exatamente o que você pediu, mas eu acho que ele fará o trabalho.

Cite o blog do Docker :

Interface-level counters

Since each container has a virtual Ethernet interface, you might want to check directly the TX and RX counters of this interface.

[...]

But for now, the best way is to check the metrics from within the containers. I’m not talking about running a special agent in the container, or anything like that. We are going to run an executable from the host environment, but within the network namespace of a container.

The exact format of the command is:

ip netns exec <nsname> <command...>

For instance:

ip netns exec mycontainer netstat -i

    
por 27.07.2014 / 20:44