fastdfs
fastdfs copied to clipboard
docker部署启用了双IP还是获取不到storage的外部网络地址
使用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
请教如何解决
同
原因: 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
原因: 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也不是好的方案
原因: 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 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无效