2014-05-02 15 views
6

Bộ kết nối tạo giao diện veth được kết nối với cầu (docker0) cho mỗi vùng chứa được tạo.chạy tập lệnh khi giao diện veth mới được thêm

http://docs.docker.io/use/networking/

Tôi muốn giới hạn băng thông này veth giao diện mới có. Tôi tìm thấy một cách để làm điều này với wondershaper. Tuy nhiên tôi muốn tự động hóa điều này.

Có cách nào để có móc để chạy tập lệnh mỗi lần có giao diện veth mới được đính kèm không?

Tôi đã xem xét thêm tập lệnh trong /etc/network/if-up.d/, nhưng chúng không chạy khi veth chỉ được thêm trong khi khởi động.

Dưới đây là một số syslog về những gì tôi đang cố gắng để được thông báo. Tôi biết tôi có thể kết thúc các bản ghi này nhưng phương pháp đó có vẻ như là loại hacky và phải có cách để nhận thông báo về sự kiện này thông qua hệ điều hành.

May 2 23:28:41 ip-10-171-7-2 kernel: [22170163.565812] netlink: 1 bytes leftover after parsing attributes. 
May 2 23:28:42 ip-10-171-7-2 kernel: [22170163.720571] IPv6: ADDRCONF(NETDEV_UP): veth5964: link is not ready 
May 2 23:28:42 ip-10-171-7-2 kernel: [22170163.720587] device veth5964 entered promiscuous mode 
May 2 23:28:42 ip-10-171-7-2 avahi-daemon[1006]: Withdrawing workstation service for vethdc8c. 
May 2 23:28:42 ip-10-171-7-2 kernel: [22170163.743283] IPv6: ADDRCONF(NETDEV_CHANGE): veth5964: link becomes ready 
May 2 23:28:42 ip-10-171-7-2 kernel: [22170163.743344] docker0: port 27(veth5964) entered forwarding state 
May 2 23:28:42 ip-10-171-7-2 kernel: [22170163.743358] docker0: port 27(veth5964) entered forwarding state 
May 2 23:28:48 ip-10-171-7-2 kernel: [22170170.518670] docker0: port 26(vethb06a) entered forwarding state 
May 2 23:28:57 ip-10-171-7-2 kernel: [22170178.774676] docker0: port 27(veth5964) entered forwarding state 

Trả lời

2

Bạn nên viết quy tắc tùy chỉnh udev chạy tập lệnh của bạn mỗi lần thêm giao diện mới. Đây là những gì Debian làm để xử lý giao diện "hotplug".

/etc/udev/rules.d/90-my-networking.rules:

SUBSYSTEM=="net",   RUN+="/usr/local/bin/my-networking-agent.sh" 

/usr/local/bin/my-networking-agent.sh:

#!/bin/sh 
logger "hey I just got interface ${INTERFACE} with action ${ACTION}" 

EDIT

Đây là cách bạn có thể kiểm tra nó:

# modprobe dummy0 
# ifconfig dummy0 up 
# tail -n1 /var/log/syslog 
May 3 01:48:06 ernst logger: hey I just got interface dummy0 with action add 
+0

Cảm ơn bạn rất nhiều! Tôi đã đào bới các hướng dẫn sử dụng mạng ubuntu và không thể tìm thấy bất cứ thứ gì. –

0

Các quy tắc udev là một trong những cách để thực hiện điều đó, tuy nhiên có một số thiếu thông tin ở đó, tức là không có cách nào đáng tin cậy và đơn giản để biết vùng chứa nào veth được liên kết với. Tôi không chắc liệu trong trường hợp của bạn có đủ để chỉ đơn giản đặt giới hạn băng thông vào cuối của máy chủ là cặp veth, có thể là chấm dứt, nhưng cũng có đầu kia của nó trong không gian tên của vùng chứa, cái gì đó bạn có thể xem sử dụng các lệnh ip netns hoặc nsenter. Vì vậy, nếu bạn cần phải hoạt động trên cả hai đầu của cặp veth, tốt nhất là nên có ID vùng chứa, vì vậy bạn có thể tra cứu PID và không gian tên mạng được liên kết với nó. Một cách để làm điều đó là chạy docker events và phân tích cú pháp đầu ra của nó, nhưng cách tốt hơn là sử dụng API socket của Docker. Đối với một trường hợp sử dụng tôi đã có trước đó, nó là đủ để shell-out để docker events và đây là một kịch bản tôi đã viết, những gì nó làm là thêm một tuyến đường bên trong một container và tắt offum checksum với ethtool.

#!/bin/sh -x 

[ ! $# = 2 ] && exit 1; 

container_interface="$1" 
add_route="$2" 

docker events | while read event 
do 
    echo $event | grep -q -v '\ start$' && continue 

    container_id=`echo $event | sed 's/.*Z\ \(.*\):\ .*/\1/'` 

    nsenter="nsenter -n -t {{ .State.Pid }} --" 
    ip_route_add="ip route add ${add_route} dev ${container_interface} proto kernel scope link src {{ .NetworkSettings.IPAddress }}" 
     ethtool_tx_off="ethtool -K ${container_interface} tx off >/dev/null" 

    eval `docker inspect --format="${nsenter} ${ip_route_add}; ${nsenter} ${ethtool_tx_off};" ${container_id}` 
done 

Ngoài docker events, còn có một cách khác để bắt sự kiện mạng với lệnh ip monitor. Tuy nhiên, theo cách đó bạn vẫn không có ID vùng chứa, tương tự như phương thức udev.

+1

Có thể sử dụng 'sự kiện docker --filter 'event = start'' thay vì grep đầu tiên? – Bryan

Các vấn đề liên quan