kube-apiserver не может связаться с включенным TLS и т. д.
Я пытаюсь настроить кластер kubernetes на некоторых малиновых пис. Я успешно настроил кластер etcd с включенным TLS, и я могу получить доступ к этому кластеру через etcdctl и curl.
Однако, когда я пытаюсь запустить kube-apiserver с тем же файлом ca, я получаю сообщения о том, что кластер etcd неправильно настроен или недоступен.
Мой вопрос: почему curl и etcdctl могут просматривать состояние кластера и добавлять ключи с тем же файлом ca, который пытается использовать kube-apiserver, но не может kube-apiserver?
Когда я запускаю kube-apiserver и нажимаю 127.0.0.1 через HTTP, а не HTTPS, я могу запустить сервер API.
Если этого и приведенной ниже информации недостаточно для понимания проблемы, пожалуйста, дайте мне знать. У меня нет опыта работы с сертификатами TLS/x509. Я использовал Kelsey Hightowers Kubernetes The Hard Way, смешанный с документами CoreOS, для раскрутки кластера kubernetes, а также рассматривал проблемы github и тому подобное.
Вот мой файл модуля etcd:
[Unit]
Description=etcd
Documentation=https://github.com/coreos/etcd
[Service]
Environment=ETCD_UNSUPPORTED_ARCH=arm
ExecStart=/usr/bin/etcd \
--name etcd-master1 \
--cert-file=/etc/etcd/etcd.pem \
--key-file=/etc/etcd/etcd-key.pem \
--peer-cert-file=/etc/etcd/etcd.pem \
--peer-key-file=/etc/etcd/etcd-key.pem \
--trusted-ca-file=/etc/etcd/ca.pem \
--peer-trusted-ca-file=/etc/etcd/ca.pem \
--initial-advertise-peer-urls=https://10.0.1.200:2380 \
--listen-peer-urls https://10.0.1.200:2380 \
--listen-client-urls https://10.0.1.200:2379,http://127.0.0.1:2379 \
--advertise-client-urls https://10.0.1.200:2379 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster etcd-master1=https://10.0.1.200:2380,etcd-master2=https://10.0.1.201:2380 \
--initial-cluster-state new \
--data-dir=var/lib/etcd \
--debug
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
Вот команда kube-apiserver, которую я пытаюсь запустить:
#!/bin/bash
./kube-apiserver \
--etcd-cafile=/etc/etcd/ca.pem \
--etcd-certfile=/etc/etcd/etcd.pem \
--etcd-keyfile=/etc/etcd/etcd-key.pem \
--etcd-servers=https://10.0.1.200:2379,https://10.0.1.201:2379 \
--service-cluster-ip-range=10.32.0.0/24
Вот некоторые результаты этой попытки. Я думаю, что это немного странно, что он пытается перечислить узел etcd, но ничего не распечатывается:
deploy@master1:~$ sudo ./run_kube_apiserver.sh
I1210 00:11:35.096887 20480 config.go:499] Will report 10.0.1.200 as public IP address.
I1210 00:11:35.842049 20480 trace.go:61] Trace "List *api.PodTemplateList" (started 2016-12-10 00:11:35.152287704 -0500 EST):
[134.479µs] [134.479µs] About to list etcd node
[688.376235ms] [688.241756ms] Etcd node listed
[689.062689ms] [686.454µs] END
E1210 00:11:35.860221 20480 cacher.go:261] unexpected ListAndWatch error: pkg/storage/cacher.go:202: Failed to list *api.PodTemplate: client: etcd cluster is unavailable or misconfigured
I1210 00:11:36.588511 20480 trace.go:61] Trace "List *api.LimitRangeList" (started 2016-12-10 00:11:35.273714755 -0500 EST):
[184.478µs] [184.478µs] About to list etcd node
[1.314010127s] [1.313825649s] Etcd node listed
[1.314362833s] [352.706µs] END
E1210 00:11:36.596092 20480 cacher.go:261] unexpected ListAndWatch error: pkg/storage/cacher.go:202: Failed to list *api.LimitRange: client: etcd cluster is unavailable or misconfigured
I1210 00:11:37.286714 20480 trace.go:61] Trace "List *api.ResourceQuotaList" (started 2016-12-10 00:11:35.325895387 -0500 EST):
[133.958µs] [133.958µs] About to list etcd node
[1.96003213s] [1.959898172s] Etcd node listed
[1.960393274s] [361.144µs] END
Успешный запрос о состоянии кластера:
deploy@master1:~$ sudo etcdctl --cert-file /etc/etcd/etcd.pem --key-file /etc/etcd/etcd-key.pem --ca-file /etc/etcd/ca.pem cluster-health
member 133c48556470c88d is healthy: got healthy result from https://10.0.1.200:2379
member 7acb9583fc3e7976 is healthy: got healthy result from https://10.0.1.201:2379
Я также вижу много тайм-аутов на самих серверах etcd, пытающихся отправить биение назад:
Dec 10 00:19:56 master1 etcd[19308]: failed to send out heartbeat on time (exceeded the 100ms timeout for 790.808604ms)
Dec 10 00:19:56 master1 etcd[19308]: server is likely overloaded
Dec 10 00:22:40 master1 etcd[19308]: failed to send out heartbeat on time (exceeded the 100ms timeout for 122.586925ms)
Dec 10 00:22:40 master1 etcd[19308]: server is likely overloaded
Dec 10 00:22:41 master1 etcd[19308]: failed to send out heartbeat on time (exceeded the 100ms timeout for 551.618961ms)
Dec 10 00:22:41 master1 etcd[19308]: server is likely overloaded
Я все еще могу выполнять операции etcd, такие как get и put, но мне интересно, может ли это быть фактором? Могу ли я сказать kube-apiserver дольше ждать etcd? Я пытался понять это сам, но IMO технические части компонентов kuberentes не очень хорошо документированы, и многие примеры очень готовые, без реального объяснения, что все делает и почему. Я могу найти все виды диаграмм и сообщений в блоге о высокоуровневых вещах, но такие вещи, как, например, как запустить настоящий двоичный файл, а также какие флаги есть и не требуются, вроде бы отсутствуют.