Đếm băng thông từ một container Docker


13

Tôi đang cố gắng tìm ra cách theo dõi băng thông đến từ một container Docker.

Thông thường tôi sử dụng --uid-ownerlàm dấu để theo dõi việc sử dụng băng thông cho một người dùng nhất định. Tuy nhiên, ngay cả khi tôi chạy tất cả các quy trình vì người dùng bên trong container docker --uid-ownerkhông hoạt động. Thay vì sử dụng --uid-owner, tôi đã thử chỉ theo dõi tất cả các gói đến từ thiết bị ethernet ảo mà docker tạo ra.

Điều này, tuy nhiên, cuối cùng cũng không làm gì cả: bất kể tôi cố gắng gì, không có gói tin nào bị bắt.

Vì tuyệt vọng, tôi đã cố gắng đưa các quy tắc vào tất cả các chuỗi nhưng cũng không có kết quả.

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

Ai đó có thể cho tôi biết làm thế nào để đánh dấu thành công các gói từ một container docker không? Tốt nhất là sử dụng --uid-ownernhưng tôi sẽ lấy bất cứ thứ gì vào thời điểm này :)

Câu trả lời:


4

Vấn đề liên quan đến không gian tên. Docker sử dụng chúng để cô lập tài nguyên, điều đó cũng có nghĩa là chúng không được tính vào tổng số của máy chủ.

Khi bạn chạy iptablestrên máy chủ, về cơ bản bạn chỉ nhìn vào không gian tên của máy chủ và các gói bạn quan tâm được tính vào không gian tên của bộ chứa. Để khắc phục sự cố này, bạn có thể sử dụng ip netnsđể vẫn chạy iptables trên máy chủ, nhưng trong không gian tên mạng của bộ chứa.

Đầu tiên, ip netnscó một giao diện trực quan phần nào. Để đính kèm vào không gian tên của một quy trình hiện có (trong trường hợp này là thùng chứa của bạn), bạn phải tạo một liên kết /var/run/netns/đến không gian tên của quy trình:

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

(bạn có thể phải mkdir /var/run/netns)

Bây giờ bạn có thể chạy iptables trong không gian tên của bạn:

# ip netns exec SOME_NAME iptables -L -nv

Lưu ý rằng điều này xuất ra quy tắc của iptables bên trong container, có thể sẽ trống.

Nếu bạn hiện đang sử dụng --uid-own chỉ để có bộ đếm cho mỗi người dùng, bạn thậm chí không cần nó nữa, vì trong trường hợp này, bộ đếm chuỗi chỉ áp dụng cho container và sau đó là đủ.

Cuối cùng, bạn có thể dọn dẹp /var/run/netns.

Nhiều container cho mỗi người dùng

Nếu bạn có nhiều vùng chứa cho mỗi người dùng và muốn kiểm tra chúng cùng nhau, bạn có thể bắt đầu các vùng chứa của mình --net=container:OTHER_CONTAINER_FROM_USERđể không gian tên của chúng được hợp nhất.

Điều này có nhược điểm là hợp nhất tất cả các khía cạnh của ngăn xếp mạng, bao gồm các cổng mở, do đó bạn không thể có hai thùng chứa cho cùng một người dùng nghe trên cùng một cổng.

Nếu đây là một giới hạn cấm, bạn có thể kiểm đếm các thùng chứa riêng lẻ và nhóm dựa trên uid sau này.

Bạn có thể tìm thấy một số thông tin về vấn đề này ở đây .


0

Không chính xác những gì bạn yêu cầu, nhưng tôi hình dung nó sẽ hoàn thành công việc.

Trích dẫn từ blog Docker :

Bộ đếm cấp giao diện

Vì mỗi container có giao diện Ethernet ảo, bạn có thể muốn kiểm tra trực tiếp bộ đếm TX và RX của giao diện này.

[...]

Nhưng hiện tại, cách tốt nhất là kiểm tra các số liệu từ trong các thùng chứa. Tôi không nói về việc điều hành một đặc vụ trong container, hoặc bất cứ điều gì tương tự. Chúng tôi sẽ chạy một thực thi từ môi trường máy chủ, nhưng trong không gian tên mạng của một container.

Định dạng chính xác của lệnh là:

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

Ví dụ:

ip netns exec mycontainer netstat -i


2
Tôi đã định dạng lại câu trả lời của bạn rất nhiều, hãy thử trích dẫn các tài nguyên theo kiểu tương tự trong các câu trả lời trong tương lai của bạn để làm cho chúng hữu ích hơn.
fuero
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.