RockyLinux部署docker以及Swarm集群

  • Swarm的由来

2014 年 Docker 在容器界越来越火;这时容器的编排工具 Mesos 和 Kubernetes 也开始崭露头角。Docker 公司也开始筹划容器的编排和集群管理工具,推出了自己的通信协议项目 Beam.后来Beam 成为一个允许使用 Docker API 来控制的一种分布式系统;之后项目被重命名为 libswarm.在 2014 年 11 月,Docker 公司又对 libswarm 进行了重新设计,支持了远程调用 API,并且被重新命名为 Swarm。到此我们称之为 Swarm V1。

在 2016 年,为了解决中央服务可扩展性的问题,Docker 团队重新设计了 Swarm,并称之为 Swarm V2。此时的 Docker Swarm 已经可以支持超过 1000 多个节点的集群规模,并且 Docker 团队在发布 Docker 1.12 版本时,将 Docker Swarm 默认集成到了 Docker 引擎中。

Swarm的优点:

(1):分布式:Swarm 使用Raft(一种分布式一致性协议)协议来做集群间数据一致性保障,使用多个容器节点组成管理集群,从而避免单点故障。

(2):安全:Swarm 使用 TLS 双向认证来确保节点之间通信的安全,它可以利用双向 TLS 进行节点之间的身份认证,角色授权和加密传输,并且可以自动执行证书的颁发和更换。

(3):简单:Swarm 的操作非常简单,并且除 Docker 外基本无其他外部依赖,而且从 Docker 1.12 版本后, Swarm 直接被内置到了 Docker 中,可以说真正做到了开箱即用。

PS: 宇宙的尽头是k8s


  • Swarm的架构

Swarm 的架构整体分为管理节点(Manager Nodes)和工作节点(Worker Nodes),整体架构如下图:

swarm架构图

管理节点: 管理节点负责接受用户的请求,用户的请求中包含用户定义的容器运行状态描述,然后 Swarm 负责调度和管理容器,并且努力达到用户所期望的状态。

工作节点: 工作节点运行执行器(Executor)负责执行具体的容器管理任务(Task),例如容器的启动、停止、删除等操作。

管理节点和工作节点的角色并不是一成不变的,你可以手动将工作节点转换为管理节点,也可以将管理节点转换为工作节点。


  • Swarm的概念

(1)-Swarm 集群: Swarm 集群是一组被 Swarm 统一管理和调度的节点,被 Swarm纳管的节点可以是物理机或者虚拟机。其中一部分节点作为管理节点,负责集群状态的管理和协调,另一部分作为工作节点,负责执行具体的任务来管理容器,实现用户服务的启停等功能。

(2)-节点Swarm 集群中的每一台物理机或者虚拟机称为节点。节点按照工作职责分为管理节点和工作节点,管理节点由于需要使用 Raft 协议来协商节点状态,生产环境中通常建议将管理节点的数量设置为奇数个,一般为 3 个、5 个或 7 个。

(3)-服务是为了支持容器编排所提出的概念,它是一系列复杂容器环境互相协作的统称。一个服务的声明通常包含容器的启动方式、启动的副本数、环境变量、存储、配置、网络等一系列配置,用户通过声明一个服务,将它交给 Swarm,Swarm 负责将用户声明的服务实现。服务分为全局服务(global services)和副本服务(replicated services)。全局服务:每个工作节点上都会运行一个任务,类似于 Kubernetes 中的 Daemonset。副本服务:按照指定的副本数在整个集群中调度运行。

(4)-任务是集群中的最小调度单位,它包含一个真正运行中的 Docker 容器。当管理节点根据服务中声明的副本数将任务调度到节点时,任务则开始在该节点启动和运行,当节点出现异常时,任务会运行失败。此时调度器会把失败的任务重新调度到其他正常的节点上正常运行,以确保运行中的容器副本数满足用户所期望的副本数。


由于容器的 IP 只能在集群内部访问到,而且容器又是用后马上销毁,这样容器的 IP 也会动态变化,因此容器集群内部的服务想要被集群外部的用户访问到,服务必须要映射到主机上的固定端口。Swarm 使用入口负载均衡(ingress load balancing)的模式将服务暴露在主机上,该模式下,每一个服务会被分配一个公开端口(PublishedPort),你可以指定使用某个未被占用的公开端口,也可以让 Swarm 自动分配一个。

