swarm集群中部署nginx获取客户端真实ip

avatar 2023年4月28日18:28:42 评论 524 次浏览

最近在做swarm环境,针对swarm的优点这里就不多说了,因为我们要部署到生产环境,资源比较少而且要求压力不是特别多,最主要的是避免浪费,选择了swarm,但是部署后,准备服务上线呢,发现在swarm中部署的nginx服务,在用户请求的时候日志中都是swarm的负载均衡地址,原本在容器中也做了proxy_set_header的配置,如果在容器中请求,是正常的,但是swarm环境就无法获取。难道就因为最后一步抛弃swarm吗?不能,最少服务是可用的,考虑了一下原本想把nginx放到集群外边,这样是解决了nginx的问题,但是发布的时候和原来就有区别了。后来看到说,在swarm中选择host模式,和本地使用nginx是一个道理。也就是说,host模式不走swarm的负载均衡了,不过还是部署在swarm集群中的。

 docker service  create --name wulaoer-clound-ui --publish 80:80 --publish 443:443  --mount type=volume,source=wulaoer-nginx,destination=/var/log/nginx --secret app.key --secret app.pem --secret key.key --secret key.pem --config src=wulaoer-clound-ui.conf,target=/etc/nginx/conf.d/wulaoer-clound-ui.conf --network xn_net --limit-cpu 0.5 --limit-memory 1G  --with-registry-auth registry-vpc.cn-beijing.aliyuncs.com/rdgtestlinshi/wulaoer-clound-ui:1.1.6

这是我原来的部署方式,利用集群的负载均衡中请求到nginx的地址是docker的。

 [root@ali-xn-g-prod-swarm-master-bj-01 ~]# docker info
 Client:
  Context:    default
  Debug Mode: false
  Plugins:
   app: Docker App (Docker Inc., v0.9.1-beta3)
   buildx: Docker Buildx (Docker Inc., v0.9.1-docker)
   scan: Docker Scan (Docker Inc., v0.17.0)
 
 Server:
  Containers: 28
   Running: 9
   Paused: 0
   Stopped: 19
  Images: 41
  Server Version: 20.10.18
  Storage Driver: overlay2
   Backing Filesystem: extfs
   Supports d_type: true
   Native Overlay Diff: true
   userxattr: false
  Logging Driver: json-file
  Cgroup Driver: cgroupfs
  Cgroup Version: 1
  Plugins:
   Volume: local
   Network: bridge host ipvlan macvlan null overlay
   Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
  Swarm: active
   NodeID: 3ubixvjicpu89v5x4i7avqa2g
   Is Manager: true
   ClusterID: 05dowatpbajdro48i1o5ecb33
   Managers: 1
   Nodes: 2
   Default Address Pool: 10.0.0.0/8 #这个网段,这个是docker默认的网段
   SubnetSize: 24
   Data Path Port: 4789
   Orchestration:

使用host网段,直接走物理网络,不走swarm的负载均衡,也就是说host模式,同一个服务在一个节点上不能有多个副本,要不就会有端口冲突,并且如果我在服务上层做负载均衡,就会出现有时候访问正常有时候访问异常的情况。

 docker service  create --name wulaoer-clound-ui --publish "mode=host,target=80,published=80" --publish "mode=host,target=443,published=443"  --mount type=volume,source=wulaoer-nginx,destination=/var/log/nginx --secret app.key --secret app.pem --secret key.key --secret key.pem --config src=wulaoer-clound-ui.conf,target=/etc/nginx/conf.d/wulaoer-clound-ui.conf --network xn_net --limit-cpu 0.5 --limit-memory 1G  --with-registry-auth registry-vpc.cn-beijing.aliyuncs.com/rdgtestlinshi/wulaoer-clound-ui:1.1.6

如果副本数大于节点数就会提示:

 2/3: no suitable node (host-mode port already in use on 2 nodes)

为了避免,后期增加节点,负载均衡返回不了数据,所以我需要在每个节点自动起一个nginx,这样保证所有的负载均衡正常。这就用到了关键词--mode global,创建服务时会在每个节点上启动一个副本,这样任何一个节点异常就不会出现用户请求不可用了。

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: