Назад | Перейти на главную страницу

«EtcdException: не удалось получить список серверов» при запуске контейнера calico rkt на coreos

У меня есть две машины coreos stable v1122.2.0, каждая с etcd2 настроена с tls.

Я создал сертификаты, используя https://github.com/coreos/etcd/tree/master/hack/tls-setup.

теперь я пытаюсь настроить calico-node для работы на моем главном узле coreos с помощью rkt.

В конфигурации облачной конфигурации у меня есть следующее:

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

пожалуйста, не обращайте внимания на отступы пробела .. я не думаю, что копирую / вставляю его правильно :)

когда я пытаюсь запустить службу calico-node, я получаю следующую ошибку:

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

строки 2-25

так что я получаю Invalid ETCD_CA_CERT_FILE.. Я на самом деле не указал калико, какие ключи использовать ... так что я думаю, мне не хватает какой-то конфигурации.

У меня есть следующие ключи, относящиеся к / 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

Я пробовал добавить Environment=ETCD_CA_CERT_FILE=/etc/ssl/etcd/ca.pem в файл systemd calico-node, но я получаю точно такие же результаты.

Любые идеи ?

Обновить

поэтому я попытался запустить calico вручную, а не с помощью systemd. и я также добавил все необходимые переменные среды, которые требует calico

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

когда я пытаюсь выполнить контейнер ситца с:

/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

я получил

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

Я изменил права доступа к файлам сертификатов на 666, но это не решило проблему. и я знаю, что эти сертификаты действительны, потому что etcd tls работает правильно. так что мне не хватает?

обновление 2

Похоже, мне не удалось смонтировать каталог сертификатов на контейнере ситца.

так что теперь я запускаю контейнер ситца с

/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

Получаю следующий результат:

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

Я немного ближе .. но решения все равно нет.

обновление 3

Я попытался установить ETCD_ENDPOINTS на сервер etcd на машине coreos, запустив export ETCD_ENDPOINTS=https://10.79.218.2:2379, и теперь, когда я пытаюсь запустить образ calico rkt, я получаю:

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

У меня тоже была эта проблема, и в конце концов я нашел источник проблемы, просмотрев код логики подключения etcd и используемые библиотеки, а также некоторые указатели от команды Calico в их канале Slack.

Проблема заключается в том, что текущая версия (по крайней мере, до 0.22.0) Calico использует клиент Python etcd, который не поддерживает IP SAN (альтернативное имя субъекта) в сертификатах TLS. Это означает, что используемые вами сертификаты не могут быть правильно связаны с серверами etcd, на которых они настроены.

Это описано в этом Проблема с GitHub.

Чтобы исправить это, вы должны либо подождать, пока не будет выпущен новый выпуск библиотеки urllib, он будет загружен клиентом etcd, и будет выпущен новый выпуск, а Calico будет обновлен для использования нового клиента etcd. Кроме того, вы можете повторно сгенерировать сертификаты, используя полные доменные имена вместо IP-адресов в полях SAN. Это означает, что вам нужно будет убедиться, что ваши серверы доступны через эти имена, используя DNS или настройку /etc/hosts правильно. Конфигурация OpenSSL для генерации сертификатов должна содержать что-то вроде этого:

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

Ссылка, описывающая, как вы создали сертификаты, использует CFSSL поэтому я предлагаю прочитать его документацию о том, как перейти на использование имен хостов вместо IP-адресов. Я считаю, что это может быть так же просто, как изменить конфигурацию JSON следующим образом:

"hosts": [
    "example.com",
    "www.example.com"
],

Я считаю, что с этой нестабильной библиотекой я могу добиться успеха, если: клиент открывает соединение с IP-адресом; сертификат сервера утверждает этот IP-адрес в теме; и сертификат сервера НЕ имеет записей о типах DNS в списке альтернативных имен субъектов. Ниже приводится выбранный вывод из openssl x509 -text ... для примера сертификата сервера, который работает, когда клиент открывает соединение с использованием IP-адреса 10.10.10.1 для идентификации сервера:

...
        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
...

Также есть более новые версии изображений Calico. Я слышал только о двух плохих вещах calico/node:v0.23.0. Один от другого --- https://calicousers.slack.com/archives/kubernetes/p1478206011002345 . Я сам провел некоторое тестирование этого изображения и решил только одну проблему, https://github.com/projectcalico/calico-containers/issues/1107 . Сейчас есть бета-версии v1.0.0 и rc1, я не слышал о них плохого.