У меня есть две машины 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 работает правильно. так что мне не хватает?
Похоже, мне не удалось смонтировать каталог сертификатов на контейнере ситца.
так что теперь я запускаю контейнер ситца с
/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
Я немного ближе .. но решения все равно нет.
Я попытался установить 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, я не слышал о них плохого.