Docker swarm 集群配置
一、服务调用关系
二、服务器环境
三、软件环境
3.1 安装docker
yum -y install docker
systemctl start docker
systemctl enable docker
ExecStart=/usr/bin/dockerd -H 0.0.0.0:2375 -H unix:///var/run/docker.sock --containerd=/run/containerd/containerd.sock --default-ulimit nofile=1024000 --default-ulimit memlock=128849018880 --default-ulimit core=-1 --default-ulimit nproc=-1 --default-ulimit stack=-1 --default-ulimit nofile=1024000 --default-ulimit memlock=128849018880 --default-ulimit core=-1 --default-ulimit nproc=-1 --default-ulimit stack=-1 --insecure-registry=172.16.230.22 --insecure-registry=172.16.230.23 --insecure-registry=172.16.230.24 --insecure-registry=172.16.230.31
ExecReload=/bin/kill -s HUP $MAINPID
3.2 防火墙关闭
systemctl stop firewalld
systemctl disable firewalld
3.3 linux 系统系统优化
core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 255983 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 655350 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) unlimited cpu time (seconds, -t) unlimited max user processes (-u) unlimited virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
3.4 各个节点 docker pull swarm 下载swarm镜像
docker pull swarm
四、docker swarm集群部署
4.1 master创建Swarm(要保存初始化后token,因为在节点加入时要使用token作为通讯的密钥)
[root@master1 ~]# docker swarm init --advertise-addr 172.16.230.22 Swarm initialized: current node (0dgfdax3s09w5gk5zxeetvzpf) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-54g6mt7e30979f6jyikaqgokqrgq16irkqdo7fo7av22e8a9uv-5rf4m77xep55sdpy9d4xkx6l9 172.16.230.22:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
注:上面命令执行后,该机器自动加入到swarm集群。这个会创建一个集群token,获取全球唯一的 token,作为集群唯一标识。后续将其他节点加入集群都会用到这个token值。 其中,--advertise-addr参数表示其它swarm中的worker节点使用此ip地址与manager联系。命令的输出包含了其它节点如何加入集群的命令。
通过docker info 可以查看docker swarm 集群信息
Swarm: active NodeID: 0dgfdax3s09w5gk5zxeetvzpf Is Manager: true ClusterID: ocewqjt24jqcil1y0ugmv4v8z Managers: 1 Nodes: 1 Default Address Pool: 10.0.0.0/8 SubnetSize: 24 Data Path Port: 4789
Swarm:active 启动swarm集群
Managers:1 主节点1个
Nodes:1 node节点1个
启动docker swarm之后可以在host上看到启动了2个端口:2377和7946,2377作为cluster管理端口,7946用于节点发现
4.2 添加node节点到swarm集群中
Node1节点: docker swarm join --token SWMTKN-1-54g6mt7e30979f6jyikaqgokqrgq16irkqdo7fo7av22e8a9uv-5rf4m77xep55sdpy9d4xkx6l9 172.16.230.22:2377
Node2节点: docker swarm join --token SWMTKN-1-54g6mt7e30979f6jyikaqgokqrgq16irkqdo7fo7av22e8a9uv-5rf4m77xep55sdpy9d4xkx6l9 172.16.230.22:2377
4.3 master节点查看集群
Master节点: MANAGER STATUS状态 master1 为leader, 其他node节点为空
4.4 Manager管理节点宕机后其他管理节点仍然可以使用管理
intermal distributed state store:内部分布式状态存储同步共享到每个节点。
Manager:多个Manager已Raft来通过机制的选举,进行高可用。
raft:通常通过投票的方式进行选举,一般是奇数制的节点。
如果swarm失去法定人数,swarm不能自动恢复,工作节点上的任务继续运行,不受影响,但无法执行管理任务,包括扩展或更新服务,加入或删除节点。恢复的最佳方式是将丢失的leader节点重新联机。如果不可能,唯一方法是使用—force-newcluster管理节点的操作,这将去除本机之外的所有管理器身份。
docker swarm init --force-new-cluster --advertise-addr 172.16.230.22:2377
赋值其他工作节点为管理节点
docker node promote node1
docker node promote node2
再次查看节点:
五、部署docker network overlay网络
docker network的好处是:在同一个网络上的容器之间可以相互通信, 创建 overlay网络名称为 senyint-overlay ,子网 10.0.1.0/24网段
[root@master1 ~]# docker network create -d overlay senyint-overlay --subnet 10.0.1.0/24 n91ydjdmqse6n16668vwjm4va
六、 部署应用
docker service create --network senyint-overlay --replicas=3 --name hie-logger -p 30006:80 172.16.230.31/hie4.0/hie-logger:202004291700 sleep 50 docker service create --network senyint-overlay --replicas=3 --name hie-consumer-proxy -p 30002:80 172.16.230.31/hie4.0/hie-consumer-proxy:202004291700 sleep 50 docker service create --network senyint-overlay --replicas=3 --name hie-mq-router -p 30003:80 172.16.230.31/hie4.0/hie-mq-router:202004291700 sleep 50 docker service create --network senyint-overlay --replicas=3 --name hie-producer-adapter -p 30004:80 172.16.230.31/hie4.0/hie-producer-adapter:202004291700 sleep 50 docker service create --network senyint-overlay --replicas=3 --name hie-producer-proxy -p 9100:80 172.16.230.31/hie4.0/hie-producer-proxy:202004291700 sleep 50 docker service create --network senyint-overlay --replicas=3 --name hie-gateway -p 10000:80 172.16.230.31/hie4.0/hie-gateway:202004291700 sleep 50 docker service create --network senyint-overlay --replicas=3 --name oauth-server -p 6001:80 172.16.230.31/hie4.0/oauth-server:202004291700 sleep 50 docker service create --network senyint-overlay --replicas=3 --name hie-rest-server -p 1003:80 172.16.230.31/hie4.0/hie-rest-server:202004291700 sleep 50 docker service create --network senyint-overlay --replicas=3 --name web-admin-server -p 7001:80 172.16.230.31/hie4.0/web-admin-server:202004291700 sleep 50 docker service create --network senyint-overlay --replicas=3 --name hie-service-proxy -p 9001:80 172.16.230.31/hie4.0/hie-service-proxy:202004291700 sleep 50 docker service create --network senyint-overlay --replicas=3 --name hiefrontend -p 8888:80 172.16.230.31/hie4.0/hiefrontend:202004291700
七、 查看、更新、删除、扩容
查看部署了多少服务: docker service ls 查看服务具体信息: docker service ps 服务名 扩展服务(扩展3个副本): docker service scale 服务名=3 更新服务: docker service update --image 172.16.230.31/hie4.0/xxxxx:20200430 服务名
强制重启服务
docker service update --force 服务名
八、故障
8.1 docker service ls 副本数正常, 但是container 启动报错,nacos服务发现只有一个实例
nacos中 发现了一个 web-amdin-server 实例, 但是在 docker swarm中 启动了2个,通常是其他两个实例启动错误, 和服务的启动顺序有关, 可以删除 docker service rm 服务名, 重现建立
7.2 服务的container中有两个IP地址, 注册到nacos中时,注册IP是ingress, 访问是overlay 网络,所以rcp 调用不通, 需要研发修改配置文件,指定网卡或者网段。
7.3 服务之间的调用使用服务名,例如nginx, 但是nginx服务必须在 hie-rest-server 和 web-admin-server oauth-server 之后启动,否则telnet能通, 但是无法调用通。