侧边栏壁纸
  • 累计撰写 7 篇文章
  • 累计创建 7 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

使用 Macvlan 和 TC 对容器魔方进行限速

ManJieqi
2024-09-11 / 0 评论 / 2 点赞 / 73 阅读 / 0 字

本教程将介绍如何使用 macvlan 和 tc(Traffic Control)对容器魔方进行带宽限制,而不影响其他进程。

过程包括创建一个 macvlan 网络,配置 Compose 文件以及带宽限制规则。

步骤 1: 找到物理网卡及其子网和网关

首先,需要找到宿主机的物理网卡及其子网和网关。使用以下命令查看网络接口信息:

ip addr show

在输出中,找到包含宿主机内网 IP 的网卡。

例如,宿主机的内网 IP 是 192.168.1.100,对应的网卡是 enp2s0。记下该网卡的名称、子网和网关。

步骤 2: 创建 macvlan 网络

接下来,创建一个 macvlan 网络。以下命令将创建一个 macvlan 网络,IPv4 子网和网关与物理网卡相同,IPv6 使用内部地址,无需修改。

如果路由器和光猫支持,将能够自动获取公网 IPv6 地址。

sudo docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
--ipv6 \
--subnet=fd0d:7eb5:2afd::/64 \
--gateway=fd0d:7eb5:2afd::1 \
-o parent=enp2s0 \
macvlan

步骤 3: 配置 Docker Compose 文件

在 Docker Compose 文件中,配置服务使用 macvlan 网络,并指定容器的 IPv4 地址。请确保配置的内网 IP 不要与现有设备冲突。

services:
  wxedge:
    image: images-cluster.xycloud.com/wxedge/wxedge:latest
    container_name: wxedge
    restart: unless-stopped
    privileged: true
    volumes:
      - ./storage:/storage:rw
    environment:
      - LISTEN_ADDR=:18888
    networks:
      macvlan:
        ipv4_address: 192.168.1.11

networks:
  macvlan:
    external: true

这里访问扫码页使用 http://192.168.1.11:18888,访问不了看下面。

步骤 4: 使宿主机能够访问容器魔方

宿主机默认不能访问 macvlan 地址,局域网其他主机可以。为了使宿主机能够访问,我们需要创建一个 macvlan 接口,并添加相应的路由。

sudo ip link add macvlan0 link enp2s0 type macvlan mode bridge
sudo ip addr add 192.168.1.254/24 dev macvlan0
sudo ip link set macvlan0 up
sudo ip route add 192.168.1.11 dev macvlan0
# 删除路由的命令
sudo ip route del 192.168.1.11 dev macvlan0

步骤 5: 配置带宽限制

使用 tc(Traffic Control)配置带宽限制规则。首先是显示当前的 qdisc、class 和 filter 配置的一些命令。

sudo tc qdisc show dev enp2s0
sudo tc class show dev enp2s0
sudo tc filter show dev enp2s0

删除现有的 qdisc 配置,并添加新的带宽限制规则。

sudo tc qdisc del dev enp2s0 root
sudo tc qdisc add dev enp2s0 root handle 1: htb default 10
sudo tc class add dev enp2s0 parent 1: classid 1:1 htb rate 24mbit ceil 32mbit quantum 1500
sudo tc qdisc add dev enp2s0 parent 1:1 handle 10: fq_codel
sudo tc filter add dev enp2s0 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.1.11 flowid 1:1
sudo tc filter add dev enp2s0 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.1.11 flowid 1:1

带宽限制规则的说明

1. sudo tc qdisc del dev enp2s0 root

删除现有的 qdisc 配置。使用此命令可以复原配置。

2. sudo tc qdisc add dev enp2s0 root handle 1: htb default 10

添加一个新的 HTB(Hierarchical Token Bucket) qdisc,默认类 ID 为 10。

3. sudo tc class add dev enp2s0 parent 1: classid 1:1 htb rate 24mbit ceil 32mbit

在 HTB qdisc 下添加一个类,保证带宽为 24mbit,最大带宽为 32mbit,量子为 1500 字节。

4. sudo tc qdisc add dev enp2s0 parent 1:1 handle 10: fq_codel

在类 1:1 下添加一个 fq_codel(Fair Queuing Controlled Delay) qdisc。

5. sudo tc filter add dev enp2s0 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.1.11 flowid 1:1

添加一个过滤器,匹配源 IP 为 192.168.1.11 的流量,流量 ID 为 1:1。

6. sudo tc filter add dev enp2s0 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.1.11 flowid 1:1

添加一个过滤器,匹配目标 IP 为 192.168.1.11 的流量,流量 ID 为 1:1。

注意事项

步骤4和5在宿主机重启后失效,需要重新配置,可以写脚本开机自动运行。

2

评论区