首页 > 其他分享 >2023跟我一起学docker-swarm 教程:部署篇「下」

2023跟我一起学docker-swarm 教程:部署篇「下」

时间:2023-10-16 20:31:48浏览次数:46  
标签:-- 端口 53 swarm 2023 docker 节点 路由

2023跟我一起学docker-swarm 教程:部署篇「下」

2023跟我一起学docker-swarm 教程:部署篇「下」_devops

停止Swarm集群上的一个节点

目前我们所有的节点都 ACTIVE 的状态运行的,master可以将任务分配给任何节点,所以所有的节点都可以接收到任务。

很多时候我们需要维护应用的时候,您需要将节点设置为DRAIN可用性。DRAIN状态的节点Maser 阻止此类型的节点接收新任务。这也意味着停止在节点上运行的任务,并在具有ACTIVE可用性的节点上启动副本任务。

注意: 将节点设置为DRAIN不会从该节点中删除独立容器,例如使用docker rundocker-compose up或Docker Engine API创建的容器。节点的状态,包括DRAIN,只影响节点调度群服务工作负载的能力。

1 、我们在 master 节点的机器上查看集群中节点的可用性:

root@master:~# docker node ls                                                                                 
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION             
57mvxsdn9qg2tq6aiz17et7ot *   master     Ready     Active         Leader           24.0.5                     
lqv1e6oa2hle33ff4xgxfslz3     node1      Ready     Active                          24.0.5                     
wwb5rc9nypj1e98wwr5qw99ye     node2      Ready     Active                          24.0.5

查看任务分配的信息:

root@master:~# docker service ps redis                                                                       
ID             NAME          IMAGE                 NODE      DESIRED STATE   CURRENT STATE             ERROR     PORTS   
01wlu8r8z0jx   redis.1       redis:6.0.20-alpine   node2     Running         Running 16 minutes ago           
w630bshgl3ga    \_ redis.1   redis:6.0-alpine      node2     Shutdown        Shutdown 16 minutes ago         
mkm0o152ns3e   redis.2       redis:6.0.20-alpine   master    Running         Running 16 minutes ago           
sqmmetgn9mqy    \_ redis.2   redis:6.0-alpine      master    Shutdown        Shutdown 16 minutes ago         
ezwkml7u8gih   redis.3       redis:6.0.20-alpine   node1     Running         Running 16 minutes ago           
qgvbqgmcmu7i    \_ redis.3   redis:6.0-alpine      node1     Shutdown        Shutdown 17 minutes ago

2 、运行docker node update --availability drain <NODE-ID>以耗尽已分配任务的节点:

docker node update --availability drain node2 我们将 node2 节点停掉,并查看当前服务以及节点信息:

2023跟我一起学docker-swarm 教程:部署篇「下」_redis_02

从图中看到node2 的节点状态已经是 Drain 并且分配在 node2 上的服务状态已经是 Shutdown

管理器通过在具有 drain 状态的节点上结束任务,并在Active 状态的节点上创建新的任务来保持所需要的状态。

3 、启用节点的可用性

docker node update --availability active node2

2023跟我一起学docker-swarm 教程:部署篇「下」_docker_03

如图所示, 节点 Node2 的状态 已经更新为 Active

当节点设置回Active可用性时,它可以接收新任务:

  • 在服务更新期间进行扩展
  • 在滚动更新期间
  • 将另一个节点设置为Drain可用性时
  • 当任务在另一个活动节点上失败时

使用swarm模式路由网格

Docker Engine集群模式可以轻松发布服务端口,以使其可用于集群之外的资源。所有节点都参与入口路由网格。路由网格使群中的每个节点能够接受群中运行的任何服务在已发布端口上的连接,即使节点上没有运行的任务。路由网格将所有传入的请求路由到可用节点上的已发布端口到活动容器。

要在集群中使用网络,在启用群模式之前,我们需要在群节点之间打开以下端口:

  • Port 7946 TCP/UDP 用于容器网络发现。
  • Port 4789 UDP 可为容器入口网络配置。

我们还必须在集群的节点和任何需要访问端口的外部资源(如外部负载平衡器)之间打开已发布的端口。

发布服务端口

