версия kubeadm: 1.10.2
Окружающая среда :
Пару месяцев назад я создал кластер HA kubernetes 1.9.3, используя kubeadm 1.9.3
, следуя «официальной» документации https://kubernetes.io/docs/setup/independent/high-availability/ , настроив etcd
Кластер HA, размещающий его на главных узлах с использованием статических модулей
Я хотел обновить свой кластер до k8s 1.10.2
используя последнюю версию kubeadm
; после обновления kubeadm
при запуске kubeadm upgrade plan
я получил следующую ошибку:
[root@shared-cob-01 tmp]# kubeadm upgrade plan
[preflight] Running pre-flight checks.
[upgrade] Making sure the cluster is healthy:
[upgrade/config] Making sure the configuration is correct:
[upgrade/config] Reading configuration from the cluster...
[upgrade/config] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[upgrade/plan] computing upgrade possibilities
[upgrade] Fetching available versions to upgrade to
[upgrade/versions] Cluster version: v1.9.3
[upgrade/versions] kubeadm version: v1.10.2
[upgrade/versions] Latest stable version: v1.10.2
[upgrade/versions] FATAL: context deadline exceeded
Я исследую проблему и обнаружил 2 основные причины:
kubeadm
не идентифицирует кластер etcd
как включенный TLSВ руководстве предлагается использовать следующую команду в статическом модуле etcd
- etcd --name <name> \
- --data-dir /var/lib/etcd \
- --listen-client-urls http://localhost:2379 \
- --advertise-client-urls http://localhost:2379 \
- --listen-peer-urls http://localhost:2380 \
- --initial-advertise-peer-urls http://localhost:2380 \
- --cert-file=/certs/server.pem \
- --key-file=/certs/server-key.pem \
- --client-cert-auth \
- --trusted-ca-file=/certs/ca.pem \
- --peer-cert-file=/certs/peer.pem \
- --peer-key-file=/certs/peer-key.pem \
- --peer-client-cert-auth \
- --peer-trusted-ca-file=/certs/ca.pem \
- --initial-cluster etcd0=https://<etcd0-ip-address>:2380,etcd1=https://<etcd1-ip-address>:2380,etcd2=https://<etcd2-ip-address>:2380 \
- --initial-cluster-token my-etcd-token \
- --initial-cluster-state new
kubeadm >= 1.10
проверяет (здесь: https://github.com/kubernetes/kubernetes/blob/release-1.10/cmd/kubeadm/app/util/etcd/etcd.go#L56) if etcd
включает TLS, проверяя наличие следующих флагов в команде static pod.
"--cert-file=",
"--key-file=",
"--trusted-ca-file=",
"--client-cert-auth=",
"--peer-cert-file=",
"--peer-key-file=",
"--peer-trusted-ca-file=",
"--peer-client-cert-auth=",
но поскольку флаги --client-cert-auth
и --peer-client-cert-auth
используются в инструкциях без каких-либо параметров (являются логическими), kubeadm
не распознал кластер etcd
имеющий TLS включено.
ЛИЧНОЕ ИСПРАВЛЕНИЕ:
Я обновил свою команду etcd
static pod, чтобы использовать - --client-cert-auth=true
и - --peer-client-cert-auth=true
ОБЩЕЕ ИСПРАВЛЕНИЕ:
Обновите инструкции, чтобы использовать --client-cert-auth=true
и --peer-client-cert-auth=true
и ослабьте проверки kubeadm, используя "--peer-cert-file"
и "--peer-key-file"
(без равенства)
kubeadm
не использовал правильные сертификатыпосле исправления точки 1 проблема все еще сохранялась, поскольку kubeadm
не использовал правильные сертификаты.
Фактически, следуя руководству kubeadm HA, созданные сертификаты имеют вид ca.pem
ca-key.pem
peer.pem
peer-key.pem
client.pem
client-key.pem
но последний kubeadm
healthcheck-client.key
вместо этого ожидает ca.crt
ca.key``peer.crt
peer.key``healthcheck-client.crt
healthcheck-client.key
.
Ключи kubeadm-config
MasterConfiguration etcd.caFile
, etcd.certFile
и etcd.keyFile
игнорируются.
ЛИЧНОЕ ИСПРАВЛЕНИЕ:
Сертификат .pem
переименован в их эквивалент .crt
и .key
и обновлена статическая конфигурация модуля etcd
для их использования.
ОБЩЕЕ ИСПРАВЛЕНИЕ:
Используйте значения kubeadm-config
data.caFile
, data.certFile
и data.keyFile
, выведите правильные сертификаты из определения статического модуля etcd (путь модуля + путь хоста томов) и / или создайте новый временный сертификат клиента для использования во время обновления.
План обновления должен был быть выполнен правильно
создайте кластер k8s ha, используя kubeadm 1.9.3
следуя https://kubernetes.io/docs/setup/independent/high-availability/, и попробуйте обновить его до k8s >= 1.10
используя последнюю версию kubeadm
эта проблема, похоже, исправлена в kubeadm 1.10.3
, хотя он не будет автоматически обновлять статический модуль etcd
поскольку он распознает его как «внешний»
Я использую kubeadm 1.10.3
и имею те же проблемы. Мой кластер 1.10.2 с внешним безопасным etcd
@brokenmass Значения ваших личных исправлений для второй причины, которую вы заметили, выглядят следующим образом:
caFile: /etc/kubernetes/pki/etcd/ca.crt
certFile: /etc/kubernetes/pki/etcd/healthcheck-client.crt
keyFile: /etc/kubernetes/pki/etcd/healthcheck-client.key
@detiber, не могли бы вы помочь?
@FloMedja
в моем случае значения выглядят так:
caFile: /etc/kubernetes/pki/etcd/ca.pem
certFile: /etc/kubernetes/pki/etcd/client.pem
keyFile: /etc/kubernetes/pki/etcd/client-key.pem
и 1.10.3 работает правильно
@brokenmass Итак, с kubeadm 1.10.3 все работает без каких-либо исправлений ваших личных данных. В этом случае я немного запутался. У меня kubeadm 1.10.3, но то же сообщение об ошибке, которое вы упомянули в этом отчете об ошибке. Я дважды проверю свою конфигурацию, возможно, я сделаю некоторые ошибки в другом месте
добавьте сюда (или присоединитесь к kubernetes slack и отправьте мне прямое сообщение) ваш kubeadm-config, etcd static pods yml и полный вывод kubeadm upgrade plan
Мои извинения, я только сейчас это вижу. @chuckha выполнил первоначальную работу для документации static-pod HA etcd, я буду работать с ним в течение следующих нескольких дней, чтобы посмотреть, сможем ли мы помочь исправить обновления HA.
@detiber спасибо. план обновления наконец-то заработал. но я сталкиваюсь с некоторыми проблемами условий гонки при попытке обновить кластер. иногда это срабатывает, иногда у меня та же ошибка, что и у kubernetes / kubeadm / issues / 850 . kubeadm попадает в состояние гонки при попытке перезапустить под на одном узле.
Я столкнулся с некоторыми трудностями при настройке тестовой среды для этого сегодня, и у меня не хватает времени до начала моих выходных. Я вернусь к этому в начале следующей недели.
/ назначить @chuckha @detiber
@chuckha @detiber @stealthybox есть ли обновления по этому
Таким образом, обновление 1.9-> 1.10 HA не было поддерживаемым или проверенным путем.
В настоящее время мы работаем над обновлением нашей документации для версий 1.11 -> 1.12, которую мы планируем сохранить в будущем.