fastdfs icon indicating copy to clipboard operation
fastdfs copied to clipboard

docker部署启用了双IP还是获取不到storage的外部网络地址

Open LockiJiang opened this issue 4 years ago • 5 comments

使用docker部署 tracker.conf已经修改

# if use storage ID instead of IP address
# default value is false
# since V4.00
use_storage_id = true

# specify storage ids filename, can use relative or absolute path
# since V4.00
storage_ids_filename = storage_ids.conf

# id type of the storage server in the filename, values are:
## ip: the ip address of the storage server
## id: the server id of the storage server
# this paramter is valid only when use_storage_id set to true
# default value is ip
# since V4.03
id_type_in_filename = id

storage_ids.conf已经配置

# <id>  <group_name>  <ip_or_hostname[:port]>
#
# id is a natural number (1, 2, 3 etc.),
# 6 bits of the id length is enough, such as 100001
#
# storage ip or hostname can be dual IPs seperated by comma,
# one is an inner (intranet) IP and another is an outer (extranet) IP,
# or two different types of inner (intranet) IPs
# for example: 192.168.2.100,122.244.141.46
# another eg.: 192.168.1.10,172.17.4.21
#
# the port is optional. if you run more than one storaged instances
# in a server, you must specified the port to distinguish different instances.

100001 group1 172.17.0.1,10.88.7.10

/usr/bin/fdfs_monitor /etc/fdfs/storage.conf结果如下

server_count=1, server_index=0

tracker server is 10.88.7.10:22122

group count: 1

Group 1:
group name = group1
disk total space = 10,230 MB
disk free space = 10,107 MB
trunk free space = 0 MB
storage server count = 1
active server count = 1
storage server port = 23000
storage HTTP port = 8888
store path count = 1
subdir count per path = 256
current write server index = 0
current trunk file id = 0

	Storage 1:
		id = 100001
		ip_addr = 172.17.0.1  ACTIVE
		http domain = 
		version = 6.06
		join time = 2021-02-04 18:30:01
		up time = 2021-02-23 18:57:32
		total storage = 10,230 MB
		free storage = 10,107 MB
		upload priority = 10
		store_path_count = 1
		subdir_count_per_path = 256
		storage_port = 23000

请教如何解决

LockiJiang avatar Feb 23 '21 11:02 LockiJiang

Johnson8888 avatar Mar 31 '21 02:03 Johnson8888

原因: storage server 在容器里面连接 tracker server 10.88.7.10:22122 时,通过 NAT 表转发到 tracker server ,数据包里面的源地址为 docker0 虚拟网卡的地址 172.17.0.1 ,导致了 tracker server 记录到 storage server 的地址是 docker0 虚拟网卡的地址 172.17.0.1

解决: 在宿主上添加 iptables 的 nat 转发规则,将从 storage server 发往 tracker server 的数据包的源地址改为宿主主机的地址。

shell> docker inspect --format='{{.NetworkSettings.IPAddress}}' STORAGE_SERVER_CONTAINER_ID_OR_CONTAINER_NAME
shell> docker inspect --format='{{.NetworkSettings.IPAddress}}' TRACKER_SERVER_CONTAINER_ID_OR_CONTAINER_NAME
shell> sudo iptables -t nat -A POSTROUTING -s STORAGE_SERVER_IP -d TRACKER_SERVER_IP -p tcp -m tcp --dport 22122 -j SNAT --to-source HOST_IP

rui8832 avatar Apr 20 '21 03:04 rui8832

原因: storage server 在容器里面连接 tracker server 10.88.7.10:22122 时,通过 NAT 表转发到 tracker server ,数据包里面的源地址为 docker0 虚拟网卡的地址 172.17.0.1 ,导致了 tracker server 记录到 storage server 的地址是 docker0 虚拟网卡的地址 172.17.0.1

解决: 在宿主上添加 iptables 的 nat 转发规则,将从 storage server 发往 tracker server 的数据包的源地址改为宿主主机的地址。

