龙空技术网

Docker swarm 部署和使用

guoguodelu 412

前言:

眼前看官们对“nginxluawindows”可能比较重视,你们都想要分析一些“nginxluawindows”的相关资讯。那么小编同时在网摘上网罗了一些有关“nginxluawindows””的相关内容,希望兄弟们能喜欢,兄弟们一起来学习一下吧!

1 介绍

Docker Swarm集群是由多个运行swarm模式的Docker主机组成,关键的是 Docker 默认集成了swarm mode。swarm 集群中有 manager(管理成员关系和选举)、worker(运行swarm service)。

1.1 Node节点

manager

Manager 节点处理集群管理任务:

维护集群状态调度服务服务群模式 HTTP API 端点

使用 Raft 实现,管理器维护整个 swarm 和在其上运行的所有服务的一致内部状态。出于测试目的,可以使用单个管理器运行 swarm。如果单管理器集群中的管理器发生故障,您的服务将继续运行,但您需要创建一个新集群才能恢复。

为了利用 swarm 模式的容错特性,Docker 建议您根据组织的高可用性要求实现奇数个节点。当您有多个管理器时,您可以从管理器节点的故障中恢复而无需停机。

一个三管理器群最多可以容忍一名管理器的损失。一个五管理器群最多可以同时丢失两个管理器节点。一个 N 个管理器集群最多可以容忍 (N-1)/2 个管理器的丢失。Docker 建议一个 swarm 最多使用七个管理器节点。

重要提示:添加更多管理器并不意味着增加可扩展性或提高性能。一般来说,情况正好相反

worker

工作节点也是 Docker 引擎的实例,其唯一目的是执行容器。 Worker 节点不参与 Raft 分布式状态,不做调度决策,也不服务于 swarm 模式的 HTTP API。

可以创建一个由一个管理器节点组成的集群,但如果没有至少一个管理器节点,您就不能拥有一个工作程序节点。默认情况下,所有manager也是worker。在单个管理节点集群中,可以运行 docker service create 等命令,调度程序将所有任务放在本地引擎上。

要防止调度程序将任务放置在多节点集群中的管理器节点上,请将管理器节点的可用性设置为 Drain。调度器优雅地停止 Drain 模式节点上的任务,并将任务调度到 Active 节点上。调度程序不会将新任务分配给具有 Drain 可用性的节点。

1.2 服务/任务/容器

Services

Services是要在管理节点或工作节点上执行的任务的定义。是 swarm 系统的中心结构,也是用户与 swarm 交互的主要根源。

Serivces有两种模式:

replicated services:群管理器根据所需状态中设置的规模在节点之间分配特定数量的副本任务。

global services:swarm 在集群中的每个可用节点上为该服务运行一个任务。

task

task携带一个 Docker 容器和在容器内运行的命令。是 swarm 的调度单元。 Manager 节点根据服务规模中设置的副本数将任务分配给工作节点。一旦任务被分配给一个节点,它就不能移动到另一个节点。只能在分配的节点上运行或失败。

container

容器是一个独立的进程。在 swarm 模式模型中,每个任务只调用一个容器。任务类似于调度程序放置容器的“槽”。一旦容器处于活动状态,调度程序就会识别出任务处于运行状态。如果容器未通过健康检查或终止,则任务终止。

例如,假设想在 HTTP 侦听器的三个实例之间进行负载平衡。下图显示了具有三个副本的 HTTP 侦听器服务。侦听器的三个实例中的每一个都是 swarm 中的一个任务

1.3 负载均衡

ingress routing mesh

swarm 管理器使用入口负载平衡将在外部提供给 swarm 的服务公开。 swarm manager 可以自动为服务分配一个 PublishedPort,或者可以为该服务配置一个 PublishedPort。可以指定任何未使用的端口。如果不指定端口,swarm manager 会为服务分配一个 30000-32767 范围内的端口。

所有节点都参与一个入口路由网络。

Bypass the routing mesh

绕过路由网格,必须使用 --publish 服务并将模式设置为主机。如果省略模式键或将其设置为入口,则使用路由网格。以下命令使用主机模式并绕过路由网格创建全局服务。

docker service create --name dns-cache \  --publish published=53,target=53,protocol=udp,mode=host \  --mode global \  dns-cache
外部负载均衡

外部组件(例如云负载均衡器)可以访问集群中任何节点的 PublishedPort 上的服务,无论该节点当前是否正在运行该服务的任务。 swarm 中的所有节点将入口连接路由到正在运行的任务实例。

DNS

Swarm 模式有一个内部 DNS 组件,它自动为 swarm 中的每个服务分配一个 DNS 条目。 swarm manager 使用内部负载平衡根据服务的 DNS 名称在集群内的服务之间分配请求。

2 部署

2.1 准备

设置/etc/hosts

