Considérez ce scénario :
docker-machine create -d amazonec2 --swarm --swarm-master
(etc)docker-machine env
pour la nouvelle IP se plaindra de la non-concordance de l'IP de tls certdocker-machine regenerate-certs
fait fonctionner à nouveau docker avec docker-machine envdocker-machine env --swarm
cependant, agira comme si tout allait bien, mais aucune commande docker ou docker-compose ne fera rien. Aucune erreur dans cli, juste rien. Les images docker lorsque vous n'utilisez pas --swarm IP généreront une liste d'images appropriée, mais avec --swarm IP, il ne répertoriera que les en-têtes et aucune image.Est-ce que regenerate-certs
censé fonctionner avec un essaim existant ?
Lorsque vous exécutez swarm, il écoute l'adresse IP publique lors de sa première initialisation. docker inspect
sur le processus swarm manage
ressemble à ceci.
{
"Path": "/swarm",
"Args": [
"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",
"--strategy",
"spread",
"--advertise",
"PUBLICIP:2376",
"--replication",
"etcd://ectd.host:2379/swarm"
]
}
La solution de contournement rapide (et un peu paresseuse) que j'ai trouvée consiste simplement à réexécuter la commande docker-machine mais à utiliser le pilote générique à la place pour configurer swarm.
docker-machine --debug create NEWNAME -d generic \
--generic-ip-address SERVERIP \
--generic-ssh-key KEYPATH \
--generic-ssh-user core \
--engine-label public=false \
--swarm \
--swarm-master \
--swarm-opt replication \
--swarm-discovery=etcd:/URL:PORT/swarm \
--engine-opt "cluster-store=etcd://URL:PORT/store" \
--engine-opt "cluster-advertise=eth0:2376"
Merci pour cette astuce @dustinblackman. Cette solution de contournement m'aide beaucoup!
Existe-t-il une possibilité de supprimer l'une de ces machines après avoir régénéré le maître de l'essaim ?
Cela semble un peu confus lorsque le même serveur est répertorié deux fois avec des noms différents.
@rm-jamotion Sans utiliser docker-machine rm
? Vous pouvez supprimer le dossier des machines dans ~/.docker/machine/machines
.
@dustinblackman Oui, je sais, mais je dois supprimer la première machine à l'aide du pilote aws. Mais ce serait mieux s'il était possible de supprimer la machine créée avec le pilote générique et de déplacer les clés vers la machine aws. Ainsi, les fonctionnalités de démarrage/arrêt d'aws resteront disponibles...
docker-machine version 0.7.0, build 783b3a8,
Ce n'est pas seulement une question d'adresse IP. Même sans changement d'adresse IP dans le pilote Virtualbox, j'ai remarqué que regenerate-certs générait une mauvaise utilisation des clés :
sudo openssl x509 -in /var/lib/boot2docker/server.pem -noout -text | grep -A8 "X509v3 extensions"
X509v3 extensions:
X509v3 Key Usage: critical
Digital Signature, Key Encipherment, Key Agreement
X509v3 Extended Key Usage:
TLS Web Server Authentication
X509v3 Basic Constraints: critical
CA:FALSE
X509v3 Subject Alternative Name:
DNS:localhost, IP Address:10.10.0.148
Dans les journaux du démon docker, vous pouvez trouver :
2016-07-29 13:13:58.745094 I | http: TLS handshake error from 10.10.0.60:33214: tls: failed to verify client's certificate: x509: certificate specifies an incompatible key usage
Dans les informations de docker lorsqu'ils sont connectés à swarm, tous les nœuds sont en attente et dans les journaux de swarm master :
time="2016-07-29T13:22:58Z" level=debug msg="Failed to validate pending node: The server probably has client authentication (--tlsverify) enabled. Please check your TLS client certification settings: Get https://10.10.0.60:2376/info: remote error: bad certificate" Addr="10.10.0.60:2376"