Docker-Swarm,在分布式环境下部署多标签时不起作用的问题
Docker-Swarm, a problem that does not work when deploying with multiple labels in a distributed environment
设置两台服务器,一台作为管理节点,一台作为工作节点。
工作节点被标记为 role_1=true .
管理器节点标记为 role_2、role_3。
$ docker node update --label-add role_1=true node_1
node_1
$ docker node update --label-add role_2=true node_2
node_2
$ docker node update --label-add role_3=true node_2
node_2
$ docker node inspect node_1 --pretty
ID: rdnmlf1m0ge
Labels:
- role_1=true
$ docker node inspect node_2 --pretty
ID: td1cq8oxxrk2a
Labels:
- role_2=true
- role_3=true
main.go文件,Dockerfile为:
main.go
package main
import (
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
w.Write([]byte("Hello World!"))
})
err := http.ListenAndServe(":8080", nil)
if err != nil {
return
}
}
docker文件
FROM golang:latest
ENV GO111MODULE=off
WORKDIR /go/src/app
COPY . /go/src/app
RUN go build -o simple_program
ENTRYPOINT ["/go/src/app/simple_program"]
编写docker-compose 文件如下。
仅将管理器节点的标签添加到约束中。
version: '3.7'
services:
api_server:
image: simple_program
deploy:
mode: global
placement:
constraints:
- node.labels.role_2 == true
- node.labels.role_3 == true
ports:
- 8080:8080
它按预期工作。
$ docker stack deploy --compose-file docker-compose.yml simple_http_server
Creating network simple_http_server_default
Creating service simple_http_server_api_server
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
2vksfee0e4ef simple_http_server_api_server global 1/1 simple_program:latest *:8080->8080/tcp
如果同时分发给manager节点和worker节点,或者只分发给worker节点,则服务上不来。
version: '3.7'
services:
api_server:
image: simple_program
deploy:
mode: global
placement:
constraints:
- node.labels.role_1 == true
- node.labels.role_3 == true
ports:
- 8080:8080
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
rhto667wd9lb simple_http_server_api_server global 0/0 simple_program:latest *:8080->8080/tcp
服务日志中也没有显示任何内容。
$ docker service ps --no-trunc simple_http_server_api_server
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
$ docker service logs simple_http_server_api_server
$
我阅读了下面的 Whosebug 问题和答案,但没有帮助。
Multiple label placement constraints in docker swarm
来自placement-constraints:
“如果您指定多个放置约束,则服务只会部署到满足所有约束的节点上。”
您的第二个部署列出了 node_1 和 node_3 的约束组合,这是不可能的,因为您没有满足此要求的节点。
设置两台服务器,一台作为管理节点,一台作为工作节点。
工作节点被标记为 role_1=true .
管理器节点标记为 role_2、role_3。
$ docker node update --label-add role_1=true node_1
node_1
$ docker node update --label-add role_2=true node_2
node_2
$ docker node update --label-add role_3=true node_2
node_2
$ docker node inspect node_1 --pretty
ID: rdnmlf1m0ge
Labels:
- role_1=true
$ docker node inspect node_2 --pretty
ID: td1cq8oxxrk2a
Labels:
- role_2=true
- role_3=true
main.go文件,Dockerfile为:
main.go
package main
import (
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
w.Write([]byte("Hello World!"))
})
err := http.ListenAndServe(":8080", nil)
if err != nil {
return
}
}
docker文件
FROM golang:latest
ENV GO111MODULE=off
WORKDIR /go/src/app
COPY . /go/src/app
RUN go build -o simple_program
ENTRYPOINT ["/go/src/app/simple_program"]
编写docker-compose 文件如下。 仅将管理器节点的标签添加到约束中。
version: '3.7'
services:
api_server:
image: simple_program
deploy:
mode: global
placement:
constraints:
- node.labels.role_2 == true
- node.labels.role_3 == true
ports:
- 8080:8080
它按预期工作。
$ docker stack deploy --compose-file docker-compose.yml simple_http_server
Creating network simple_http_server_default
Creating service simple_http_server_api_server
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
2vksfee0e4ef simple_http_server_api_server global 1/1 simple_program:latest *:8080->8080/tcp
如果同时分发给manager节点和worker节点,或者只分发给worker节点,则服务上不来。
version: '3.7'
services:
api_server:
image: simple_program
deploy:
mode: global
placement:
constraints:
- node.labels.role_1 == true
- node.labels.role_3 == true
ports:
- 8080:8080
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
rhto667wd9lb simple_http_server_api_server global 0/0 simple_program:latest *:8080->8080/tcp
服务日志中也没有显示任何内容。
$ docker service ps --no-trunc simple_http_server_api_server
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
$ docker service logs simple_http_server_api_server
$
我阅读了下面的 Whosebug 问题和答案,但没有帮助。
Multiple label placement constraints in docker swarm
来自placement-constraints: “如果您指定多个放置约束,则服务只会部署到满足所有约束的节点上。”
您的第二个部署列出了 node_1 和 node_3 的约束组合,这是不可能的,因为您没有满足此要求的节点。