ansible swarm -m pingansible swarm -m blockinfile -a 'path=/etc/hosts marker="# {mark} ANSIBLE HOST" block="192.168.122.25 vm1\n192.168.122.103 vm2\n192.168.122.206 vm3\n192.168.122.199 vm4"' -b ansible swarm -m blockinfile -a 'path=/etc/hosts marker="# {mark} ANSIBLE REGISTRY"  block="192.168.122.240 registry.test-lu.com"' -b 
关闭selinux、关闭防火墙
ansible swarm -m systemd -a 'name=ufw state=stopped enabled=false' -b
安装docker Docker Engine 1.12+
ansible swarm -m shell -a 'echo  "deb [arch=amd64]  focal stable" > /etc/apt/sources.list.d/docker.list' -b ansible swarm -m shell -a 'curl -fsSL  | apt-key add -' -b ansible swarm -m shell -a "apt update" -bansible swarm -m apt -a "name=docker-ce state=present" -bansible swarm -m copy -a "src=daemon.json  dest=/etc/docker/daemon.json mode=0644" -bansible swarm -m systemd -a 'name=docker state=restarted' -b

ansible使用apt模块更新源update_cache=true会报错:Failed to lock apt for exclusive operation

安装其他包(选做)

ansible swarm -m apt -a "name=nfs-common,net-tools state=present" -b

nfs-common 存储使用

2.2 安装集群

初始化集群

docker swarm init --advertise-addr 192.168.122.12
查看节点
# docker node lsID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSIONxuzakb1mqgebddfntj33i82uz *   vm1        Ready     Active         Leader           20.10.1767w7csyev8tuz4ues1mytv8us     vm2        Ready     Active         Reachable        20.10.17m1mo406b1pouugrcbos5ahoky     vm3        Ready     Active         Reachable        20.10.17rj9n6qs0juslk0sf1rk0dq76h     vm4        Ready     Active                          20.10.17

节点 ID 旁边的 * 表示您当前已连接到该节点。

# docker info……Server: Containers: 4  Running: 2  Paused: 0  Stopped: 2 Images: 2…… Swarm: active  NodeID: xuzakb1mqgebddfntj33i82uz  Is Manager: true  ClusterID: ls3loojb1r4y8mxz7l3bagrv8  Managers: 3  Nodes: 4  Default Address Pool: 10.0.0.0/8    SubnetSize: 24  Data Path Port: 4789

可以整体看到集群的概况信息

添加节点查看添加token

## worker节点docker swarm join-token worker## manager节点docker swarm join-token manager
添加节点
## 添加worker节点docker swarm join \    --token SWMTKN-1-40xh8jl3my614ib7jxsxrk6xnfc7sfcphdthtlkdnk00hjc4r0-27nl31648ay59kc03wgyzaifb \    192.168.122.12:2377## 添加manager节点docker swarm join \    --token SWMTKN-1-40xh8jl3my614ib7jxsxrk6xnfc7sfcphdthtlkdnk00hjc4r0-0n21e6mydfblw5j5oij4w9h76 \    192.168.122.12:2377

2.3 集群操作

节点升降级

## manager降级为workerdocker node demote vm1## worker升级为managerdocker node promote vm1
维护和恢复
## 驱逐节点的容器docker node update --availability drain vm1## 激活的容器docker node update --availability active vm1

有三种状态active/pause/drain

删除节点worker节点

## 在该需要节点操作,离开集群,docker node ls会显示节点是Down状态,--force来操作manager节点docker swarm leave## 删除节点docker node rm vm4

node rm需要节点是down的状态才可以。

manager节点

## 离开集群,在离开节点操作docker swarm leave --force## 降级为worker,在manager节点操作docker node demote vm3## 删除节点,在manager节点操作docker node rm vm3
锁定swarm

默认情况下,swarm manager 使用的 Raft 日志在磁盘上是加密的。这种静态加密可以保护的服务配置和数据免受访问加密 Raft 日志的攻击者的攻击。引入锁定swarm功能的原因之一是支持 Docker安全加密功能。

Docker 重启时,用于加密 swarm 节点之间通信的 TLS 密钥和用于加密和解密磁盘上的 Raft 日志的密钥都被加载到每个管理器节点的内存中。 Docker 有能力保护双向 TLS 加密密钥和用于加密和解密 Raft 静态日志的密钥,允许拥有这些密钥的所有权并要求手动解锁的manager。此功能称为自动锁定。

## 启用autolockdocker swarm update --autolock=true## 禁用autolockdocker swarm update --autolock=false## 查看unlock-keydocker swarm unlock-key## 更新unlock-keydocker swarm unlock-key --rotate## 开启swarmdocker swarm unlock

3 使用

常用运维命令

docker container exec -it $(docker ps --filter name=testnet-lu -q) bashdocker container log $(docker ps --filter name=testnet-lu -q) 

3.1 服务使用

部署服务

## 简单创建docker service create --replicas 1 --name testlu-nginx nginx:latest## 添加发布端口,并使用私有仓库docker service create --replicas 1 --name lu --publish 30081:80 --with-registry-auth nginx:latest## 创建global容器,在每个swarm 节点上运行一个服务docker service create \  --mode global \  --publish mode=host,target=80,published=8080 \  --name=nginx \  nginx:latest

docker service create --replicas uint --name string --publish port --mount mount

如果使用私有镜像仓库,需要登录后 docker service create --with-registry-auth 一起使用。

查看服务

docker service lsdocker service  ps testlu-nginxdocker service inspect --pretty testlu-nginxdocker ps

docker service ps会显示所有task状态包括Shutdown的

更新服务更新副本

docker service scale  testlu-nginx=2# docker service update --replicas 2 testlu-nginx

通用格式docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS>

scale命令没有update更直观

更新端口

docker service update --publish-add 30080:80 testlu-nginxdocker service update --publish-rm 80 testlu-nginx

--publish-add publish-pord:continer-port 添加发布

--publish-rm [target port] 删除发布只需要写容器内端口接口

--publish published=<PUBLISHED-PORT>,target=<CONTAINER-PORT>,protocol=<tcp/udp>,mode=host

swarm manager节点默认为服务分配一个PublishedPort,通常在30000-32767 范围内

更新镜像

docker service update --image nginx:latest testlu-nginx

3.2 容器网络

创建容器网络

## 创建网络docker network create --driver overlay testlu-net## 设置CIDRdocker network create --driver overlay --subnet  10.0.10.0/24  --gateway  10.0.10.1 --attachable  testlu-net1

默认创建的driver是bridge

查看容器网络

# docker network ls NETWORK ID     NAME              DRIVER    SCOPE83078785965a   bridge            bridge    localb800e16fb950   docker_gwbridge   bridge    locale2d7cdfc491e   host              host      localkt21w1bjqx7a   ingress           overlay   swarm4083155f0adc   none              null      localm2xqiek4zngx   testlu-net        overlay   swarm5113e63wtbct   testlu-net1       overlay   swarm
使用容器网络
## 创建service使用网络docker service create --replicas 1 --network testlu-net --name testnet-sc nginx:latest## service添加容器网络docker service update --network-add testlu-net1  testnet-sc## service删除网络容器docker service update --network-rm testlu-net1  testnet-sc

3.3 容器存储

Bind mounts

## 创建bind目录和设置文件mkdir /mnt/htmlecho testlu-nginx > /mnt/html/index.html## 添加bind mountdocker service update --mount-add type=bind,src=/mnt/html/,dst=/usr/share/nginx/html/ testlu-nginx## 删除bind mountdocker service update --mount-rm /usr/share/nginx/html/ testlu-nginx

--mount-rm <target port>和--publish-rm类型都是容器的信息。

Data volumes部署nfs

apt install nfs-servermkdir -p /nfsecho "/nfs 192.168.122.0/24(rw,sync,no_root_squash) " >> /etc/exports exportfs -rshowmount -e 127.0.0.1echo testlu-nginx > /nfs/index.html
service关联volume
## 创建volumedocker volume create --driver local \    --opt type=nfs \    --opt o=addr=192.168.122.1,rw \    --opt device=:/nfs \    nfsvolume## 添加data mount/usr/share/nginx/html/ docker service update --mount-add type=volume,src=nfsvolume,dst=/usr/share/nginx/html/ testlu-nginx## 删除data mountdocker service update --mount-rm /usr/share/nginx/html/ testlu-nginx
合并成一条命令
## 直接创建volume并添加到servicedocker service update --mount-add 'type=volume,src=nfsvolume1,dst=/usr/share/nginx/html/,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/nfs,"volume-opt=o=addr=192.168.122.1,rw"' testlu-nginx
volume管理
docker volume lsdocker volume inspect nfsvolume# docker volume rm nfsvolume
服务配置数据创建config
## 简短配置echo设置echo "config1 testlu-nginx" | docker config create testlu-config1 -## 文件形式配置echo "config2 testlu-nginx" > index.htmldocker config create testlu-config2 index.html
查看config
# docker config lsID                          NAME             CREATED          UPDATEDj85aakvb3hosv0l4kuhjgre6g   testlu-config1   2 seconds ago    2 seconds agozh9lowqrml4ktsrkl2r735inj   testlu-config2   38 seconds ago   38 seconds ago# docker config inspect testlu-config2[……        "Spec": {            "Name": "testlu-config2",            "Labels": {},            "Data": "Y29uZmlnMiB0ZXN0bHUtbmdpbngK"        }]# echo Y29uZmlnMiB0ZXN0bHUtbmdpbngK |base64 -dconfig2 testlu-nginx

config是base64加密,通过base64 -d解密

使用config

docker service update --publish-add 30083:80 --config-add src=testlu-config2,target="/usr/share/nginx/html/index.html" testnet-sc

访问 curl vm1:30083验证是否正常

服务证书

secret详细说明

# vim site.confserver {    listen                443 ssl;    server_name           localhost;    ssl_certificate       /run/secrets/site.crt;    ssl_certificate_key   /run/secrets/site.key;    location / {        root   /usr/share/nginx/html;        index  index.html index.htm;    }}
docker secret create site.key site.keydocker secret create site.crt site.crtdocker secret create site.conf site.confdocker service create \     --name nginx \     --secret site.key \     --secret site.crt \     --secret source=site.conf,target=/etc/nginx/conf.d/site.conf \     --publish published=3000,target=443 \     nginx:latest \     sh -c "exec nginx -g 'daemon off;'"

/run/secrets/site.key /run/secrets/site.crt

On my way!

标签: #nginxluawindows