背景
最近在研究stackato的harbor端口服务器,于是将其部署到cloudfoundry中进行研究。
目标
进过测试,harbor在CF中对tcp的支持正常,但是CF的dea和warden对udp不支持,所以需要改造dea和warden。
dea和warden的通讯流程
先说说dea和warden的通讯流程吧,下面借用论坛中另外一个博客的图片:
warden协议改造
这个好理解,dea收到harbor的消息后,必须知道需要映射tcp还是udp的端口。
所修改的协议为:Warden::Protocol::NetInRequest
dea端warden接口改造
dea与warden交互的接口在“dea_next\lib\container”目录下,所需要修改的主要是NetInRequest协议对应的接口。
具体可以看代码
warden内部net.sh脚本改造
其中要修改的脚步是:net.sh
主要是一下一个“in”和“out”内容:
"in")
if [ -z "${HOST_PORT:-}" ]; then
echo "Please specify HOST_PORT..." 1>&2
exit 1
fi
if [ -z "${CONTAINER_PORT:-}" ]; then
echo "Please specify CONTAINER_PORT..." 1>&2
exit 1
fi
iptables -t nat -A ${nat_instance_chain} \
--protocol tcp \
--destination "${external_ip}" \
--destination-port "${HOST_PORT}" \
--jump DNAT \
--to-destination "${network_container_ip}:${CONTAINER_PORT}"
;;
"out")
if [ -z "${NETWORK:-}" ] && [ -z "${PORT:-}" ]; then
echo "Please specify NETWORK and/or PORT..." 1>&2
exit 1
fi
opts=""
if [ -n "${NETWORK:-}" ]; then
opts="${opts} --destination ${NETWORK}"
fi
# Restrict protocol to tcp when port is specified
if [ -n "${PORT:-}" ]; then
opts="${opts} --protocol tcp"
opts="${opts} --destination-port ${PORT}"
fi
iptables -I ${filter_instance_chain} 1 ${opts} --jump RETURN
;;
其实内容可以不变,再将tcp改为udp,再加2个“udp_in” “udp_out”分支应该就可以了。
warden内部接口修改
当然,也要修改warden内部调用net.sh的接口,我初步看了看,应该是修改src\warden\warden\lib\warden\container\features目录下的net.rb文件。
具体修改,可以看看代码。
harbor->dea>warden的udp测试
环境建立
当然,首先创建harbor服务实例,部署APP应用。
查看warden内部应用运行情况
看见udp端口已经建立。
查看warden的iptables列表
通过iptables命令,查看端口信息:
iptables -t nat -nL
会发现4000端口是tcp类型,图我就不显示了。
所以用iptables删除该条规则,重新建立udp规则映射,如下图
harbor后端连接的端口是10.10.23.64:37654。所以harbor就可以通过访问10.10.23.64:37654映射端口,就可以访问warden内部的10.254.2.14:4000应用端口。