Docker Swarm 跨云集群实现流量就地转发(Nginx 全局网关)
本文基于全局 Nginx 网关,在保持配置中心化的同时,实现请求的就地转发,构建出兼具弹性扩展与高效传输特性的简易云原生网络架构。
跨云 Mesh 组网
多云、多地域环境下,网络情况复杂且不可控,本文推荐通过 Tailscale 来创建一个虚拟的网络平面。
参见文章:https://www.rehiy.com/post/592/
创建 Swarm 集群
基于上面创建的 Mesh 网络,在虚拟网络平面上创建 Swarm 集群,避免因NAT、防火墙等因素干扰集群通信。
参见文章:https://www.rehiy.com/post/285/
使用 Nginx 原地转发请求到服务
下列代码保存到 /srv/nginx-gw/etc/0-example.conf
如果你有多个站点,可以参照 server
段写入多个站点或多个配置文件,创建服务时这些配置将被自动合并到集群 config
存储。
# 此代码必须且只能出现一次
resolver 127.0.0.11 valid=30s;
# 站点转发配置,可根据需要重写
server {
listen 80;
listen 443 ssl;
http2 on;
# 注意修改为业务域名
server_name www.example.org;
# 默认使用内置自签证书,套 CDN 可忽略配置
#ssl_certificate certs/example.org.cer;
#ssl_certificate_key certs/example.org.key;
location / {
# 替换 example 为后端容器名称,确保和 Nginx 在同一个 Overlay 网络
proxy_pass http://example;
proxy_http_version 1.1;
proxy_request_buffering off;
proxy_buffering off;
}
}
下列代码保存到 /srv/nginx-gw/docker
脚本会把配置文件转为 swarm config
存储,以便 nginx-gw
跨主机访问,实现配置中心化,减少维护成本。
注:可以参考此方法配置自定义的 SSL 证书等。
#!/bin/sh
#
# @Author Rehiy <[email protected]>
# @Website http://www.rehiy.com
#
APP_NAME=nginx-gw
APP_FROM=rehiy/webox:nginx
APP_PATH=$(cd `dirname $0`; pwd)
#####################################################################################
if [ "$1" = "remove" ] || [ "$1" = "update" ]; then
docker service rm $APP_NAME
docker config rm nginx_conf
fi
if [ "$1" = "install" ] || [ "$1" = "update" ]; then
cat $APP_PATH/etc/* | docker config create nginx_conf -; sleep 5
docker service create --name $APP_NAME \
--mode global \
--network ovnet \ # 此处请填写自定义的 Overlay 网络
--publish mode=host,target=80,published=80 \
--publish mode=host,target=443,published=443 \
--config source=nginx_conf,target=/var/config/nginx/host.d/site.conf \
--env TZ=Asia/Shanghai \
$APP_FROM
fi
运行 /srv/nginx-gw/docker install
服务启动后,将在所有节点上运行 nginx 服务,无论从哪个节点接入流量,都会就地转发给后端服务。
这样可以避免单副本服务导致的多次转发,同时也只需要维护一份 nginx 配置即可。
总结
- 配置集中管理:单点配置自动同步至所有节点
- 低损流量转发:规避传统反向代理的多次跳跃
- 弹性扩展能力:低成本随集群节点自动扩缩容