“EtcdException: Não foi possível obter a lista de servidores” durante a execução do contêiner calico rkt no coreos

1

Eu tenho duas máquinas v1122.2.0 estáveis, cada uma com o etcd2 configurado com tls.

Eu criei os certificados usando o link .

agora estou tentando configurar o calico-node para operar no meu nó mestre coreos com o rkt.

Eu tenho o seguinte na configuração cloud-config:

write_files:
 - path: "/etc/kubernetes/cni/net.d/10-calico.conf"
   content: |
     {
     "name": "calico",
     "type": "flannel",
     "delegate": {
         "type": "calico",
         "etcd_endpoints": "https://10.79.218.2:2379,https://10.79.218.3:2379",
         "log_level": "none",
         "log_level_stderr": "info",
         "hostname": "10.79.218.2",
         "policy": {
             "type": "k8s",
             "k8s_api_root": "http://127.0.0.1:8080/api/v1/"
             }
         }
     }
 - path: "/etc/kubernetes/manifests/policy-controller.yaml"
   content: |
    apiVersion: v1
     kind: Pod
     metadata:
       name: calico-policy-controller
       namespace: calico-system
     spec:
       hostNetwork: true
       containers:
         # The Calico policy controller.
         - name: k8s-policy-controller
           image: calico/kube-policy-controller:v0.2.0
           env:
             - name: ETCD_ENDPOINTS
               value: "https://10.79.218.2:2379,https://10.79.218.3:2379"
             - name: K8S_API
               value: "http://127.0.0.1:8080"
             - name: LEADER_ELECTION
               value: "true"
         # Leader election container used by the policy controller.
         - name: leader-elector
           image: quay.io/calico/leader-elector:v0.1.0
           imagePullPolicy: IfNotPresent
           args:
             - "--election=calico-policy-election"
             - "--election-namespace=calico-system"
             - "--http=127.0.0.1:4040"
...
units:
 - name: calico-node.service
   enable: true
   command: start
   content: |
    [Unit]
    Description=Calico per-host agent
    Requires=network-online.target
    After=network-online.target

    [Service]
    Slice=machine.slice
    Environment=CALICO_DISABLE_FILE_LOGGING=true
    Environment=HOSTNAME=10.79.218.2
    Environment=IP=10.79.218.2
    Environment=FELIX_FELIXHOSTNAME=10.79.218.2
    Environment=CALICO_NETWORKING=false
    Environment=NO_DEFAULT_POOLS=true
    Environment=ETCD_ENDPOINTS=https://10.79.218.2:2379,https://10.79.218.3:2379
    ExecStart=/usr/bin/rkt run --inherit-env --stage1-from-dir=stage1-fly.aci \
   --volume=modules,kind=host,source=/lib/modules,readOnly=false \
   --mount=volume=modules,target=/lib/modules \
   --trust-keys-from-https quay.io/calico/node:v0.19.0

   KillMode=mixed
   Restart=always
   TimeoutStartSec=0

   [Install]
   WantedBy=multi-user.target

por favor, ignore o recuo do espaço .. eu não acho que copiar / colar corretamente:)

quando tento iniciar o serviço de nó calico, recebo o seguinte erro:

Sep 14 05:45:17 localhost systemd[1]: Started Calico per-host agent.
Sep 14 05:45:17 localhost rkt[1644]: image: using image from file /usr/lib64/rkt/stage1-images/stage1-fly.aci
Sep 14 05:45:18 localhost rkt[1644]: image: using image from local store for image name quay.io/calico/node:v0.19.0
Sep 14 05:45:25 localhost rkt[1644]: Traceback (most recent call last):
Sep 14 05:45:25 localhost rkt[1644]:   File "startup.py", line 292, in <module>
Sep 14 05:45:25 localhost rkt[1644]:     client = IPAMClient()
Sep 14 05:45:25 localhost rkt[1644]:   File "/usr/lib/python2.7/site-packages/pycalico/datastore.py", line 228, in __init__
Sep 14 05:45:25 localhost rkt[1644]:     "%s" % (ETCD_CA_CERT_FILE_ENV, etcd_ca))
Sep 14 05:45:25 localhost rkt[1644]: pycalico.datastore_errors.DataStoreError: Invalid ETCD_CA_CERT_FILE. Certificate Authority cert is required and m
Sep 14 05:45:25 localhost rkt[1644]: Calico node failed to start
Sep 14 05:45:25 localhost systemd[1]: calico-node.service: Main process exited, code=exited, status=1/FAILURE
Sep 14 05:45:25 localhost systemd[1]: calico-node.service: Unit entered failed state.
Sep 14 05:45:25 localhost systemd[1]: calico-node.service: Failed with result 'exit-code'.
Sep 14 05:45:25 localhost systemd[1]: calico-node.service: Service hold-off time over, scheduling restart.
Sep 14 05:45:25 localhost systemd[1]: Stopped Calico per-host agent.
Sep 14 05:45:25 localhost systemd[1]: Started Calico per-host agent.
Sep 14 05:45:25 localhost rkt[1714]: image: using image from file /usr/lib64/rkt/stage1-images/stage1-fly.aci
Sep 14 05:45:26 localhost rkt[1714]: image: using image from local store for image name quay.io/calico/node:v0.19.0
Sep 14 05:45:28 localhost rkt[1714]: Traceback (most recent call last):
Sep 14 05:45:28 localhost rkt[1714]:   File "startup.py", line 292, in <module>
Sep 14 05:45:28 localhost rkt[1714]:     client = IPAMClient()
Sep 14 05:45:28 localhost rkt[1714]:   File "/usr/lib/python2.7/site-packages/pycalico/datastore.py", line 228, in __init__
Sep 14 05:45:28 localhost rkt[1714]:     "%s" % (ETCD_CA_CERT_FILE_ENV, etcd_ca))
Sep 14 05:45:28 localhost rkt[1714]: pycalico.datastore_errors.DataStoreError: Invalid ETCD_CA_CERT_FILE. Certificate Authority cert is required and m

linhas 2-25

, então recebo Invalid ETCD_CA_CERT_FILE. . Eu realmente não especifiquei para o calico que chaves usar ... então eu acho que estou perdendo alguma configuração.

Eu tenho as seguintes chaves relacionadas etc em / etc / ssl / etcd

8 -rw-------. 1 etcd etcd 1050 Sep 14 05:45 ca.pem
8 -rw-------. 1 etcd etcd  289 Sep 14 05:45 etcd1-key.pem
8 -rw-------. 1 etcd etcd 1058 Sep 14 05:45 etcd1.pem
8 -rw-------. 1 etcd etcd  227 Sep 12 03:49 server1-key.pem
8 -rw-------. 1 etcd etcd  822 Sep 12 03:49 server1.pem

Eu tentei adicionar Environment=ETCD_CA_CERT_FILE=/etc/ssl/etcd/ca.pem ao arquivo systemd do calico node, mas obtive exatamente os mesmos resultados.

alguma ideia?

atualizar

então eu tentei executar o calico manualmente, não com o systemd. e eu também adicionei todas as variáveis de ambiente requeridas que a chita requer

export CALICO_DISABLE_FILE_LOGGING=true
export HOSTNAME=10.79.218.2
export IP=10.79.218.2
export FELIX_FELIXHOSTNAME=10.79.218.2
export CALICO_NETWORKING=false
export NO_DEFAULT_POOLS=true
export ETCD_ENDPOINTS=https://10.79.218.2:2379,https://10.79.218.3:2379
export ETCD_AUTHORITY=10.79.218.2:2379
export ETCD_SCHEME=https
export ETCD_CA_CERT_FILE=/etc/ssl/etcd/ca.pem
export ETCD_CERT_FILE=/etc/ssl/etcd/etcd1.pem
export ETCD_KEY_FILE=/etc/ssl/etcd/etcd1-key.pem

quando tento executar o contêiner de calico com:

/usr/bin/rkt run --inherit-env --stage1-from-dir=stage1-fly.aci \
 --volume=modules,kind=host,source=/lib/modules,readOnly=false \
 --mount=volume=modules,target=/lib/modules \
 --trust-keys-from-https quay.io/calico/node:v0.19.0

Eu obtenho

image: using image from file /usr/lib64/rkt/stage1-images/stage1-fly.aci
image: using image from local store for image name quay.io/calico/node:v0.19.0
Traceback (most recent call last):
  File "startup.py", line 292, in <module>
   client = IPAMClient()
  File "/usr/lib/python2.7/site-packages/pycalico/datastore.py", line 221, in __init__
    ETCD_CERT_FILE_ENV, etcd_cert))
pycalico.datastore_errors.DataStoreError: Cannot read ETCD_KEY_FILE and/or ETCD_CERT_FILE. Both must be readable file paths. Values provided: ETCD_KEY_FILE=/etc/ssl/etcd/etcd1-key.pem, ETCD_CERT_FILE=/etc/ssl/etcd/etcd1.pem

Alterei as permissões de arquivo dos arquivos de certificado para 666, mas isso não resolve o problema. e eu sei que estes certificados são válidos porque o tds do etcd funciona corretamente. então o que estou perdendo?

atualização 2

Parece que eu estava faltando para montar o diretório de certificados no contêiner de chita.

agora eu estou executando o contêiner de chita com

/usr/bin/rkt run --volume etcd-ssl,kind=host,source=/etc/ssl/etcd/,readOnly=true --inherit-env --stage1-from-dir=stage1-fly.aci  --volume=modules,kind=host,source=/lib/modules,readOnly=false  --mount=volume=modules,target=/lib/modules  --trust-keys-from-https quay.io/calico/node:v0.19.0 --mount volume=etcd-ssl,target=/etc/ssl/etcd

