• docker swarm


    详情参考:http://c.biancheng.net/view/3176.html

    Swarm 是 Docker 官方提供的一款集群管理工具,其主要作用是把若干台 Docker 主机抽象为一个整体,并且通过一个入口统一管理这些 Docker 主机上的各种 Docker 资源。

    1.初始化一个全新的 Swarm

    (1)登录到 mgr1 并初始化一个新的 Swarm

    docker swarm init
    --advertise-addr 10.0.0.1:2377
    --listen-addr 10.0.0.1:2377

    docker swarm init 会通知 Docker 来初始化一个新的 Swarm,并将自身设置为第一个管理节点。同时也会使该节点开启 Swarm 模式。

    --advertise-addr 指定其他节点用来连接到当前管理节点的 IP 和端口。这一属性是可选的,当节点上有多个 IP 时,可以用于指定使用哪个IP。此外,还可以用于指定一个节点上没有的 IP,比如一个负载均衡的 IP。

    --listen-addr 指定用于承载 Swarm 流量的 IP 和端口。其设置通常与 --advertise-addr 相匹配,但是当节点上有多个 IP 的时候,可用于指定具体某个 IP。并且,如果 --advertise-addr 设置了一个远程 IP 地址(如负载均衡的IP地址),该属性也是需要设置的。建议执行命令时总是使用这两个属性来指定具体 IP 和端口。

    Swarm 模式下的操作默认运行于 2337 端口。虽然它是可配置的,但 2377/tcp 是用于客户端与 Swarm 进行安全(HTTPS)通信的约定俗成的端口配置。

    (2)列出 Swarm 中的节点。

    docker node ls

    (3)在 mgr1 上执行 docker swarm join-token命令用来获取添加新的工作节点和管理节点到 Swarm 的命令和 Token

    (4)登录到 wrk1,并使用包含工作节点接入 Token 的 docker swarm join 命令将其接入 Swarm。

    docker swarm join
    --token SWMTKN-1-0uahebax...c87tu8dx2c
    10.0.0.1:2377
    --advertise-addr 10.0.0.4:2377
    --listen-addr 10.0.0.4:2377

    2.Swarm服务的部署及相关操作

    (1)使用 docker service create 命令创建一个新的服务。

    docker service create --name web-fe
    -p 8080:8080
    --replicas 5
    nigelpoulton/pluralsight-docker-ci

    需要注意的是,该命令与熟悉的 docker container run 命令的许多参数是相同的。这个例子中,使用 --name 和 -p 定义服务的方式,与单机启动容器的定义方式是一样的。

    通过上面的命令和输出可以看出。使用 docker service creale 命令告知 Docker 正在声明一个新服务,并传递 --name 参数将其命名为 web-fe。将每个节点上的 8080 端口映射到服务副本内部的 8080 端口。接下来,使用 --replicas 参数告知 Docker 应该总是有 5 个此服务的副本。最后,告知 Docker 哪个镜像用于副本,重要的是,要了解所有的服务副本使用相同的镜像和配置。

    敲击回车键之后,主管理节点会在 Swarm 中实例化 5 个副本,管理节点也会作为工作节点运行。相关各工作节点或管理节点会拉取镜像,然后启动一个运行在 8080 端口上的容器。

    这还没有结束。所有的服务都会被 Swarm 持续监控,Swarm 会在后台进行轮训检查(Reconciliation Loop),来持续比较服务的实际状态和期望状态是否一致。如果一致,则无须任何额外操作;如果不一致,Swarm 会使其一致。换句话说,Swarm 会一直确保实际状态能够满足期望状态的要求。

    举例说明,假如运行有 web-fe 副本的某个工作节点宕机了,则 web-fe 的实际状态从 5 个副本降为 4 个,从而不能满足期望状态的要求。Docker 变回启动一个新的 web-fe 副本来使实际状态与期望状态保持一致。这一特性功能强大,使得服务在面对节点宕机等问题时具有自愈能力。

    (2)使用 docker service ls 命令可以查看 Swarm 中所有运行中的服务

    docker service ls

    (3)执行 docker service ps 命令可以查看服务副本列表及各副本的状态。
    docker service ps web-fe

    (4)关于服务更为详细的信息可以使用 docker service inspect 命令查看

    docker service inspect --pretty web-fe

    以上例子使用了 --pretty 参数,限制输出中仅包含最感兴趣的内容,并以易于阅读的格式打印出来。
    不加 --pretty 的话会给出更加详尽的输出。

    (5)副本服务vs全局服务

    服务的默认复制模式(Replication Mode)是副本模式(replicated)。

    这种模式会部署期望数量的服务副本,并尽可能均匀地将各个副本分布在整个集群中。

    另一种模式是全局模式(global),在这种模式下,每个节点上仅运行一个副本。可以通过给 docker service create 命令传递 --mode global 参数来部署一个全局服务。

    (6)服务的扩缩容

    假设业务呈爆发式增长,则 Web 前端服务接收到双倍的流量压力。所幸通过一个简单的 docker service scale 命令即可对 web-fe 服务进行扩容。

    docker service scale web-fe=10

    该命令会将服务副本数由 5 个增加到 10 个。后台会将服务的期望状态从 5 个增加到 10 个。
    运行 docker service ls 命令来检查操作是否成功。

    docker service scale web-fe=5
    再次执行 docker service scale 命令将副本数从 10 个降为 5 个。

    (7)删除服务

    docker service rm web-fe

    docker service rm 命令可用于删除之前部署的服务。

    (8)滚动升级

    对部署的应用进行滚动升级是常见的操作。长期以来,这一过程是令人痛苦的。我曾经牺牲了许多的周末时光来进行应用程序主版本的升级,而且再也不想这样做了。

    然而,多亏了 Docker 服务,对一个设计良好的应用来说,实施滚动升级已经变得简单多了!

    为了演示如何操作,下面将部署一个新的服务。但是在此之前,先创建一个新的覆盖网络(Overlay Network)给服务使用。

    这并非必须的操作,只是希望能够让大家了解如何创建网络并将服务接入网络。

    docker network create -d overlay uber-net

    该命令会创建一个名为 uber-net 的覆盖网络,接下来会将其与要创建的服务结合使用。覆盖网络是一个二层网络,容器可以接入该网络,并且所有接入的容器均可互相通信。

    即使这些容器所在的 Docker 主机位于不同的底层网络上,该覆盖网络依然是相通的。本质上说,覆盖网络是创建于底层异构网络之上的一个新的二层容器网络。

    执行 docker network ls 来查看网络是否创建成功,且在 Docker 主机可见。

    下面创建一个新的服务,并将其接入 uber-net 网络。

    docker service create --name uber-svc
    --network uber-net
    -p 80:80 --replicas 12
    nigelpoulton/tu-demo:v1

    首先,将服务命名为 uber-svc,并用 --network 参数声明所有的副本都连接到 uber-net 网络。
    然后,在整个 swarm 中将 80 端口暴露出来,并将其映射到 12 个容器副本的 80 端口。
    最后,声明所有的副本都基于 nigelpoulton/tu-demo:v1 镜像。

    执行 docker service lsdocker service ps 命令以检查新创建服务的状态。

    通过对服务声明 -p 80:80 参数,会建立 Swarm 集群范围的网络流量映射,到达 Swarm 任何节点 80 端口的流量,都会映射到任何服务副本的内部 80 端口。
    默认的模式,是在 Swarm 中的所有节点开放端口,称为入站模式(Ingress Mode)。此外还有主机模式(Host Mode),即仅在运行有容器副本的节点上开放端口

    即使某个节点上并未运行服务的副本,依然可以进入该页面,所有节点都配置有映射,因此会将请求转发给运行有服务副本的节点。

    update
    假设本次投票已经结束,而公司希望开启一轮新的投票。现在已经为下一轮投票构建了一个新镜像,并推送到了 Docker Hub 仓库,新镜像的 tag 由 v1 变更为 v2。
    此外还假设,本次升级任务在将新镜像更新到 Swarm 中时采用一种阶段性的方式,每次更新两个副本,并且中间间隔 20s。
    那么就可以采用如下的 docker service update 命令来完成。

    docker service update
    --image nigelpoulton/tu-demo:v2
    --update-parallelism 2
    --update-delay 20s uber-svc

    仔细观察该命令,docker service update 通过变更该服务期望状态的方式来更新运行中的服务。
    这一次我们指定了 tag 为 v2 的新镜像。接下来用 --update-parallelism 和 --update-delay 参数声明每次使用新镜像更新两个副本,其间有 20s 的延迟。最终,告知 Docker 以上变更是对 uber-svc 服务展开的。

    (9)Docker Swarm服务日志及相关配置

    Docker 节点默认的配置是,服务使用 json-file 日志驱动,其他的驱动还有 journald(仅用于运行有 systemd 的 Linux 主机)、syslog、splunk 和 gelf。
    json-file 和 journald 是较容易配置的,二者都可用于 docker service logs 命令。

    命令格式为:

    docker service logs <service-name>

  • 相关阅读:
    Java Web表达式注入
    Mysql:The Federated Storage Engine:联合(联盟)存储引擎:【远程连接】服务器引擎
    Mysql:16.11.1 Pluggable Storage Engine Architecture
    Mysql:Server Logs:mysqld服务器的各种日志
    Mysql:InnoDB Table Compression and InnoDB Page Compression:适用于InnoDB的:表压缩 & 页压缩
    Mysql:Redo Log
    kubectl相关指令
    使用alias简化kubectl输入
    使用Minikube运行一个本地单节点Kubernetes集群(阿里云)
    Javascript去掉base64中的回车换行
  • 原文地址:https://www.cnblogs.com/yangyangming/p/11660449.html
Copyright © 2020-2023  润新知