Setelah lebih banyak menguji PR #770 saya menemukan ini:
Saya mendeteksi masalah IP lain yang berubah, setelah saya me-restart swarm ec2 cluster saya hari ini.
Master menggunakan ip lama dari mesin swarm
time="2015-03-18T18:23:54Z" level=error msg="Get https://54.69.29.90:2376/v1.15/info: dial tcp 54.69.29.90:2376: i/o timeout"
time="2015-03-18T18:23:54Z" level=error msg="Get https://54.69.230.35:2376/v1.15/info: dial tcp 54.69.230.35:2376: i/o timeout"
time="2015-03-18T18:23:54Z" level=error msg="Get https://54.69.255.39:2376/v1.15/info: dial tcp 54.69.255.39:2376: i/o timeout"
time="2015-03-18T18:23:54Z" level=error msg="Get https://52.10.167.59:2376/v1.15/info: dial tcp 52.10.167.59:2376: i/o timeout"
Saya menganalisis masalah:
Agen swarm bergabung dengan ip lama 52.10.167.59
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM
amazonec2-03 amazonec2 Stopped
dev virtualbox Stopped
ec2-swarm-01 amazonec2 Running tcp://54.149.27.239:2376 ec2-swarm-master
ec2-swarm-02 amazonec2 Running tcp://52.10.108.31:2376 ec2-swarm-master
ec2-swarm-03 * amazonec2 Running tcp://54.148.5.178:2376 ec2-swarm-master
ec2-swarm-master amazonec2 Running tcp://52.11.98.189:2376 ec2-swarm-master (master)
$ $(docker-machine env ec2-swarm-master)
$ docker ps --no-trunc
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
13d27667155b3b1962b99b8d817c7a9865b47fe5b0d5d9c0af08735b26163efa swarm:latest "/swarm join --addr 52.10.167.59:2376 token://5a57a53a13470b1e680c6904ce5b34d1" 35 hours ago Up 11 minutes 2375/tcp swarm-agent
810f7ce04b6439c191470a2116197088ee2a3d2e5ed1cc7f4742aacef46317f9 swarm:latest "/swarm manage --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server.pem --tlskey=/etc/docker/server-key.pem -H tcp://0.0.0.0:3376 token://5a57a53a13470b1e680c6904ce5b34d1" 35 hours ago Up 11 minutes 2375/tcp, 0.0.0.0:3376->3376/tcp swarm-agent-master
$ docker-machine ip ec2-swarm-master
52.11.98.189
Setelah IP dari mesin swarm berubah, implementasi harus mengkonfigurasi ulang agen swarm, menghapus wadah lama dan memulai yang baru.
Satu-satunya perbaikan cepat saat ini adalah membuat ulang agen dengan skrip kecil ini:
create-swam-agent.sh
#!/bin/bash
TOKEN=$(docker inspect -f "{{ index .Config.Cmd 3 }}" swarm-agent)
IP=$(curl http://169.254.169.254/latest/meta-data/public-ipv4)
docker stop swarm-agent
docker rm swarm-agent
docker run -d --name swarm-agent --restart=always swarm \
join --addr ${IP}:2376 \
${TOKEN}
Saya pikir jangka panjang kita harus mendukung semacam "sinkronisasi" ke toko konfigurasi, saya tidak tahu apakah layanan penemuan token Docker Hub akan mendukung modifikasi IP cluster, tapi saya yakin backend KV akan.
cc @aluzzardi @vieux @abronan Bagaimana Anda membayangkan alur kerja untuk kasus ini (mengubah IP di swarm)?
@nathanleclaire Entri di K/V dihapus setelah TTL kedaluwarsa (node dihapus dari penemuan). Jadi jika IP berubah, toko akan mencerminkan status cluster dengan benar setelah stop/restart (pada EC2 misalnya). Tetap saja Anda mungkin mengharapkan entri lama terdaftar sebentar sampai TTL mereka kedaluwarsa (Jika Anda memiliki 3 mesin, berharap memiliki 6 dari yang terdaftar meskipun entri lama akan ditandai sebagai tidak sehat dan tidak dapat digunakan di Swarm )
Sebagai solusinya, jika Mesin menyadari bahwa sebuah instance sedang dimulai ulang, ia dapat langsung menghapus entri di K/V untuk tidak mencantumkan mesin dengan IP yang salah setelah dimulai ulang.
Inilah solusi saya setelah mengubah alamat IP node swarm buruh pelabuhan:
% docker-machine env docker-node
% docker-machine regenerate-certs docker-node
(I sometimes need to run multiple times when error occurs.)
% eval $(docker-machine env docker-node)
% export TOKEN=$(docker inspect -f "{{ index .Config.Cmd 3}}" swarm-agent)
% docker rm -f swarm-agent
% docker run -d --name=swarm-agent --restart=always swarm:latest join --advertise "${DOCKER_HOST##tcp://}" "${TOKEN}"
Komentar yang paling membantu
Inilah solusi saya setelah mengubah alamat IP node swarm buruh pelabuhan: