前言:之前都是采用rancher可视化管理工具进行管理K8S进一步管理容器,但是每次机器宕机后rancher中集群特别容易挂掉,出现的问题五花八门,在网上很难搜到解决方案,所以准备采用docker官方集群管理平台Swarm管理容器。
环境:
主节点manager192.168.1.88
从节点node192.168.1.99
实际上manager也是一个node,manager获取客户端请求,对从节点进行调度工作
1.创建主节点
docker swarm init --advertise-addr 192.168.1.88
2.注册从节点
将上述命令在192.168.1.99上注册
docker swarm join --token SWMTKN-1-3mhx8nr3g3w1gc6uxyztzoys1v49e8lhqndj6pindvirhzlylk-2ebgshiazezm66cfxhyr6pjth 192.168.1.88:2377
在使用之前先看看docker集群swarm的一些命令,其实它的命令和docker的某些命令非常相似,只是多加了一个service
docker service [commond]
命令 | 用途 |
---|---|
create | 创建新服务 |
inspect | 展示一个或多个服务的详细信息 |
logs | 查看服务的日志 |
ls | 列出服务 |
ps | 根据名称列出服务 |
rm | 删除一个或多个服务 |
ps | 缩放一个或多个复制服务 |
update | 更新服务 |
1.查看当前节点信息
docker node ls
2.查看当前网络信息
docker network ls
3.创建一个私有网络,供不同节点互通使用
docker network create -d overlay new_network
4.使用创建的网络部署服务
此处创建一个使用net_network网络且名为my_nginx的服务
–replicas 参数来指定此服务在工作节点上运行的任务数。此处表示一个
docker service create --replicas 1 --network new_network --name my_nginx -p 80:80 nginx:latest
5.查看运行的服务列表
docker service ls
docker service ps my_nginx
docker service scale my_nginx=2
等同于命令docker service update --replicas 3 my_nginx
8.下线/上线节点
下线节点,下线后不参与任务分派,但是如果它原本有容器,那么这些容器会转移到其他可用节点上
docker node update --availability drain node2
上线节点
docker node update --availability active node2
9.移除任务,删除所有容器
docker rm my_nginx
docker swarm leave (在要离开的节点上运行,在主节点执行则是删除集群,主节点需要在后面加上--force参数)
以mysql搭建为例,正常我们使用docker,搭建命令如下:
docker run -p 3306:3306 --name mysql -v /home/mysql/conf:/etc/mysql -v /home/mysql/logs:/var/log/mysql -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
如果我们用服务创建,则命令如下:
docker service create --name=mysql -p 3306:3306 --mount type=bind,src=/home/mysql/logs,dst=/var/log/mysql --mount type=bind,src=/home/mysql/data,dst=/var/lib/mysql --mount type=bind,src=/home/mysql/conf,dst=/etc/mysql --env MYSQL_ROOT_PASSOWORD=123456 mysql:5.7
不难看出来,差别还是挺大的,对应命令下表:
docker | swarm |
---|---|
docker run | docker service create |
-p | -p |
-v | —mount type=bind,src=,dst= |
-e | –env |
mysql服务搭建好以后又来了一个问题,我部署服务的时候,它自动给我分配节点,可是我想要指定节点,就需要给每个节点打上标签,在运行服务的时候,指定标签。
1.打标签
docker node update --label-add func=node node1
#func=node是自己指定的键值对,也可以指定其他的,在调用的时候注意替换就好了,node1是我们集群中hostname的名称
2.使用标签指定主机
还是以mysql为例
加上–constraint ‘node.labels.func == node’
docker service create --name=mysql -p 3306:3306 --constraint 'node.labels.func == node'
--mount type=bind,src=/home/mysql/logs,dst=/var/log/mysql --mount type=bind,src=/home/mysql/data,dst=/var/lib/mysql --mount type=bind,src=/home/mysql/conf,dst=/etc/mysql --env MYSQL_ROOT_PASSOWORD=123456 mysql:5.7
到这一步集群搭建完成,用portainer容器管理集群更加方便
安装Portainer版本: portainer-ce:2.0.1
汉化地址:https://github.com/eysp/public/releases
采用docker部署:
docker volume create portainer_data
docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:2.0.1
portainer安装参考自:Docker集群可视化管理平台(Portainer)
如果你觉得,我都搭建好了集群,想把portainer加入集群,创建服务用如下命令(如果要指定节点请参考第四章,不指定则默认主节点):
docker service create --name=portainer -p 8000:8000 -p 9000:9000 --mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock --mount type=bind,src=/data/portainer/data,dst=/data --mount type=bind,src=/data/portainer/public,dst=/public portainer/portainer-ce:2.0.1
安装好以后访问IP:9000,输入新密码,进入后它会自动识别主机节点,识别集群的服务和容器
如果还想要添加从节点信息或者其它的docker集群等进行管理,进行配置其它节点或者环境。以下通过agent方式添加
1.进入http://ip:9000/#!/wizard/endpoints
2.在从节点上运行
容器:
docker run --name=portainer_agent -d --restart=unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_agent:/data/docker/volumes/ \
-p 9001:9001 \
portainer/agent:latest
服务:
docker service create --name portainer_agent --mode global --mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock --mount type=bind,src=//var/lib/docker/volumes,dst=/var/lib/docker/volumes portainer/agent
然后再页面输入ip:9001,点击添加完成,页面会出现绿色提示成功并刷新集群
如果你打算用服务来管理所有程序,个人觉得一般情况下不用再把从节点注册进来,因为就算注册了,在portainer里面也只有主节点可以看到所有服务。当然,把从从节点注册进去以后可以直接通过界面对从节点的容器和镜像以及存储卷等信息进行管理。更多用法正在完善中。