2017-09-22 9 views
2

충돌이 발생했으며 이제이 문제는 docker swarm status가 보류 중이며 노드 상태가 UNKNOWN이라고 표시되는 곳에서 발생합니다.docker swarm을 보류 중 상태에서 복구 할 수 없음

ID       HOSTNAME   STATUS AVAILABILITY MANAGER STATUS 
9tlo3rg7tuc23xzc3am28lak1 swarm-worker-1 Unknown Active   
d9hq8wzz6skh9pzrxzhbckm97 * swarm-manager-1 Unknown Active  Leader 

내가 고정 표시기 엔진과 VM을 다시 시작 시도했지만 어떤 식 으로든 도움이되지 않습니다이이 내 고정 표시기 노드 LS의 원인이되어 내 docker info 결과

[email protected]:~$ docker info 
Containers: 270 
Running: 0 
Paused: 0 
Stopped: 270 
Images: 160 
Server Version: 1.12.2 
Storage Driver: aufs 
Root Dir: /var/lib/docker/aufs 
Backing Filesystem: extfs 
Dirs: 1211 
Dirperm1 Supported: true 
Logging Driver: json-file 
Cgroup Driver: cgroupfs 
Plugins: 
Volume: local 
Network: host bridge null overlay 
Swarm: pending 
NodeID: d9hq8wzz6skh9pzrxzhbckm97 
Is Manager: true 
ClusterID: 5zgab5w50qgvvep35eqcbote2 
Managers: 1 
Nodes: 2 
Orchestration: 
    Task History Retention Limit: 5 
Raft: 
    Snapshot Interval: 10000 
    Heartbeat Tick: 1 
    Election Tick: 3 
Dispatcher: 
    Heartbeat Period: 5 seconds 
CA Configuration: 
    Expiry Duration: 3 months 
Node Address: HIDDEN 
Runtimes: runc 
Default Runtime: runc 
Security Options: apparmor seccomp 
Kernel Version: 4.4.0-91-generic 
Operating System: Ubuntu 16.04.1 LTS 
OSType: linux 
Architecture: x86_64 
CPUs: 2 
Total Memory: 6.804 GiB 
Name: swarm-manager-1 
ID: AXPO:VFSV:TDT3:6X7Y:QNAO:OZJN:U23R:V5S2:FU33:WUNI:CRPK:2E2C 
Docker Root Dir: /var/lib/docker 
Debug Mode (client): false 
Debug Mode (server): false 
Registry: https://index.docker.io/v1/ 
WARNING: No swap limit support 
Insecure Registries: 
127.0.0.0/8 

입니다. 시스템은 실제로 모든 컨테이너를 표시하지만 작업자에서 docker ps이라고 말하면서 실행됩니다. 그러나 매니저에서는 아무 것도 docker ps에 없습니다.

아이디어가 있으십니까?

답변

0

스웜 (Swarm)에 관한 나의 경험에서 유사한 문제에 대한 유일한 해결책은 떼를 파괴하는 것이 었습니다. 그리고 이것을 할 때 docker system prune (삭제할 수있는 가치가없는 경우에만)과 service docker restart을 수행해야합니다. 그리고 새로운 떼를 설치하십시오.

짜증나. 알고있다

0

전체 떼를 한꺼번에 다시 작성하는 대신 한 번에 하나씩 각 노드를 제거하고 다시 추가 할 수 있습니다. 이점은 떼기 상태가 파괴되지 않고 큰 덩어리 서비스를 수정하는 동안 서비스를 계속할 수 있습니다. 그러나이 프로세스는 관리자 쿼럼이없는 경우 상당히 복잡합니다.

먼저 노드 ID를 기록하십시오 (여기서는 $ WORKER_ID 및 $ MANAGER_ID로 언급합니다). 관리 노드에서

:

docker node update --availability drain $WORKER_ID 

^이것은 선택 사항이지만 떼 라이브 서비스로 작업 할 때 그것은 좋은 습관입니다.

docker swarm join-token manager 

^이 명령을 사용하면 제거 된 각 노드에서 실행되는 join 명령이 제공됩니다. 아래에서 $ JOIN_COMMAND로 참조하겠습니다. 관리자가 다시 참여하면 직원을 강등합니다. 노동자에

:

docker swarm leave 
$JOIN_COMMAND 

이 노드는 현재 매니저로 다시 합류한다, 그러나 나는 혼동을 피하기 위해 그에게 '노동자'를 계속 호출합니다.

관리자에

:

docker node rm $WORKER_ID 
docker node update --availability drain $MANAGER_ID 
docker swarm leave -f 
$JOIN_COMMAND 
docker node rm $MANAGER_ID 
docker node ls 

하는 작업자의 새로운 ID (호스트 이름에주의를 지불하지 역할을) 찾기 -> $ NEW_WORKER_ID

docker node demote $NEW_WORKER_ID 

귀하의 메뚜기 떼가 갱신되어야한다 -이 있다면 더 많은 노드에서 각 노드에서 실행되는 서비스는 각 노드를 고갈 시켰을 때 떼에서 마이그레이션되었을 것입니다.

그래도 작동하지 않는 경우 (관련 없음) 은 docker v17.06 이상으로 업그레이드하는 것이 좋습니다. 스웜 네트워킹은 그 전에는 매우 불안정하여 경쟁 조건에서 발생하는 많은 문제를 야기했습니다.