前言:
眼前看官们对“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.htmlservice关联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-nginxvolume管理
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
标签: #nginxluawindows