Last updated
Last updated
克隆虚拟机,并配置好静态IP
配置两台虚拟机的代理
以下详述。
为了演示集群,在上一篇记录最后的状态上,克隆一台虚拟机。
并修改其静态IP为:192.168.237.129
。详细修改见上一篇安装CentOS。
修改/etc/sysconfig/network-scripts/ifcfg-ens33
后需要重启网络服务
由于有一些翻墙下载,需要配置代理服务器下载。通过命令行配置,从简。
必要的说明:宿主机192.168.237.1
已有的代理端口2333
配置如下。
据后来测试,curl
代理下载仍然慢,还影响yum
源安装时的选择,需要取消代理。关于需要翻墙的下载,还行下载后拷贝过来。
参考官网
按上面的步骤,克隆出第三台虚拟机,并配置好静态IP:192.168.237.130
修改主机名 /etc/hostname
说明:打开主机之间的协议和端口。必须提供以下端口。在某些系统上,默认情况下这些端口是打开的。
用于集群管理通信的 TCP端口2377
TCP 和 UDP端口7946 用于节点之间的通信
UDP端口4789 用于覆盖网络流量
如果您计划使用encryption(--opt encrypted
)创建覆盖网络,则还需要确保允许ip protocol 50(ESP)流量。
可以用命令telnet 192.168.237.128 2377
测试
对于CentOS要开启防火墙
打开端口(貌似这个才最常用)
查看所有打开的端口:
# firewall-cmd --zone=dmz --list-ports
加入一个端口到区域:
# firewall-cmd --zone=dmz --add-port=8080/tcp
永久生效再加上 --permanent 然后reload防火墙
更新防火墙规则:
# firewall-cmd --reload
打开所有测试需要的端口
经测试还是无效。
关闭防火墙
经测试有效,果然是防火墙的问题,但为啥防火墙规则配置无效,不明。
准备结束。
在manager1
上运行如下命令,新建一个swarm
--advertise-addr
标志配置管理器节点以将其地址发布为192.168.99.100
。群中的其他节点必须能够访问IP地址处的管理器。
输出内容包括将新节点连接到群集的命令。节点将作为管理者或工作者加入,具体取决于--token
标志的值。
然后运行docker info
可以查看Swarm状态
运行docker node ls
可以查看节点信息
在*
旁边的节点ID表明当前连接此节点上。
在worker1和worker2上加入
现在在manager1
上查看信息
在工作节点上没有查看节点信息的权限
在manager1节点上创建服务docker service create --replicas 1 --name helloworld alpine ping docker.com
其中,
docker service create
命令创建服务。
--name
标志命名该服务helloworld
--replicas
标志指定1个正在运行的实例的所需状态。
参数alpine ping docker.com
将服务定义为执行命令的Alpine Linux容器ping docker.com
运行docker service ls
以查看正在运行的服务列表:
运行docker service inspect --pretty <SERVICE-ID>
以易于阅读的格式显示有关服务的详细信息。
要查看有关helloworld
服务的详细信息:
要以json格式返回服务详细信息,请运行不带--pretty
标志的相同命令。
运行docker service ps <SERVICE-ID>
以查看正在运行服务的节点:
在这种情况下,服务的一个实例helloworld
正在worker1
节点上运行。也可能会在管理器节点上运行。
默认情况下,swarm中的管理器节点可以像工作节点一样执行任务。
在运行任务的节点上运行docker ps
,以查看有关该任务的容器的详细信息。
提示:如果helloworld
正在管理器节点以外的节点上运行,则必须ssh到该节点。
运行以下命令以更改在swarm中运行的服务的所需状态:docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS>
运行docker service ps <SERVICE-ID>
以查看更新的任务列表:
您可以看到swarm创建了4个新任务,可以扩展到总共5个运行的Alpine Linux实例。任务分布在群的三个节点之间。
运行docker service rm helloworld
以删除该helloworld
服务。
运行docker service inspect <SERVICE-ID>
以验证群集管理器是否已删除该服务。CLI返回未找到服务的消息:
即使服务不再存在,任务容器也需要几秒钟来清理。您可以在节点上使用docker ps
以验证何时删除了任务。
将Redis 3.0.6部署到swarm并使用10秒更新延迟配置swarm:
可以在服务部署时配置滚动更新策略。
--update-delay
标志配置服务任务或任务集的更新之间的时间延迟。可以将时间T
描述为秒数s
,分钟数m
或小时数的组合h
。所以10m30s
表示延迟10分30秒。
默认情况下,调度程序一次更新1个任务。您可以传递该--update-parallelism
标志以配置调度程序同时更新的最大服务任务数。
默认情况下,当对单个任务的更新返回状态时RUNNING
,调度程序会安排另一个任务进行更新,直到所有任务都更新为止。如果在更新任务期间的任何时间返回FAILED
,则调度程序会暂停更新。可以使用--update-failure-action
标志或来控制行为。
检查redis
服务:
现在可以更新容器镜像redis
。swarm管理器根据UpdateConfig
策略将更新应用于节点:
调度程序默认情况下应用滚动更新,如下所示:
停止第一个任务。
安排已停止任务的更新。
启动容器以获取更新的任务。
如果对任务的更新返回RUNNING
,请等待指定的延迟时间,然后开始下一个任务。
如果在更新期间的任何时间返回任务FAILED
,请暂停更新。
运行docker service inspect --pretty redis
以查看所需状态的新图像:
重新启动暂停的更新运行docker service update <SERVICE-ID>
。例如:
为避免重复某些更新失败,您可能需要通过传递标志来重新配置服务docker service update
。
运行docker service ps <SERVICE-ID>
以查看滚动更新:
在Swarm更新所有任务之前,您可以看到一些正在运行redis:3.0.6
而另一些正在运行redis:3.0.7
。
在本教程的早期步骤中,所有节点都在运行时具有ACTIVE
可用性。群集管理器可以将任务分配给任何ACTIVE
节点,因此到目前为止,所有节点都可用于接收任务。
有时,例如计划的维护时间,您需要将节点设置为DRAIN
可用性。DRAIN
可用性阻止节点从群集管理器接收新任务。它还意味着管理器停止在节点上运行的任务,并在具有ACTIVE
可用性的节点上启动副本任务。
验证所有节点是否都可用。
运行docker node update --availability drain <NODE-ID>
以排空已分配任务的节点:
检查节点以检查其可用性:
Docker Engine群集模式可以轻松发布服务端口,使其可用于群组外的资源。所有节点都参与入口路由网格。路由网格允许群集中的每个节点接受已发布端口上的连接,以便在群集中运行的任何服务,即使节点上没有任何任务正在运行。路由网格将所有传入请求路由到可用节点上的已发布端口到活动容器。
要在群集中使用入口网络,您需要在启用群集模式之前在群集节点之间打开以下端口:
端口7946
TCP / UDP用于容器网络发现。
4789
容器入口网络的端口UDP。
您还必须打开群集节点与需要访问端口的任何外部资源(如外部负载平衡器)之间的已发布端口。
发布服务端口
使用该--publish
标志在创建服务时发布端口。target
用于指定容器内的端口,published
用于指定要在路由网格上绑定的端口。如果不离开published
端口,则会为每个服务任务绑定一个随机的高编号端口。您需要检查任务以确定端口。
注意:此语法的旧形式是冒号分隔的字符串,其中发布的端口是第一个,目标端口是第二个,例如-p 8080:80
。新语法是首选,因为它更易于阅读并允许更大的灵活性。
这<PUBLISHED-PORT>
是群集提供服务的端口。如果省略它,则绑定一个随机的高编号端口。它<CONTAINER-PORT>
是容器侦听的端口。此参数是必需的。
例如,以下命令将nginx容器中的端口80发布到群集中任何节点的端口8080:
当您在任何节点上访问端口8080时,Docker会将您的请求路由到活动容器。在群集节点本身上,端口8080实际上可能不受约束,但路由网格知道如何路由流量并防止发生任何端口冲突。
路由网格在已发布的端口上侦听分配给该节点的任何IP地址。对于可外部路由的IP地址,该端口可从主机外部获得。对于所有其他IP地址,只能从主机内访问。
可以使用以下命令发布现有服务的端口:
您可以使用docker service inspect
查看服务的已发布端口。例如:
输出显示<CONTAINER-PORT>
(从容器标记为TargetPort
)和<PUBLISHED-PORT>
(标记PublishedPort
),其中节点监听的服务请求。
仅为TCP或仅UDP发布端口
默认情况下,发布端口时,它是TCP端口。除了TCP端口之外,您还可以专门发布UDP端口。发布TCP和UDP端口时,如果省略协议说明符,则端口将作为TCP端口发布。如果使用较长的语法(建议用于Docker 1.13及更高版本),请将protocol
密钥设置为tcp
或udp
。
仅限TCP
长语法:
短语法:
TCP和UDP
长语法:
短语法:
仅限UDP
长语法:
短语法:
绕过路由网格
您可以绕过路由网格,以便在访问给定节点上的绑定端口时,始终访问在该节点上运行的服务实例。这被称为host
模式。有几点需要牢记。
如果访问未运行服务任务的节点,则该服务不会侦听该端口。没有任何东西可以监听,或者完全不同的应用程序正在收听。
如果您希望在每个节点上运行多个服务任务(例如,当您有5个节点但运行10个副本时),则无法指定静态目标端口。允许Docker分配一个随机的高编号端口(通过不离开published
),或者确保只有一个服务实例在给定节点上运行,使用全局服务而不是复制服务,或者使用放置约束。
要绕过路由网格,必须使用长--publish
服务并设置mode
为host
。如果省略该mode
键或将其设置为ingress
,则使用路由网格。以下命令使用host
模式创建全局服务并绕过路由网格。
配置外部负载均衡器
您可以为群组服务配置外部负载平衡器,可以与路由网格结合使用,也可以根本不使用路由网格。
使用路由网格
在这种情况下,端口8080必须在负载平衡器和群中的节点之间打开。群集节点可以驻留在代理服务器可访问的专用网络上,但不能公开访问。
您可以配置负载平衡器以平衡群中每个节点之间的请求,即使节点上没有安排任务也是如此。例如,您可以在以下位置进行以下HAProxy配置/etc/haproxy/haproxy.cfg
:
当您在端口80上访问HAProxy负载平衡器时,它会将请求转发给群集中的节点。swarm路由网格将请求路由到活动任务。如果由于任何原因,swarm调度程序将任务分派给不同的节点,则无需重新配置负载均衡器。
没有路由网格
默认配置将为您创建用户名和密码组合:
如您在控制台中看到的那样运行命令,不要复制/粘贴login命令。运行faas-cli login
密码后,将存储为哈希值~/.openfaas/config.yaml
。
在几秒钟内(如果在不良的WiFi连接上,则为几分钟),API网关和相关的OpenFaaS映像将被拉入您的本地Docker库,您将能够访问以下UI:
http://127.0.0.1:8080
在(二)中操作后,我第一次未禁用防火墙时,会出现如下错误unsupported Compose file version: 3.3
如果还没有从redis
运行该服务,请立即启动它:
您还可以给定服务。
您可以配置外部负载平衡器以将请求路由到群组服务。例如,您可以配置以平衡对发布到端口8080的nginx服务的请求。
您可以配置任何类型的负载均衡器以将请求路由到群集节点。要了解有关HAProxy的更多信息,请参阅。
要使用不带路由网格的外部负载平衡器,请设置--endpoint-mode
为dnsrr
而不是默认值vip
。在这种情况下,没有一个虚拟IP。相反,Docker为服务设置DNS条目,以便服务名称的DNS查询返回IP地址列表,客户端直接连接到其中一个。您有责任向负载均衡器提供IP地址和端口列表。请参阅。
前面git clone
包括一组示例函数stack.yml
,要部署它们,并运行:
manager1
worker1
worker2
192.168.237.128
192.168.237.129
192.168.237.130