Swarm 集群的公开端口可以从集群内的任意节点上访问到,当请求达到集群中的一个节点时,如果该节点没有要请求的服务,则会将请求转发到实际运行该服务的节点上,从而响应用户的请求。公有云的云负载均衡器(cloud load balancers)可以利用这一特性将流量导入到集群中的一个或多个节点,从而实现利用公有云的云负载均衡器将流量导入到集群中的服务。


  • 搭建Swarm集群

部署Docker

(1): 安装系统必须要的工具

dnf install -y yum-utils device-mapper-persistent-data lvm2

(2): 添加软件源

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

(3):更新阿里云的软件源

sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo


(4):安装docker

dnf -y install docker-ce

(5):优化docker配置

mkdir /etc/docker/  vim /etc/docker/daemon.json

配置文件如下:

{  "exec-opts": ["native.cgroupdriver=systemd"],  "registry-mirrors": [      "https://fz5yth0r.mirror.aliyuncs.com",      "https://dockerhub.mirrors.nwafu.edu.cn/",      "https://mirror.ccs.tencentyun.com",      "https://docker.mirrors.ustc.edu.cn/",      "https://reg-mirror.qiniu.com",      "http://hub-mirror.c.163.com/",      "https://registry.docker-cn.com"  ],  "storage-driver": "overlay2",  "storage-opts": [    "overlay2.override_kernel_check=true"  ],  "log-driver": "json-file",  "log-opts": {    "max-size": "100m",    "max-file": "3"  }}

初始化集群

Docker 1.12 版本后, Swarm 已经默认集成到了 Docker 中,因此我们可以直接使用 Docker 命令来初始化 Swarm,集群初始化的命令格式如下:

docker swarm init

advertise-addr 一般用于主机有多块网卡的情况,如果你的主机只有一块网卡,可以忽略此参数。`--advertise-addr `

[root@vm157]# docker swarm initSwarm initialized: current node (q8f4cn68x0n3nfiogje32ikpi) is now a manager.To add a worker to this swarm, run the following command:    docker swarm join --token SWMTKN-1-62w7v05zh7hlxj3szwn89a4xiz7zws82qv7fldoe0uvl7c1qft-1oezdisdz62gf34xfo0vjjjos 192.168.50.157:2377To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.[root@vm157-postgresql postgresql]# docker node lsID                            HOSTNAME           STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSIONq8f4cn68x0n3nfiogje32ikpi *   vm157-postgresql   Ready     Active         Leader           20.10.17

集群初始化后, Swarm 会提示我们当前节点已经作为一个管理节点了,并且提示了如何把一台主机加入集群成为工作节点。

加入工作节点

docker swarm join --token SWMTKN-1-62w7v05zh7hlxj3szwn89a4xiz7zws82qv7fldoe0uvl7c1qft-1oezdisdz62gf34xfo0vjjjos 192.168.50.157:2377

默认加入的节点为工作节点,如果是生产环境,我们可以使用docker swarm join-token manager命令来查看如何加入管理节点

默认加入的节点为工作节点,如果是生产环境,我们可以使用docker swarm join-token manager命令来查看如何加入管理节点:

docker swarm join-token manager

复制 Swarm 输出的结果即可加入管理节点到集群中。

节点查看

节点添加完成后,我们使用以下命令可以查看当前节点的状态:

# docker node lsID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION1ehtnlcf3emncktgjzpoux5ga *   swarm-manager       Ready               Active              Leader              20.10.17pn7gdm847sfzydqhcv3vma97y *   swarm-node1         Ready               Active                                        20.10.174dtc9pw5quyjs5yf25ccgr8uh *   swarm-node2         Ready               Active                                        20.10.17est7ww3gngna4u7td22g9m2k5 *   swarm-node3         Ready               Active                                        20.10.17

到此,一个包含 1 个管理节点,3 个工作节点的 Swarm 集群已经搭建完成。

  • 使用Swarm

(1): 通过 docker service 命令创建服务

# docker service create --replicas 1 --name hello-world nginx24f9ng83m9sq4ml3e92k4g5byoverall progress: 1 out of 1 tasks1/1: running   [==================================================>]verify: Service converged

使用docker service ls命令可以查看已经启动的服务; 当我们不再需要这个服务了,可以使用docker service rm命令来删除服务.

(2)通过 docker stack 命令创建服务

这里我们通过部署postgreSQL为例子.

创建yaml文件

mkdir /app/postgresqlvim docker-compose.yml

具体内容:

头条的排版可能有问题. 可能需要大家自己调整

version: '3.7'volumes:    pgdata:        external: False    pg_db2:        external: False    pgadmin:        external: Falsesecrets:    postgres_admin_pwd:        external: trueservices:    postgresql:        image: reg.aixbx.com/aixbx/postgres:12.4 #这里的镜像大家可以去dockerhub上找        # container_name: postgres_db        #此处的secret我们需要先行创建        secrets:            - postgres_admin_pwd        ports:            - "5432:5432"        environment:            POSTGRES_USER: admin            POSTGRES_PASSWORD_FILE: /run/secrets/postgres_admin_pwd            ALLOW_IP_RANGE: 192.168.0.0/16            #POSTGRES_HOST_AUTH_METHOD: 'ldap ldapserver=192.168.31.222 ldapport=389 ldapprefix="uid=" ldapsuffix=", ou=算法二部, ou=employee, ou=users, dc=aixbx, dc=com"'            #POSTGRES_HOST_AUTH_METHOD: 'ldap ldapserver=192.168.31.222 ldapport=389 ldapbasedn="ou=users,dc=aixbx,dc=com" ldapbinddn="cn=admin,dc=aixbx,dc=com" ldapbindpass="1234aixuan1234" ldapsearchattribute=uid'        volumes:            - pgdata:/pgdata            - pg_db2:/var/lib/postgresql/data        deploy:            replicas: 1            restart_policy:               condition: on-failure    pgadmin:        image: aixbx/pgadmin:5.2  #这里的镜像大家可以去dockerhub上找        ports:            - "5050:5050"        environment:            DEFAULT_SERVER: "0.0.0.0"            #这里我配置LDAP登录            AUTHENTICATION_SOURCES: "['ldap', 'internal']"            LDAP_AUTO_CREATE_USER: "True"            LDAP_CONNECTION_TIMEOUT: "30"            LDAP_SERVER_URI: "192.168.50.207:389"            LDAP_USERNAME_ATTRIBUTE: "sAMAccountName"            LDAP_SEARCH_BASE_DN: "ou=example,dc=example,dc=cn"            LDAP_SEARCH_FILTER : "objectclass=*"            LDAP_SEARCH_SCOPE: "SUBTREE"            LDAP_BASE_DN: "ou=example,dc=example,dc=cn"            LDAP_BIND_USER: "CN=Administrator,CN=Users,dc=example,dc=cn"            LDAP_BIND_PASSWORD: "123456"        volumes:            - pgadmin:/var/lib/pgadmin/        deploy:            replicas: 1            restart_policy:                condition: on-failure

下面我们用docker service ls命令查看一下当前启动的服务

[root@vm157-postgresql postgresql]# docker service lsID             NAME                       MODE         REPLICAS   IMAGE                               PORTS6lgbpbxkwv8l   data-platform_pgadmin      replicated   1/1        reg.aixbx.com/aixbx/pgadmin:5.2     *:5050->5050/tcpntq18jy53ycq   data-platform_postgresql   replicated   1/1        reg.aixbx.com/aixbx/postgres:12.4   *:5432->5432/tcp

Docker Swarm 是一个用来定义复杂应用的集群编排工具,可以帮我们把多台主机组成一个 Swarm 集群,并且帮助我们管理和调度复杂的容器服务。由于 Swarm 已经被内置于 Docker 中,因此 Swarm 的安装和使用也变得非常简单,只要你有 Docker 的使用经验,就可以很快地将你的应用迁移到 Swarm 集群中。


docker swarm的使用还是比较简单的,可以方便大家部署一些简单的应用.本文供大家学习 和理解.

最后: 宇宙的尽头现在是k8s. 后续还会继续更新docker以及k8s的内容.

希望大家点赞, 转发和关注. 你的关注是更新的动力了.

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章