创建服务时,使用--publish标识指定要对外发布端口。target用于指定容器内的端口,而published用于指定在路由网格上绑定的端口。如果没有配置published`端口,则每个服务任务都会绑定一个随机的高编号端口。

docker service create --replicas 3 --name redis --publish published=63790,target=6379 --update-delay 5s redis:6.0.20-alpine
root@master:~# docker service create --replicas 3 --name redis --publish published=63790,target=6379 --update-delay 5s re
dis:6.0.20-alpine                                                                                             
vmmg8v0zr26os5johw7187mla                                                                                     
overall progress: 3 out of 3 tasks                                                                           
1/3: running   [==================================================>]                                         
2/3: running   [==================================================>]                                         
3/3: running   [==================================================>]                                                     
verify: Service converged
root@master:~# docker service ls                                                                             
ID             NAME      MODE         REPLICAS   IMAGE                 PORTS                                 
vmmg8v0zr26o   redis     replicated   3/3        redis:6.0.20-alpine   *:63790->6379/tcp

如图我们已经看到了端口为 *:63790->6379/tcp

<PUBLISHED-PORT>swarm提供服务的端口。如果省略它,将绑定一个随机的高编号端口。<CONTAINER-PORT>是容器侦听的端口。此参数是必需的。

例如,以下命令将nginx容器中的端口80发布到群中任何节点的端口8080:

docker service create \
  --name web \
  --publish published=8080,target=80 \
  --replicas 2 \
  nginx

当访问任何节点上的端口8080时,Docker会将请求路由到活动容器。在群节点本身上,端口8080实际上可能没有绑定,但路由网格知道如何路由流量并防止任何端口冲突的发生。

路由网格在已发布的端口上监听分配给节点的任何IP地址。对于外部可路由的IP地址,该端口可从主机外部获得。对于所有其他IP地址,只能从主机内部访问。

部署完成后我们在宿主机上面访问对应的地址和端口:

2023跟我一起学docker-swarm 教程:部署篇「下」_docker_04

如果所示,服务正常访问。并且我们访问部署了的服务节点都可以访问到 nginx 服务。

同样对于已经部署的 service,我们也可以重新给他发布端口:

docker service update \
  --publish-add published=<PUBLISHED-PORT>,target=<CONTAINER-PORT> \
  <SERVICE>

您可以使用docker service inspect来查看服务的已发布端口。例如:

docker service inspect --format="{{json .Endpoint.Spec.Ports}}" web
[{"Protocol":"tcp","TargetPort":80,"PublishedPort":8080}]

输出显示来自容器的<CONTAINER-PORT>(标记为TargetPort)和<PUBLISHED-PORT>(标记为PublishedPort),其中节点侦听对服务的请求。

使用上面的命令我们查看部署的 nginx web 服务:

root@master:~# docker service inspect --format="{{json .Endpoint.Spec.Ports}}" web                                       
[{"Protocol":"tcp","TargetPort":80,"PublishedPort":8080,"PublishMode":"ingress"}]

仅为TCP或仅UDP发布端口

默认情况下,当您发布端口时,它是一个TCP端口。您可以专门发布UDP端口,而不是或除了TCP端口。当您同时发布TCP和UDP端口时,如果您省略协议说明符,该端口将作为TCP端口发布。如果您使用较长的语法(推荐),请将protocol密钥设置为tcpudp

仅限TCP

长语法:

docker service create --name dns-cache \
  --publish published=53,target=53 \
  dns-cache

简短的语法:

docker service create --name dns-cache \
  -p 53:53 \
  dns-cache
TCP和UDP

长语法:

docker service create --name dns-cache \
  --publish published=53,target=53 \
  --publish published=53,target=53,protocol=udp \
  dns-cache

简短的语法:

docker service create --name dns-cache \
  -p 53:53 \
  -p 53:53/udp \
  dns-cache
仅限UDP

长语法:

docker service create --name dns-cache \
  --publish published=53,target=53,protocol=udp \
  dns-cache

简短的语法:

docker service create --name dns-cache \
  -p 53:53/udp \
  dns-cache

绕过路由网格

我们可以绕过路由网格,这样当访问给定节点上的绑定端口时,我们总是访问该节点上运行的服务实例。这被称为host模式。这种情况下需要注意:

  • 如果访问未运行服务任务的节点,则该服务不会监听该端口。有可能什么都没有,或者访问到了一个完全不同的应用程序。
  • 如果希望在每个节点上运行多个服务任务(例如,当您有5个节点但运行10个副本时),则无法指定静态目标端口。要么允许Docker分配一个随机的高编号端口(通过关闭published端口),要么通过使用全局服务而不是复制服务,或使用放置约束,确保服务仅在给定节点上运行。

要绕过路由,必须使用长--publish服务并将mode设置为host。如果省略mode或将其设置为ingress,则使用路由网格。以下命令使用host模式并绕过路由网格创建全局服务。

docker service create --name dns-cache \
  --publish published=53,target=53,protocol=udp,mode=host \
  --mode global \
  dns-cache

配置外部负载均衡器

我们可以为集群服务配置外部负载平衡器,要么与路由网格结合使用,要么根本不使用路由网格。

使用路由网格

我们可以配置外部负载均衡器将请求路由到集群服务。可以配置HAProxy来均衡对发布到端口8080nginx服务的请求。

2023跟我一起学docker-swarm 教程:部署篇「下」_devops_05

上图的 来源于网络,仅供参考

在这种情况下,端口8080必须在负载平衡器和集群中的节点之间打开。集群节点可以在代理服务器可以访问的专用网络上,但不能公开访问。

可以配置负载平衡器,以均衡集群中每个节点之间的请求,即使节点上没有安排任务。例如,我们可以在/etc/haproxy/haproxy.cfg中拥有以下HAProxy配置:

global
        log /dev/log    local0
        log /dev/log    local1 notice
...snip...

# Configure HAProxy to listen on port 80
frontend http_front
   bind *:80
   stats uri /haproxy?stats
   default_backend http_back

# Configure HAProxy to route requests to swarm nodes on port 8080
backend http_back
   balance roundrobin
   server master 172.16.95.137:8080 check
   server node2 172.16.95.138:8080 check
   server node3 172.16.95.139:8080 check

当访问端口80上的HAProxy负载均衡器时,它会将请求转发到群中的节点。群路由网格将请求路由到活动任务。集群调度器将任务发送到不同的节点,则无需重新配置负载均衡器。

不使用路由网格

要使用没有路由网格的外部负载均衡器,请将--endpoint-mode设置为dnsrr,而不是vip的默认值。在这种情况下,没有一个虚拟IP。相反,Docker为服务设置DNS条目,使服务名称的DNS查询返回IP地址列表,客户端直接连接到其中一个地址。

标签:--,端口,53,swarm,2023,docker,节点,路由
From: https://blog.51cto.com/demo007x/7893482

相关文章

  • docker 搭建nextcloud。实现个人网盘nextcloud
    想要docker启用高可用的Nextcloud网站,我们需要安装一下docker-compose安装docker-composewgethttps://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64-O/usr/local/bin/docker-compose下载完成,添加运行权限chmod+x/usr/local/bin/dock......
  • 2023/10/16 学习笔记
    网络层协议与解析网络层的功能: 定义了基于IP协议的逻辑地址  连接不同的媒介类型 选择数据通过网络的最佳路径IP数据包格式: 注解:版本(4) 指IP协议版本。并且通过双方使用的版本必须一致,目前我们使用的是ipv4,表示为0100十进制是4首部长度(4) IP数据包的包头长......
  • 20231016打卡
    上午的课程是铁道技术认知。在这门课上,我们学习了铁道的基础知识,包括受电弓、道岔变道器等。通过老师的讲解和课堂讨论,我们对铁道的运行和设备有了更深入的了解。在课程中,我们还通过虚拟仿真系统在计算机上学习了如何具体进行变轨操作和模拟动车组的运行。此外,通过沙盘的实际操作,......
  • docker
    Docker的安装以ubuntu安装为例子1、如果安装过需要先卸载yumremovedocker\docker-client\docker-client-latest\docker-common\docker-latest\docker-latest-logrotate\docker-logrotate\......
  • linux学习记录(租云服务器及配docker环境) 10.16
    租到的服务器1、毛坯(1)框架(2)thrift2、服务(配好环境的服务器)(1)socket:比如数据库,获得一个IP地址+端口号访问(2)http:重中之重:把毛坯搭好,服务用现成的docker可迁移,且y总会给我们环境镜像,省掉配环境的过程 未来开发的主要工作环境在docker里面docker可配置ssh登录 ......
  • 从嘉手札<2023-10-16>
    一、商君书1)更法商鞅和甘龙、杜挚同秦孝公商量变法。后两者认为变法会动移已有的社会结构,“圣人不易民而教,知者不变法而治”“法古无过,循礼无邪”但商鞅(公孙鞅)认为,三代不同礼而亡,五霸不同法而霸,知者作法,愚者制焉。“夫常人安于故习,学者溺于所闻”“反古者未必可非,循礼者未足......
  • docker容器部署jenkins
    1.下载镜像dockerpulljenkins/jenkins2.创建用户和数据目录并授权useradd-u1000jenkins-M-s/sbin/nologinmkdir/data/jenkins/-pchown-Rjenkins:jenkins/data/jenkins/3.运行镜像dockerrun\--namejenkins\-p8080:8080-p50000:50000\--privilege......
  • 云原生周刊:CNCF 宣布 Cilium 毕业 | 2023.10.16
    开源项目推荐ReloaderReloader是一个Kubernetes控制器,用于监控ConfigMap和Secrets中的变化,并对Pod及其相关部署、StatefulSet、DaemonSet和DeploymentConfig进行滚动升级!SpegelSpegel在瑞典语中意为镜像,是一种无状态集群本地OCI注册镜像。Spegel使Kubernete......
  • 2023年第四季数据治理认证DAMA-CDGA/CDGP认证开始备考
    DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义,帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力,促进开展工作实践应用及实际问题解决,形成企业所需的新数字经济下的核心职业竞争能力。DAMA是数据管理方面的认证,帮助数据从业者提升......
  • 2023年10月NPDP产品经理国际认证开始备考啦
    产品经理国际资格认证NPDP是新产品开发方面的认证,集理论、方法与实践为一体的全方位的知识体系,为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会(PDMA)成立于1979年,是全球范围内产品开发与管理专业人士最杰出的倡导者,协助个人、企业或......