Eu recebo a seguinte saída:

image: using image from file /usr/lib64/rkt/stage1-images/stage1-fly.aci
image: using image from local store for image name quay.io/calico/node:v0.19.0
Traceback (most recent call last):
  File "startup.py", line 292, in <module>
client = IPAMClient()
  File "/usr/lib/python2.7/site-packages/pycalico/datastore.py", line 246, in __init__
allow_reconnect=True)
  File "/usr/lib/python2.7/site-packages/etcd/client.py", line 204, in __init__
set(self.machines))
  File "/usr/lib/python2.7/site-packages/etcd/client.py", line 299, in machines
return self.machines
  File "/usr/lib/python2.7/site-packages/etcd/client.py", line 301, in machines
    raise etcd.EtcdException("Could not get the list of servers, "
etcd.EtcdException: Could not get the list of servers, maybe you provided the wrong host(s) to connect to?
Calico node failed to start

Estou um pouco mais perto ... mas ainda não tenho solução.

atualização 3

Eu tentei configurar ETCD_ENDPOINTS para o servidor etcd na máquina coreos executando export ETCD_ENDPOINTS=https://10.79.218.2:2379 e, agora, quando tento executar a imagem do calico rkt, obtenho:

image: using image from file /usr/lib64/rkt/stage1-images/stage1-fly.aci
image: using image from local store for image name quay.io/calico/node:v0.19.0
Traceback (most recent call last):
  File "startup.py", line 295, in <module>
main()
  File "startup.py", line 251, in main
warn_if_hostname_conflict(ip)
  File "startup.py", line 192, in warn_if_hostname_conflict
current_ipv4, _ = client.get_host_bgp_ips(hostname)
  File "/usr/lib/python2.7/site-packages/pycalico/datastore.py", line 132, in wrapped
"running?" % (fn.__name__, e.message))
pycalico.datastore_errors.DataStoreError: get_host_bgp_ips: Error accessing etcd (Connection to etcd failed due to SSLError(CertificateError("hostname '10.79.218.2' doesn't match u'etcd'",),)).  Is etcd running?
Calico node failed to start
    
por ufk 14.09.2016 / 21:50

2 respostas

2

Eu também tive esse problema e, finalmente, encontrei a origem do problema, observando o código da lógica de conexão do etcd e as bibliotecas usadas, e alguns apontadores da equipe do Calico em seu canal do Slack.

O problema é que a versão atual (pelo menos até 0.22.0) do Calico usa um cliente do Python etcd que não suporta IP SAN (Subject Alt Name) em certificados TLS. Isso significa que os certificados que você está usando não podem ser corretamente associados aos servidores que eles estão configurados.

Isso é descrito neste problema do GitHub .

Para consertar isso, você deve esperar até que uma nova versão da biblioteca urllib seja feita, ela seja escolhida pelo cliente etcd, e uma nova liberação é feita, e o Calico é atualizado para usar o novo cliente etcd . Como alternativa, você pode gerar novamente os certificados usando FQDNs em vez de endereços IP nos campos SAN. Isso significa que você precisará garantir que seus servidores estejam acessíveis por meio desses nomes, usando DNS ou configurando /etc/hosts corretamente. A configuração do OpenSSL para gerar certificados deve conter algo como isto:

[alt_names]
DNS.1 = $ENV::FQDN

O link que descreve como você gerou os certificados usa CFSSL , portanto, sugiro ler sua documentação sobre como alterar o uso de nomes de host em vez de Endereços IP. Acredito que seja tão simples quanto modificar a configuração do JSON da seguinte forma:

"hosts": [
    "example.com",
    "www.example.com"
],
    
por 18.09.2016 / 07:55
0

Eu acho que com esta biblioteca escamosa eu posso ter sucesso se: o cliente abre uma conexão com um endereço IP; o certificado do servidor afirma esse endereço IP no Assunto; e o certificado do servidor NÃO possui nenhuma entrada de tipo DNS na lista Nome Alternativo de Assunto. A seguir, é selecionada a saída de openssl x509 -text ... para um certificado de servidor de exemplo que funciona quando o cliente abre uma conexão usando o endereço IP 10.10.10.1 para identificar o servidor:

...
        Subject: CN=10.10.10.1
...
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            X509v3 Key Usage: 
                Digital Signature, Non Repudiation, Key Encipherment
            X509v3 Subject Alternative Name: 
                IP Address:100.127.0.2, IP Address:100.127.0.2, IP Address:10.10.10.1
...

Além disso, existem versões mais recentes das imagens do Calico. Eu ouvi apenas duas coisas ruins sobre calico/node:v0.23.0 . Uma é de outra pessoa --- link . Eu mesmo fiz alguns testes dessa imagem e entreguei apenas um problema, link . Existem v1.0.0 betas e um rc1 agora, eu não ouvi coisas ruins sobre eles.

    
por 16.11.2016 / 15:58

Tags