Estou definindo um serviço one-shot em minha configuração de nuvem do CoreOS, mas está falhando devido à impossibilidade de baixar arquivos do Google Cloud Storage (via wget):
13 de abril 11:09:56 staging-node-ys9y.c.experimentalberlin.internal sh[1132]: conectando-se a storage.googleapis.com|74.125.133.128|:443... falhou: conexão expirou.
Como devo garantir que o serviço seja capaz de baixar arquivos da Internet?
Minha configuração de nuvem
#cloud-config
coreos:
units:
- name: bootstrap.service
command: start
content: |
[Unit]
Description=Bootstrap instance
After=network-online.target
Requires=network-online.target
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/usr/bin/mkdir -p /tmp/kubernetes-staging
ExecStart=cd /tmp/kubernetes-staging
ExecStart=/bin/sh -c "cd /tmp/kubernetes-staging && wget https://storage.googleapis.com/experimentalberlin/staging.tar.gz && tar xf staging.tar.gz"
ExecStart=/tmp/kubernetes-staging/worker/bootstrap.sh
[Install]
WantedBy=local.target
Eu adotaria uma tática de várias etapas para solucionar isso. Perdoe as informações extras e explicações excessivas, todos aqui no CoreOS precisam lidar com isso comigo. ;)
Em primeiro lugar, você deseja certificar-se de que a URL da qual você está tentando fazer o download pode ser recuperada de dentro do cluster. Atualmente, não vejo nenhuma razão para que esse não seja o caso, já que consegui (como um aparte, geralmente é melhor não colocar material de chave privada em um tarball acessível ao público. Nesse caso, embora ainda não seja o ideal pode ser melhor incluir esses ativos no
user-data
ou pelo menos proteger o tarball com criptografia simétrica .)Como o cloud-init é executado depois que a rede está online, isso deve ser suficiente (o serviço de metadados reside em
http://169.254.169.254
e, portanto, o cloud-config não pode ser recuperado até que a rede esteja online). problemas de rede ou outros detalhes.Quando tento executar isso, recebo o seguinte erro:
A pista aqui é a linha:
Esta mensagem está informando que houve um problema ao executar o próprio script. Explorar isso faz todo o sentido, pois quando olho para o topo desse script de shell, não há nenhum shebang dizendo ao systemd como executar o executável (neste caso, são todos os comandos compatíveis com Bourne Shell / Bourne-Again Shell , então o shebang provavelmente deve ser ou .) Adicionar um
#!/bin/sh
shebang#!/bin/bash
deve corrigir esse problema.Algumas outras lêndeas menores:
ao usar
wget
especifique o local de download:ao expandir seu tarball, você pode enviá-lo para um local específico com
-C
:Isso permite que você os separe em suas
ExecStart=
opções relevantes, o que fornece registro adicional.bootstrap.sh
script real, eu mudaria todas asExecStart=
opções (com exceção da última) paraExecStartPre=
.