25.6 Swarm中的过滤器

Swarm的调度器可以按照指定调度策略自动分配容器到节点,但有些时候希望能对这些分配加以干预。比如,让I/O敏感的容器分配到安装了SSD的节点上;让计算敏感的容器分配到CPU核数多的机器上;让网络敏感的容器分配到高带宽的机房;让某些容器尽量放同一个节点上,等等。

这可以通过过滤器(filter)来实现,目前支持五种过滤器:Constraint、Affinity、Port、Dependency、Health。下面介绍前两种过滤器。

1.Constraint过滤器

Constraint过滤器是绑定到节点的键值对,相当于给节点添加标签。可在启动Docker服务的时候指定,例如指定某个节点颜色为red:


  1. $ sudo docker daemon --label color=red -H tcp://0.0.0.0:2375 -H unix:///var/run/
  2. docker.sock

同样,可以写在Docker服务的配置文件里面(以Ubuntu 14.04为例,是/etc/default/docker):


  1. DOCKER_OPTS="--label color=red -H 0.0.0.0:2375 -H unix:///var/run/docker.sock"

使用Swarm启动容器的时候,采用-e constarint:key=value的形式,可以过滤选择出匹配条件的节点。

例如,我们将192.168.0.2节点打上红色标签,192.168.0.3节点打上绿色标签。然后,分别启动两个容器,指定使用过滤器分别为红色和绿色:


  1. $ docker -H 192.168.0.2:12375 run -d -e constraint:color==red ubuntu:14.04 ping
  2. 127.0.0.1
  3. 252ffb48e64e9858c72241f5eedf6a3e4571b1ad926faf091db3e26672370f64
  4. $ docker -H 192.168.0.2:12375 run -d -e constraint:color==green ubuntu:14.04 ping
  5. 127.0.0.1
  6. 3d6f8d7af8583416b17061d038545240c9e5c3be7067935d3ef2fbddce4b8136

25.6 Swarm中的过滤器 - 图1注意

指定标签中间是两个等号。

查看它们将被分配到指定节点上:


  1. $ docker -H 192.168.0.2:12375 ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 252ffb48e64e ubuntu:14.04 "ping 127.0.0.1" 1 minutes ago Up 1 minutes
  4. Host-2/sick_galileo
  5. 3d6f8d7af858 ubuntu:14.04 "ping 127.0.0.1" 2 minutes ago Up 2 minutes
  6. Host-3/compassionate_ritchie

另外,Docker内置了一些常见的过滤器,包括node、storagedriver、executiondriver、kernelversion、operatingsystem等。这些值可以通过docker info命令查看。

例如,目前集群中各个节点的信息为:


  1. $ docker -H 192.168.0.2:12375 info
  2. Containers: 5
  3. Images: 39
  4. Role: primary
  5. Strategy: spread
  6. Filters: health, port, dependency, affinity, constraint
  7. Nodes: 2
  8. Host-2: 192.168.0.2:2375
  9. Containers: 4
  10. Reserved CPUs: 0 / 4
  11. Reserved Memory: 1 GiB / 4.053 GiB
  12. Labels: color=red, executiondriver=native-0.2, kernelversion=3.16.0-43-generic,
  13. operatingsystem=Ubuntu 14.04.3 LTS, storagedriver=aufs
  14. Host-3: 192.168.0.3:2375
  15. Containers: 1
  16. Reserved CPUs: 0 / 8
  17. Reserved Memory: 0 B / 16.46 GiB
  18. Labels: color=green, executiondriver=native-0.2, kernelversion=3.16.0-30-generic,
  19. operatingsystem=Ubuntu 14.04.3 LTS, storagedriver=aufs
  20. CPUs: 12
  21. Total Memory: 20.51 GiB
  22. Name: 946d65606f7c

2.Affinity过滤器

Affinity过滤器允许用户在启动一个容器的时候,让它分配到某个已有容器的节点上。

例如,下面我们将启动一个nginx容器,让它分配到已经运行某个ubuntu容器的节点上。

在Constraint过滤器的示例中,我们分别启动了两个ubuntu容器sick_galileo和compassionate_ritchie,分别在Host-2和Host-3上。

现在启动一个nginx容器,让它与容器sick_galileo放在一起,都放到Host-2节点上。可以通过-e affinity:container==<name or id>参数来实现:


  1. $ docker -H 192.168.0.2:12375 run -d -e affinity:container==sick_galileo nginx

然后启动一个redis容器,让它与容器compassionate_ritchie放在一起,都放到Host-3节点上:


  1. $ docker -H 192.168.0.2:12375 run -d -e affinity:container==compassionate_
  2. ritchie redis

查看所有容器的运行情况,如下所示:


  1. $ docker -H 192.168.0.2:12375 ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS
  3. PORTS NAMES
  4. 0a32f15aa8ee redis "/entrypoint.sh redis" 2 seconds ago
  5. Up 1 seconds 6379/tcp Host-3/awesome_darwin
  6. d2b9a53e67d5 nginx "nginx -g 'daemon off" 29 seconds ago
  7. Up 28 seconds 80/tcp, 443/tcp Host-2/fervent_wilson
  8. 252ffb48e64e ubuntu:14.04 "ping 127.0.0.1" 2 minutes ago
  9. Up 2 minutes Host-2/sick_galileo
  10. 3d6f8d7af858 ubuntu:14.04 "ping 127.0.0.1" 3 minutes ago
  11. Up 3 minutes Host-3/compassionate_ritchie

3.其他过滤器

其他过滤器的使用方法也是大同小异,例如通过-e affinity:image==<name or id>来选择拥有指定镜像的节点,通过-e affinity:label_name==value来选择拥有指定标签的容器所允许的节点。

此外,当容器端口需要映射到宿主机指定端口号的时候,Swarm也会自动将容器分配到指定宿主机端口可用的节点。

当不同容器之间存在数据卷或链接依赖的时候,Swarm会将这些容器分配到同一个节点上。