IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Docker Swarm搭建Overlay网络,实现跨主机通信的排坑记录 -> 正文阅读

[系统运维]Docker Swarm搭建Overlay网络,实现跨主机通信的排坑记录

前言

这只是一个排坑记录,注意,我非常不建议你继续阅读下去,非局域网搭建overlay完全是吃力不讨好的行为,是个于我而言难以完成的目标

非局域网间使用swarm配置overlay进行容器通信的坑实在太多了,排到最后也没有排干净,放弃了,如果对排坑过程感兴趣,或者你也想实践一下在非局域网间自己搭建一个“局域网”(bushi),请继续阅读吧

Step1. 创建overlay虚拟网络

本步骤将Server1和Server2置于同一虚拟网络下,这样才可以进行集群的搭建,下面这篇博客对于swarm的使用技巧总结得十分到位:

Docker搭建Swarm跨主机overlay网络

但需要更正一点,Server2在指定为worker节点时,通过docker network ls是无法看到overlay网络的

这是因为docker的特性所决定的,worker节点没有启动服务的权限,只能通过manager节点指定,因此worker节点也没有直接共享manager的overlay网络的必要,只有在manager在worker节点启动一个服务,并指定服务运行的网络时,worker节点才可以获得对应网络的信息。例如,进行下面的实验

  • 在Server1通过docker stack deploy启动一组服务,其中db服务运行在manager网络,db2服务运行在worker网络
[root@homeforzhu ~]# docker stack deploy -c stack.yml [service_name]

# stack.yml
# Use root/example as user/password credentials
version: '3.1'

services:
  db:
    image: mysql:5.7.25
    # NOTE: use of "mysql_native_password" is not recommended: https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password
    # (this is just an example, not intended to be a production configuration)
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    ports:
      - "3307:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
    deploy:
      replicas: 1
      placement:
        constraints:
          - node.hostname == [Server1_hostname]
  
  db2:
    image: mysql:5.7.25
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
    deploy:
      replicas: 1
      placement:
        constraints:
          - node.hostname == [Server2_hostname]

启动成功,在Server2使用docker network ls命令,可以看到[service_name]_default网络的出现:

[root@homeforzhu ~]# docker network ls
kjkalrqh27tq   hotel_default     overlay   swarm

由于实质上上述命令是在两台服务器上创造容器罢了,你也可以通过任何容器的相关操作来验证你的想法,例如在两台服务器上分别使用docker ps,你就会发现db1和db2分别运行在二者上

Step1. 搭建nacos集群,并利用nginx实现反向代理

如何标志化节点

首先,为了便于后续指定在特定的节点上运行容器,我们可以选择以下方案:

  • 为每个节点打上对应的标签:
[root@homeforzhu ~]# docker node update --label-add [key]=[words] [nodeId]

## 对应调度规则:
constraints:
	- node.labels.[key] == [words]
  • 使用节点的hostname & ip & 节点的等级(worker or manager)
## 对应调度规则:
constraints:
	- node.hostname == [server_hostname]

服务与容器的区别

需要注意的是,通过docker stack deploy启动的容器,其名称并非和服务名称是一致的,例如我启动的hotel_db服务下的mysql容器,其名称就是很长一串:

hotel_db.1.wyyfatv70iaguq5v2695bfntt

Swarm默认端口与UDP监听端口冲突导致容器无法通过服务名ping通

此外,由于Swarm默认运行端口是4789,该端口被大多数的云服务器厂商作为UDP的默认端口,不开放给用户,如阿里云官方文档所述:

UDP监听的250、4789和4790三个端口为系统保留端口,暂时不对外开放

因此,Swarm在这个端口上运行时,欲从该端口接受的包将被阻断(发送不会受影响,因此直接使用stack deploy建立服务时,即使是跨主机也仍然可以生效,也符合UDP的特性),从而导致跨主机的服务名直连失败,因为部署在Server1上的Swarm无法接收Server2的消息,从而阻塞(无法通过服务名ping通)

为了解决该问题,在建立Swarm的时候,应额外指定环境变量如下:

[root@homeforzhu ~]# docker swarm init --data-path-port 5789 --advertise-addr [server1_IP]
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-10-08 21:17:28  更:2022-10-08 21:17:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:47:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码