O contêiner do Docker não pode se comunicar com o etcd

2

Eu criei 3 máquinas coreos em digitalocean usando este cloud-config.yml: link onde o token foi substituído por um Eu recuperei de:

$ curl -w "\n" "https://discovery.etcd.io/new?size=3"

Até este ponto, tudo funciona bem. Eu posso ver as outras máquinas, eu posso

$ curl -L http://<machine_ip>:2379/v2/keys/

em cada um deles e receba de volta dados válidos, então suspeito que minhas configurações de firewall estejam OK (mas talvez não). Meu problema começa quando eu configuro um contêiner docker. Primeiro eu obtenho o endereço IP para docker0:

$ ifconfig docker0

Depois, configuro o contêiner do docker:

$ docker run -it alpine ash

Quando isso é iniciado, corro:

$ apk update && apk add curl

Então eu tento acessar o etcd usando o endereço IP que recebi do ifconfig:

$ curl -L http://172.17.42.1:2379/v2/keys/

Mas o comando curl apenas trava e, eventualmente, expira. Eu suspeito que eu tenha algo configurado incorretamente no meu cloud-config.yml na seção etcd2 ou na configuração do iptables, mas eu ainda sou um pouco nova em tudo isso e tenho andado por aí durante todo o dia e só consigo não passe deste problema. Qualquer idéia seria muito apreciada.

    
por socketwiz 07.12.2015 / 01:00

1 resposta

0

Descobrir o IP que o etcd está escutando

O endereço que o etcd está escutando pode ser encontrado em /run/systemd/system/etcd.service.d/20-cloudinit.conf , então um truque é adicionar alguma configuração extra ao serviço etcd para que ele grave isso em um arquivo de ambiente que você possa usar em suas unidades do etcd.

Essa abordagem é útil quando seu cluster cresce a um ponto em que você deseja um cluster do etcd separado para os trabalhadores reais - então você só tem uma unidade global gravando o arquivo de ambiente para cada trabalhador.

Criando /etc/etcd.environment

Vamos supor que você esteja executando o etcd em cada máquina

Primeiramente, adicione alguma configuração extra à inicialização do serviço do etcd para criar um novo arquivo de ambiente contendo o endereço no qual o ETCD está escutando. Aqui está um fragmento bash que irá escrever a configuração necessária para você ...

cat << EOF > /run/systemd/system/etcd.service.d/30-environment.conf
[Service]
#write an environment file to use in other units
#see http://serverfault.com/a/741283/2411
ExecStartPost=/bin/bash -c "echo ETCD_ENDPOINT=\${ETCD_ADDR} > /etc/etcd.environment"
EOF
chmod 644 /run/systemd/system/etcd.service.d/30-environment.conf

Você pode reinicializar para que isso tenha efeito ou apenas recarregue assim ...

systemctl daemon-reload
systemctl restart etcd

Usando o /etc/etcd.environment em um arquivo de unidade

Você pode usar esse /etc/etcd.environment nas descrições de sua unidade e passar o ETCD_ENDPOINT ao seu contêiner para vê-lo como uma variável de ambiente ...

[Service]
EnvironmentFile=/etc/etcd.environment

ExecStart=/usr/bin/docker run --rm \
  -e ETCD_ENDPOINT=${ETCD_ENDPOINT} \
  --name example \
  ubuntu:15.10

Agora, seu contêiner pode usar isso para criar linhas de comando curl ou, melhor ainda, copiar o binário etcdctl no contêiner e usá-lo.

    
por 07.12.2015 / 13:49