使用Docker Swarm运行服务并尝试缩减规模

请注意,Docker引擎的版本为1.12。

总结

在Swarm上同时运行nginx服务(nginx_sample),尝试进行缩小规模操作(使用docker service scale命令)。

命令清单

コマンド内容docker service create新規サービスを立ち上げるdocker service scale既存サービスをスケールアウト・インさせるdocker service lsswarmクラスタ内で動作しているサービスのリストを表示するdocker service psサービス内に含まれるタスク(コンテナ)の一覧を表示するdocker service rmサービスを削除する

这次主要使用的命令是前半的两个。

启动新服务

docker service create -p 80:80 --name="nginx_sample" --replicas=3 nginx

将swarm节点的TCP80端口(HTTP)与nginx_sample服务的TCP80端口(HTTP)进行关联。
nginx镜像也可以使用TCP443端口(HTTPS),但本次只是一个示例,不进行设置。

确认正在启动

docker service ls
ID            NAME          REPLICAS  IMAGE  COMMAND
8ejer8lok06o  nginx_sample  0/3       nginx

因为REPLICAS的值为0/3,所以还没有启动任何容器。

docker service ps nginx_sample
ID                         NAME            IMAGE  NODE        DESIRED STATE  CURRENT STATE             ERROR
6tns1opze4dtzjdq7la1rgpvj  nginx_sample.1  nginx  ubuntu-001  Running        Preparing 25 seconds ago  
ei2hww2pdqo4rd114d6sl0tvn  nginx_sample.2  nginx  ubuntu-002  Running        Preparing 25 seconds ago  
b9tvhzi6ln5hcjhnsia6y5uyp  nginx_sample.3  nginx  ubuntu-003  Running        Preparing 25 seconds ago

由于 DESIRED STATE 是 Running,但 CURRENT STATE 是 Preparing,所以尚未启动。

可以通过运行docker service inspect命令来获取指定服务的详细信息。

docker service inspect nginx_sample
[
    {
        "ID": "1uzck4r361lxi8u3zyaqa6zhf",
        "Version": {
            "Index": 91
        },
        "CreatedAt": "2016-08-13T14:47:54.266023526Z",    # 作成が指示された時刻
        "UpdatedAt": "2016-08-13T14:47:54.269125202Z", # 更新は行っていないのでCreatedAtに等しい
        "Spec": {
            "Name": "nginx_sample",
            "TaskTemplate": {
                "ContainerSpec": {
                    "Image": "nginx"
                },
                "Resources": {
                    "Limits": {},
                    "Reservations": {}
                },
                "RestartPolicy": {
                    "Condition": "any",
                    "MaxAttempts": 0
                },
                "Placement": {}
            },
            "Mode": {
                "Replicated": {
                    "Replicas": 3                                    # 指定したレプリカ数
                }
            },
            "UpdateConfig": {
                "Parallelism": 1,
                "FailureAction": "pause"
            },
            "EndpointSpec": {
                "Mode": "vip",
                "Ports": [
                    {
                        "Protocol": "tcp",
                        "TargetPort": 80,
                        "PublishedPort": 80
                    }
                ]
            }
        },
        "Endpoint": {
            "Spec": {
                "Mode": "vip",
                "Ports": [
                    {
                        "Protocol": "tcp",
                        "TargetPort": 80,
                        "PublishedPort": 80
                    }
                ]
            },
            "Ports": [                   # 指定したポートがオープンされている
                {
                    "Protocol": "tcp",
                    "TargetPort": 80,
                    "PublishedPort": 80
                }
            ],
            "VirtualIPs": [
                {
                    "NetworkID": "27szphefusnj2bdpq0itpfpat",
                    "Addr": "10.255.0.6/16"
                }
            ]
        },
        "UpdateStatus": {
            "StartedAt": "0001-01-01T00:00:00Z",       #サービスが起動中の場合、ここが空に等しいような値になっている
            "CompletedAt": "0001-01-01T00:00:00Z"
        }
    }
]

请注意以下事项

从DockerHub或其他互联网来源获取镜像时,要注意网络流量问题,因为每个独立的节点都会同时访问互联网。

开机后进行确认

无论访问哪一个Docker主机,都可以显示nginx的启动界面。

image
docker service ls
ID            NAME          REPLICAS  IMAGE  COMMAND
1uzck4r361lx  nginx_sample  3/3       nginx

REPLICAS已经是3/3,集群内的3个nginx容器已经根据指定的数量启动。

docker service ps nginx_sample
ID                         NAME            IMAGE  NODE        DESIRED STATE  CURRENT STATE          ERROR
dcdngo5ibombyjuqysst4y3gf  nginx_sample.1  nginx  ubuntu-003  Running        Running 8 minutes ago  
bg39i6hrqksfle0xypkpnoouz  nginx_sample.2  nginx  ubuntu-002  Running        Running 8 minutes ago  
4nutgpvioz91oyubtjb9lgzq6  nginx_sample.3  nginx  ubuntu-001  Running        Running 8 minutes ago

在ubuntu-001/002/003的每个节点上,各有一个nginx容器正在运行。

启动后的整体形象

Ingressオーバレイネットワーク(3コンテナ).png

调整服务规模

因为意识到不需要三个nginx容器,所以暂时将其缩减为一个。

描述从任何节点都可以访问的容器。

docker service scale nginx_sample=1 
nginx_sample scaled to 1

将复制品数量由3更改为1。

确认规模变更结果

docker service ls
ID            NAME          REPLICAS  IMAGE  COMMAND
1uzck4r361lx  nginx_sample  1/1       nginx 

复制品的值已经变成了1/1,并且达到了预期的结果。

docker service ps nginx_sample
ID                         NAME            IMAGE  NODE        DESIRED STATE  CURRENT STATE           ERROR
dcdngo5ibombyjuqysst4y3gf  nginx_sample.1  nginx  ubuntu-003  Shutdown       Shutdown 2 minutes ago  
bg39i6hrqksfle0xypkpnoouz  nginx_sample.2  nginx  ubuntu-002  Shutdown       Shutdown 2 minutes ago  
4nutgpvioz91oyubtjb9lgzq6  nginx_sample.3  nginx  ubuntu-001  Running        Running 15 hours ago

ubuntu-002(192.168.1.26)和ubuntu-003(192.168.1.29)上运行的容器已经停止。
nginx容器本身只在ubuntu-001(192.168.1.27)上运行,
但是不论访问ubuntu-002还是ubuntu-003,都会路由到nginx容器。
这归功于Ingress覆盖网络。

image
image
image

规模变更后的整体形象

Ingressオーバレイネットワーク(1コンテナ).png

总结

    • swarm上でサービスを構成し、swarm外からアクセスすることができた。(-p 80:80)

 

    • swarm上でサービスを構成するタスクが一つでも動作していれば各ノードを介してアクセスできた。(Ingressオーバレイネットワーク)

 

    swarm上でコマンド(docker service scale)を用いてサービスをスケールインさせることができた。
广告
将在 10 秒后关闭
bannerAds