在 ubuntu 20.04 上部署 docker 容器到 swarm 时出现 br_netfilter 错误

Posted

技术标签:

【中文标题】在 ubuntu 20.04 上部署 docker 容器到 swarm 时出现 br_netfilter 错误【英文标题】:br_netfilter error when deploying docker containers to swarm on ubuntu 20.04 【发布时间】:2021-06-23 03:36:13 【问题描述】:

我一直在努力将我的容器部署到 Ubuntu 服务器 20.04 上的 Docker swarm。 我正在尝试在单个 VPS 主机上使用 Docker swarm 进行零停机部署。

使用 docker-compose 运行容器一切正常。

现在尝试将相同的 docker-compose 文件部署到 docker swarm。

# docker swarm init
Swarm initialized: current node (wlshyv0s1n5c85mao8jt9wo5j) is now a manager.

To add a worker to this swarm, run the following command:
...

# docker stack deploy --compose-file docker-compose.yml dash
Ignoring unsupported options: build

Creating network dash_default
Creating service dash_db
Creating service dash_nginx
...

完成部署命令后,docker ps 我看到没有正在运行的容器。

现在检查 docker ps -a 我看到很多容器,它们的所有状态都显示为“已创建”。

接下来,当我检查一个容器时,它的状态显示:

"State": 
    "Status": "created",
    "Running": false,
    "Paused": false,
    "Restarting": false,
    "OOMKilled": false,
    "Dead": false,
    "Pid": 0,
    "ExitCode": 128,
    "Error": "error creating external connectivity network: cannot restrict inter-container communication: please ensure that br_netfilter kernel module is loaded",
    "StartedAt": "0001-01-01T00:00:00Z",
    "FinishedAt": "0001-01-01T00:00:00Z"

检查加载的模块:

# lsmod | grep br_netfilter
br_netfilter            4242  -2
bridge                  4242  -2 br_netfilter,ebtable_broute

在运行docker info 后,我看到了 2 个警告:

# docker info
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Build with BuildKit (Docker Inc., v0.5.1-docker)

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 40
 Server Version: 20.10.5
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: active
  NodeID: ij25ein3xvcr8p5ky765ol8t0
  Is Manager: true
  ClusterID: mdb2r7vnngw62lg8uoj5ef55k
  Managers: 1
  Nodes: 1
  Default Address Pool: 10.0.0.0/8
  SubnetSize: 24
  Data Path Port: 4789
  Orchestration:
   Task History Retention Limit: 5
  Raft:
   Snapshot Interval: 10000
   Number of Old Snapshots to Retain: 0
   Heartbeat Tick: 1
   Election Tick: 10
  Dispatcher:
   Heartbeat Period: 5 seconds
  CA Configuration:
   Expiry Duration: 3 months
   Force Rotate: 0
  Autolock Managers: false
  Root Rotation In Progress: false
  ...
 Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 05f951a3781f4f2c1911b05e61c160e9c30eaa8e
 runc version: 12644e614e25b05da6fd08a38ffa0cfe1903fdec
 init version: de40ad0
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 5.4.0
 Operating System: Ubuntu 20.04.2 LTS
 OSType: linux
 Architecture: x86_64
 CPUs: 2
 Total Memory: 4GiB
 ...
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled

在寻找解决方案时发现应该调用sysctl 命令,但还是报错。

# sysctl net.bridge.bridge-nf-call-ip6tables=1
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or directory

现在正在搜索解决方案,我找到了下一个命令,但这也不起作用。

# modprobe br_netfilter
modprobe: FATAL: Module br_netfilter not found in directory /lib/modules/5.4.0

我不知道该怎么做才能让 swarm 工作。

在我的 Windows 机器上使用 swarm 模式时一切正常。

关于下一步我应该做什么/检查有什么建议吗?

【问题讨论】:

【参考方案1】:

问题出在托管服务提供商上。

提供商告诉我们,其他客户也尝试在他们的 VPS 上配置 Docker Swarm,但没有人弄清楚如何让它工作。

提供者不允许任何内核修改或较低级别的任何其他内容。

现在我们正在使用另一个托管服务提供商,一切正常。

【讨论】:

我可以在尝试 Centos7、Centos8 和 Ubuntu20 后确认,A2Hosting 似乎不允许这样做。您现在使用哪个提供商?? 我们使用的是本地托管服务提供商,这在国际上不是很流行,但诀窍在于,VPS 容器必须使用 KVM 虚拟化。 最后我在Digital Ocean上试用了一个Centos8 VPS,第一次运行良好。

以上是关于在 ubuntu 20.04 上部署 docker 容器到 swarm 时出现 br_netfilter 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在Ubuntu 20.04上安装Docker Compose

如何在Ubuntu 20.04上安装Docker Compose

在 Ubuntu 20.04 LTS(Vmware)上安装 docker 失败

我看不到在 ubuntu 20.04 上运行 docker compose 容器

UBUNTU 20.04 docker部署 企业级开源局域网IP地址管理系统 Phpipam系统安装设置

在Ubuntu20.04上安装Kubernetes-Kubeadm和Minikube