当前位置: 首页 > Linux

使用Portainer的Agent模式管理DockerSwarm集群

时间:2023-04-06 22:48:37 Linux

一、背景与环境在一个四节点dockerswarm集群上,采用Portainer的Agent模式进行集群管理。docker被收购后,官方已经放弃了dockerswarm。..但由于是小规模集群,使用K8S利大于弊,而K3S/MicroK8S等轻量级工具出现时间不长,也没有成熟的实现案例。所以这里还是使用dockerswarm作为docker集群管理工具。Portainer是一个docker集群管理UI工具,有CE版和商业版。其中,CE版本就足够了,这里使用CE版本。四个节点的操作系统都是CentOS7,CentOS7使用的防火墙是firewalld。如果生产环境无法关闭防火墙,需要规划好每个节点允许访问哪些服务和端口。例如每个节点执行如下配置(默认使用publiczone):#查看允许访问的服务和端口firewall-cmd--zone=public--list-servicesfirewall-cmd--zone=public--list-ports#允许http和https访问firewall-cmd--permanent--zone=public--add-service=httpfirewall-cmd--permanent--zone=public--add-service=httpsfirewall-cmd--reloadfirewall-cmd--zone=public--list-services#允许访问的端口firewall-cmd--zone=public--add-port=2375/tcp--permanentfirewall-cmd--zone=public--add-port=2376/tcp--permanentfirewall-cmd--zone=public--add-port=2377/tcp--permanentfirewall-cmd--zone=public--add-port=4789/udp--permanentfirewall-cmd--zone=public--add-port=7946/tcp--permanentfirewall-cmd--zone=public--add-port=7946/udp--permanentfirewall-cmd--zone=public--add-port=9001/tcp--permanentfirewall-cmd--reloadfirewall-cmd--zone=public--list-portshttp/https用于一些web服务访问,2375/tcp,2376/tcp,2377/tcp,4789/udp,7946/tcp,7946/udp这些是dockerswarm需要的端口/协议,9001/tcp是Portainer需要的端口/协议。2、安装Portainer本文不详细介绍如何搭建dockerswarm集群,只是在后续章节介绍一些注意事项。dockerswarm集群搭建完成后(例如4个节点,2个manager节点,2个worker节点搭建dockerswarm集群),执行如下操作。2.1安装Portainer:选择一个manager节点,比如manager01,安装portainer:dockernetworkcreate\--driveroverlay\--attachable\--subnet10.12.0.0/24\portainer_agent_networkdockerrun-d-p9000:9000--nameportainer\--networkportainer_agent_network\--restartalways\-v/var/run/docker.sock:/var/run/docker.sock\-v/docker/data/portainer:/dataportainer/portainer你为什么想创建第一个覆盖网络?就是让后续创建的全局服务portainer_agent和Portainer容器保持在同一个网络中,方便相互通信。为什么要手动创建网络?为的是手动指定网段,防止自动创建时与实际网段冲突。添加防火墙规则以允许访问端口9000firewall-cmd--zone=public--add-port=9000/tcp--permanentfirewall-cmd--reloadfirewall-cmd--zone=public--query-port=9000/tcp因为Portainer只运行在一个manager节点上,所以只需要在这个节点上添加防火墙配置即可。此外,Portainer不需要高可用。仅用于集群运维管理,数据已经挂在宿主机的/docker/data/portainer目录下,并指定了重启策略。从客户端浏览器访问:http://:9000/首次访问创建管理员用户,然后就此打住,等待下一个portainer_agent服务启动后再继续。2.2使用Agent模式管理DockerSwarm集群在swarm集群上创建portainer_agent服务:dockerservicecreate\--nameportainer_agent\--networkportainer_agent_network\--modeglobal\--constraint'node.platform.os==linux'\--mounttype=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock\--mounttype=bind,src=//var/lib/docker/volumes,dst=/var/lib/docker/volumes\portainer/agentmode指定为global,即尝试在swarm集群的所有活动节点上启动对应的docker容器;constraint约束指定为node.platform.os==linux,即仅在linux节点上启动。在manager节点执行dockerservicels,在各节点执行dockerps,查看服务和容器是否启动成功,登录Portainer管理UI,添加Agent作为Swarm集群的统一EndPoint:名称根据需要,AgentURL填写tasks.portainer_agent:9001即可。该值由之前创建的服务portainer_agent决定。9001是portainer_agent的默认访问端口。2.3其他方式安装Portainer和Agent我们也可以通过其他方式安装Portainer和Agent。将portainer作为服务启动的方式和创建portainer_agent服务一样,但是可以将portainer作为服务启动,如下:dockerservicecreate\--nameportainer\--networkportainer_agent_network\--publish9000:9000\--replicas=1\--constraint'node.hostname==manager01.xxx.com'\portainer/portainer-H"tcp://tasks.portainer_agent:9001"--tlsskipverifydocker-compose统一编排我们也可以把Portainer和代理服务定义在一个docker-compose编排文件中,然后使用dockercompose或dockerstack启动。在任意目录编写排列文件,如portainer-agent-stack.yml,内容如下:version:'3.2'services:agent:image:portainer/agentenvironment:AGENT_CLUSTER_ADDR:tasks.portainer_agent#CAP_HOST_MANAGEMENT:1#AGENT_SECRET:secrettokenforportainerinvolumes:-/var/run/docker.sock:/var/run/docker.sock-/var/lib/docker/volumes:/var/lib/docker/volumes#-/:/host#ports:#-目标:9001#发布:9001#协议:tcp#模式:主机网络:-agent_net部署:模式:全局放置:约束:[node.platform.os==linux]portainer:图像:portainer/portainer命令:-Htcp://tasks.portainer_agent:9001--tlsskipverify#environment:#AGENT_SECRET:secrettokenforportainerinxxxcomports:-"9000:9000"#-"8000:8000"volumes:-/docker/data/portainer:/datanetworks:-agent_netdeploy:模式:复制品:1个ment:constraints:[node.hostname==manager01.xxx.com]networks:agent_net:driver:overlayattachable:true然后从dockercompose或dockerstack开始,例如从dockerstack开始:dockerstackdeploy--compose-file=portainer-agent-stack.ymlportainer3.Dockerswarm集群搭建关于如何搭建dockerswarm集群,这里不做详细介绍,只提几点注意事项。根据需要规划节点的作用。比如这里有4个配置相同的节点,规划了两个manager和两个worker;各节点docker安装完成后,建议修改仓库镜像,默认网段,允许通过2375端口访问dockerAPI。初始化swarm前,建议在各节点手动创建虚拟网络docker_gwbridge,并指定一个与实际网段不冲突的网段:dockernetworkcreate--subnet10.11.0.0/24\--optcom.docker.network.bridge.name=docker_gwbridge\--optcom.docker.network.bridge.enable_icc=false\--optcom.docker.network.bridge.enable_ip_masquerade=true\docker_gwbridge可以使用route命令查看本地路由表,确认实际网段有哪些。在初始化swarm和将其他节点添加到swarm集群时,一定要指定各自的--advertise-addr和--listen-addr参数,以避免以后负载均衡失败。在防火墙无法关闭的场景下,注意执行本文开头和中间描述的防火墙设置,然后重启docker服务systemctldaemon-reloadsystemctlrestart当docker发现异常现象时,注意检查docker守护进程日志。可以通过servicedockerstatus-l,或者cat/var/log/messages|查看grep码头工人。