web-dev-qa-db-ja.com

coreosでcalicorktコンテナを実行中に「EtcdException:サーバーのリストを取得できませんでした」

2台のcoreos安定v1122.2.0マシンがあり、それぞれにtlsで構成されたetcd2があります。

https://github.com/coreos/etcd/tree/master/hack/tls-setup を使用して証明書を作成しました。

現在、rktを使用してcoreosマスターノードで動作するようにcalico-nodeを構成しようとしています。

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

スペースのインデントは無視してください。適切にコピー/貼り付けできないと思います:)

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

Calico-nodesystemdファイルにEnvironment=ETCD_CA_CERT_FILE=/etc/ssl/etcd/ca.pemを追加しようとしましたが、まったく同じ結果が得られました。

何か案は ?

更新

そのため、systemdではなく手動でcalicoを実行しようとしました。また、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

export ETCD_ENDPOINTS=https://10.79.218.2:2379を実行して、CoreosマシンのetcdサーバーにETCD_ENDPOINTSを設定しようとしましたが、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
1
ufk

私もこの問題を抱えていましたが、最終的には、etcd接続ロジックのコードと使用されているライブラリ、およびSlackチャネルのCalicoチームからのいくつかのポインターを調べて問題の原因を見つけました。

問題は、Calicoの現在のバージョン(少なくとも0.22.0まで)がIPをサポートしないPython etcdクライアントSAN(Subject Alt TLS証明書の名前)。これは、使用している証明書を、それらが構成されているetcdサーバーに正しく関連付けることができないことを意味します。

これはこれで説明されています GitHubの問題

これを修正するには、urllibライブラリの新しいリリースが作成され、etcdクライアントによって取得され、その新しいリリースが作成され、Calicoが新しいetcdクライアントを使用するように更新されるまで待つ必要があります。または、SANフィールドのIPアドレスの代わりにFQDNを使用して証明書を再生成できます。つまり、DNSを使用するか、/etc/hostsを設定して、これらの名前でサーバーにアクセスできることを確認する必要があります。証明書を生成するためのOpenSSL構成には、次のようなものが含まれている必要があります。

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

証明書の生成方法を説明するリンクでは [〜#〜] cfssl [〜#〜] を使用しているため、IPアドレスの代わりにホスト名を使用するように変更する方法についてのドキュメントを読むことをお勧めします。次のようにJSON構成を変更するのと同じくらい簡単かもしれないと思います。

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

この不安定なライブラリを使用すると、次の場合に成功できることがわかります。クライアントがIPアドレスへの接続を開く。サーバーの証明書は、サブジェクト内のそのIPアドレスを表明します。サーバーの証明書には、サブジェクト代替名リストにDNSタイプのエントリがありません。以下は、クライアントがサーバーを識別するためにIPアドレスopenssl x509 -text ...を使用して接続を開いたときに機能するサーバー証明書の例として、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について悪いことを2つだけ聞いたことがあります。 1つは他の誰かからのものです--- https://calicousers.slack.com/archives/kubernetes/p1478206011002345 。私は自分でその画像のテストをいくつか行い、1つの問題だけを渡しました https://github.com/projectcalico/calico-containers/issues/1107 。現在、v1.0.0ベータとrc1がありますが、悪いことは聞いたことがありません。

0
user3473000