shell> docker inspect --format='{{.NetworkSettings.IPAddress}}' STORAGE_SERVER_CONTAINER_ID_OR_CONTAINER_NAME
shell> docker inspect --format='{{.NetworkSettings.IPAddress}}' TRACKER_SERVER_CONTAINER_ID_OR_CONTAINER_NAME
shell> sudo iptables -t nat -A POSTROUTING -s STORAGE_SERVER_IP -d TRACKER_SERVER_IP -p tcp -m tcp --dport 22122 -j SNAT --to-source HOST_IP

这个并不是根本的解决方法,单机使用docker还具有可操作性,若是做了容器编排呢?从简单的swarm到k8s,每次都手动去获取容器IP,修改iptables后重启? 即便是单机docker,每次启动容器的ip也是会有可能会变化的,每次都需要重新配置iptables也不是好的方案

LockiJiang avatar Apr 20 '21 04:04 LockiJiang

原因: storage server 在容器里面连接 tracker server 10.88.7.10:22122 时,通过 NAT 表转发到 tracker server ,数据包里面的源地址为 docker0 虚拟网卡的地址 172.17.0.1 ,导致了 tracker server 记录到 storage server 的地址是 docker0 虚拟网卡的地址 172.17.0.1 。 解决: 在宿主上添加 iptables 的 nat 转发规则,将从 storage server 发往 tracker server 的数据包的源地址改为宿主主机的地址。

shell> docker inspect --format='{{.NetworkSettings.IPAddress}}' STORAGE_SERVER_CONTAINER_ID_OR_CONTAINER_NAME
shell> docker inspect --format='{{.NetworkSettings.IPAddress}}' TRACKER_SERVER_CONTAINER_ID_OR_CONTAINER_NAME
shell> sudo iptables -t nat -A POSTROUTING -s STORAGE_SERVER_IP -d TRACKER_SERVER_IP -p tcp -m tcp --dport 22122 -j SNAT --to-source HOST_IP

这个并不是根本的解决方法,单机使用docker还具有可操作性,若是做了容器编排呢?从简单的swarm到k8s,每次都手动去获取容器IP,修改iptables后重启? 即便是单机docker,每次启动容器的ip也是会有可能会变化的,每次都需要重新配置iptables也不是好的方案

使用容器编排是没有这个问题的哟,此时你的应用和 FastDFS 在同一个 Oerlay 网络内,已经不再需要 storage server 的外部网络地址。 如果必须要跨网络使用 FastDFS ,我建议你考虑使用代理,可以参考获取storage外网ip的问题 #42

rui8832 avatar Apr 20 '21 05:04 rui8832

原因: storage server 在容器里面连接 tracker server 10.88.7.10:22122 时,通过 NAT 表转发到 tracker server ,数据包里面的源地址为 docker0 虚拟网卡的地址 172.17.0.1 ,导致了 tracker server 记录到 storage server 的地址是 docker0 虚拟网卡的地址 172.17.0.1 。 解决: 在宿主上添加 iptables 的 nat 转发规则,将从 storage server 发往 tracker server 的数据包的源地址改为宿主主机的地址。

shell> docker inspect --format='{{.NetworkSettings.IPAddress}}' STORAGE_SERVER_CONTAINER_ID_OR_CONTAINER_NAME
shell> docker inspect --format='{{.NetworkSettings.IPAddress}}' TRACKER_SERVER_CONTAINER_ID_OR_CONTAINER_NAME
shell> sudo iptables -t nat -A POSTROUTING -s STORAGE_SERVER_IP -d TRACKER_SERVER_IP -p tcp -m tcp --dport 22122 -j SNAT --to-source HOST_IP

这个并不是根本的解决方法,单机使用docker还具有可操作性,若是做了容器编排呢?从简单的swarm到k8s,每次都手动去获取容器IP,修改iptables后重启? 即便是单机docker,每次启动容器的ip也是会有可能会变化的,每次都需要重新配置iptables也不是好的方案

使用容器编排是没有这个问题的哟,此时你的应用和 FastDFS 在同一个 Oerlay 网络内,已经不再需要 storage server 的外部网络地址。 如果必须要跨网络使用 FastDFS ,我建议你考虑使用代理,可以参考获取storage外网ip的问题 #42

修改storage.conf无效

LockiJiang avatar Apr 20 '21 05:04 LockiJiang