一. 问题

问题描述: Grafana 添加Data Sources Test 时失败,显示Network Error: Bad Gateway(502)

test-failed

之前在 Ubuntu 16.04 上部署 Grafana + influxdb 的 Docker 并没有遇到这个问题。

怀疑可能导致问题的因素有:

  • iptables 阻挡
  • Docker 版本的问题
  • 内核版本低的原因
  • 容器之间网络不通

二. 环境

  • OS:CentOS 6.4
  • kernel:Linux 2.6.32-696
  • Docker:version 1.7.1

三. 排查

3.1.1. 内核版本

官方推荐 CentOS 7 上使用 Docker,机器是 CentOS 6.4,但是既然可以正常安装 Docker 且可以启动容器,应该没什么问题。

3.1.2 Docker 版本

CentOS 6.4 上使用的 Docker 版本比较老,貌似不太支持新版本的 Docker,暂不排查。

3.1.3. iptables

# iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0           ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0
MASQUERADE  tcp  --  172.17.0.7           172.17.0.7          tcp dpt:8086
MASQUERADE  tcp  --  172.17.0.7           172.17.0.7          tcp dpt:8083
MASQUERADE  tcp  --  172.17.0.8           172.17.0.8          tcp dpt:3000
MASQUERADE  tcp  --  172.17.0.9           172.17.0.9          tcp dpt:8080

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8         ADDRTYPE match dst-type LOCAL

Chain DOCKER (2 references)
target     prot opt source               destination
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:8086 to:172.17.0.7:8086
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:8083 to:172.17.0.7:8083
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:3000 to:172.17.0.8:3000
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:8080 to:172.17.0.9:8080

反复的对比了 CentOS 和 Ubuntu 上的 iptables 策略,也没有什么太大的出入。
由于在浏览器中是可以访问http://grafanaIP:3000的,所以 iptables 应该也没什么太大问题。
那么,只剩一种可能了,容器间访问不通。

3.1.4. 容器间互通

进入容器 Granafa 后 ping InfluxDB 是可以通的,说明容器间网络是通的,那应该是连接 InfluxDB 的端口不通造成的。

容器访问外部网络需要本地系统的转发支持,是否是转发没有开启?

# sysctl net.ipv4.conf.all.forwarding
net.ipv4.conf.all.forwarding = 0

看起来确实没有开启,开启转发

sysctl net.ipv4.conf.all.forwarding=1

执行后再进行测试,发现测试通过了,问题解决。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