Kubeadm: Обновление с 1.9.6 до 1.10.0 завершается ошибкой с тайм-аутом

Созданный на 28 мар. 2018  ·  42Комментарии  ·  Источник: kubernetes/kubeadm

ОТЧЕТ ОБ ОШИБКЕ

Версии

версия kubeadm (используйте kubeadm version ):

kubeadm version: & version.Info {Major: "1", Minor: "10", GitVersion: "v1.10.0", GitCommit: "fc32d2f3698e36b93322a3465f63a14e9f0eaead", GitTreeState: "clean", BuildDate16: "2018: 26-03-20 10Z ", GoVersion:" go1.9.3 ", компилятор:" gc ", платформа:" linux / amd64 "}

Окружающая среда :

  • Версия Kubernetes (используйте kubectl version ):

Версия клиента: version.Info {Major: «1», Minor: «9», GitVersion: «v1.9.6», GitCommit: «9f8ebd171479bec0ada837d7ee641dec2f8c6dd1», GitTreeState: «clean», BuildDate: «2018-03-21T15: 50Z ", GoVersion:" go1.9.3 ", компилятор:" gc ", платформа:" linux / amd64 "}
Версия сервера: version.Info {Major: «1», Minor: «9», GitVersion: «v1.9.6», GitCommit: «9f8ebd171479bec0ada837d7ee641dec2f8c6dd1», GitTreeState: «clean», BuildDate: «2018-03-21T15: 31Z ", GoVersion:" go1.9.3 ", компилятор:" gc ", платформа:" linux / amd64 "}

  • Облачный провайдер или конфигурация оборудования :

Scaleway baremetal C2S

  • ОС (например, из / etc / os-release):

Ubuntu Xenial (16.04 LTS) (GNU / Linux 4.4.122-mainline-rev1 x86_64)

  • Ядро (например, uname -a ):

Linux amd64-master-1 4.4.122-mainline-rev1 # 1 SMP вс, 18 марта, 10:44:19 UTC 2018 x86_64 x86_64 x86_64 GNU / Linux

Что случилось?

При попытке обновления с 1.9.6 до 1.10.0 я получаю такую ​​ошибку:

kubeadm upgrade apply v1.10.0
[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/version] You have chosen to change the cluster version to "v1.10.0"
[upgrade/versions] Cluster version: v1.9.6
[upgrade/versions] kubeadm version: v1.10.0
[upgrade/confirm] Are you sure you want to proceed with the upgrade? [y/N]: y
[upgrade/prepull] Will prepull images for components [kube-apiserver kube-controller-manager kube-scheduler]
[upgrade/apply] Upgrading your Static Pod-hosted control plane to version "v1.10.0"...
[etcd] Wrote Static Pod manifest for a local etcd instance to "/etc/kubernetes/tmp/kubeadm-upgraded-manifests411909119/etcd.yaml"
[certificates] Generated etcd/ca certificate and key.
[certificates] Generated etcd/server certificate and key.
[certificates] etcd/server serving cert is signed for DNS names [localhost] and IPs [127.0.0.1]
[certificates] Generated etcd/peer certificate and key.
[certificates] etcd/peer serving cert is signed for DNS names [arm-master-1] and IPs [10.1.244.57]
[certificates] Generated etcd/healthcheck-client certificate and key.
[upgrade/staticpods] Moved new manifest to "/etc/kubernetes/manifests/etcd.yaml" and backed up old manifest to "/etc/kubernetes/tmp/kubeadm-backup-manifests180476754/etcd.yaml"
[upgrade/staticpods] Waiting for the kubelet to restart the component
[upgrade/apply] FATAL: fatal error when trying to upgrade the etcd cluster: couldn't upgrade control plane. kubeadm has tried to recover everything into the earlier state. Errors faced: [timed out waiting for the condition], rolled the state back to pre-upgrade state

Чего вы ожидали?

Успешное обновление

Как это воспроизвести (максимально минимально и точно)?

Установите пакеты 1.9.6 и запустите кластер 1.9.6:

curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | tee /etc/apt/sources.list.d/kubernetes.list
apt-get update -qq
apt-get install -qy kubectl=1.9.6-00
apt-get install -qy kubelet=1.9.6-00
apt-get install -qy kubeadm=1.9.6-00

Отредактируйте kubeadm-config и измените featureGates со строки на карту, как указано в https://github.com/kubernetes/kubernetes/issues/61764 .

kubectl -n kube-system edit cm kubeadm-config

....
featureGates: {}
....

Загрузите kubeadm 1.10.0 и запустите kubeadm upgrade plan и kubeadm upgrade apply v1.10.0 .

kinbug prioritcritical-urgent triaged

Самый полезный комментарий

Временное решение - обеспечить сертификаты и обновить модули etcd и apiserver, минуя проверки.

Обязательно проверьте свою конфигурацию и добавьте все флажки для вашего варианта использования:

kubectl -n kube-system edit cm kubeadm-config  # change featureFlags
...
  featureGates: {}
...
kubeadm alpha phase certs all
kubeadm alpha phase etcd local
kubeadm alpha phase controlplane all
kubeadm alpha phase upload-config

Все 42 Комментарий

Работаем над локальным воспроизведением этой ошибки.

После 10 попыток это наконец сработало.

Вот мой etcd manifest diff
`` root @ vagrant : ~ # diff /etc/kubernetes/manifests/etcd.yaml /etc/kubernetes/tmp/kubeadm-backup-manifests858209931/etcd.yaml
16,17c16,17
<- --listen-client-urls = https://127.0.0.1 : 2379

<- --advertise-client-urls = https://127.0.0.1 : 2379

- --listen-client-urls=http://127.0.0.1:2379
- --advertise-client-urls=http://127.0.0.1:2379

19,27c19
<- --key-file = / etc / kubernetes / pki / etcd / server.key
<- --trusted-ca-file = / etc / kubernetes / pki / etcd / ca.crt
<- --peer-cert-file = / etc / kubernetes / pki / etcd / peer.crt
<- --peer-key-file = / etc / kubernetes / pki / etcd / peer.key
<- --client-cert-auth = истина
<- --peer-client-cert-auth = true
<- --cert-file = / etc / kubernetes / pki / etcd / server.crt
<- --peer-trust-ca-file = / etc / kubernetes / pki / etcd / ca.crt

<изображение: gcr.io/google_containers/etcd-amd64:3.1.12

image: gcr.io/google_containers/etcd-amd64:3.1.11

29,35d20
<exec:
<команда:
<- / bin / sh
<- -ec
<- ETCDCTL_API = 3 etcdctl --endpoints = 127.0.0.1: 2379 --cacert = / etc / kubernetes / pki / etcd / ca.crt
<--cert = / etc / kubernetes / pki / etcd / healthcheck-client.crt --key = / etc / kubernetes / pki / etcd / healthcheck-client.key
<получить фу
36a22,26
httpGet:
хост: 127.0.0.1
путь: / здоровье
порт: 2379
схема: HTTP
43,45c33
<имя: etcd-data
<- путь монтирования: / etc / kubernetes / pki / etcd

<имя: etcd-certs

  name: etcd

51,55c39
<имя: etcd-data
<- hostPath:
<путь: / etc / kubernetes / pki / etcd
<тип: DirectoryOrCreate

<имя: etcd-certs

name: etcd

корень @ бродяга : ~ # ls / etc / kubernetes / pki / etcd
ca.crt ca.key healthcheck-client.crt healthcheck-client.key peer.crt peer.key server.crt server.key '' ''

Кластер 1.9.6 на Ubuntu 17.10 Vagrant:

root<strong i="6">@vagrant</strong>:/vagrant# 1.10_kubernetes/server/bin/kubeadm upgrade apply v1.10.0
[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/version] You have chosen to change the cluster version to "v1.10.0"
[upgrade/versions] Cluster version: v1.9.6
[upgrade/versions] kubeadm version: v1.10.0
[upgrade/confirm] Are you sure you want to proceed with the upgrade? [y/N]: y
[upgrade/prepull] Will prepull images for components [kube-apiserver kube-controller-manager kube-scheduler]
[upgrade/apply] Upgrading your Static Pod-hosted control plane to version "v1.10.0"...
[etcd] Wrote Static Pod manifest for a local etcd instance to "/etc/kubernetes/tmp/kubeadm-upgraded-manifests262738652/etcd.yaml"
[certificates] Generated etcd/ca certificate and key.
[certificates] Generated etcd/server certificate and key.
[certificates] etcd/server serving cert is signed for DNS names [localhost] and IPs [127.0.0.1]
[certificates] Generated etcd/peer certificate and key.
[certificates] etcd/peer serving cert is signed for DNS names [vagrant] and IPs [10.0.2.15]
[certificates] Generated etcd/healthcheck-client certificate and key.
[upgrade/staticpods] Moved new manifest to "/etc/kubernetes/manifests/etcd.yaml" and backed up old manifest to "/etc/kubernetes/tmp/kubeadm-backup-manifests858209931/etcd.yaml"
[upgrade/staticpods] Waiting for the kubelet to restart the component
[apiclient] Error getting Pods with label selector "component=etcd" [the server was unable to return a response in the time allotted, but may still be processing the request (get pods)]
[apiclient] Error getting Pods with label selector "component=etcd" [Get https://10.0.2.15:6443/api/v1/namespaces/kube-system/pods?labelSelector=component%3Detcd: http2: server sent GOAWAY and closed the connection; LastStreamID=27, ErrCode=NO_ERROR, debug=""]
[apiclient] Error getting Pods with label selector "component=etcd" [Get https://10.0.2.15:6443/api/v1/namespaces/kube-system/pods?labelSelector=component%3Detcd: net/http: TLS handshake timeout]
[apiclient] Error getting Pods with label selector "component=etcd" [the server was unable to return a response in the time allotted, but may still be processing the request (get pods)]
[apiclient] Error getting Pods with label selector "component=etcd" [Get https://10.0.2.15:6443/api/v1/namespaces/kube-system/pods?labelSelector=component%3Detcd: http2: server sent GOAWAY and closed the connection; LastStreamID=3, ErrCode=NO_ERROR, debug=""]
[upgrade/apply] FATAL: fatal error when trying to upgrade the etcd cluster: couldn't upgrade control plane. kubeadm has tried to recover everything into the earlier state. Errors faced: [timed out waiting for the condition], rolled the state back to pre-upgrade state

Это моя среда воспроизведения: https://github.com/stealthybox/vagrant-kubeadm-testing

Измените эти строки на 1.9.6-00 для начальной загрузки: https://github.com/stealthybox/vagrant-kubeadm-testing/blob/9d4493e990c9bd742107b317641267c3ef3640cd/Vagrantfile#L18 -L20

Затем загрузите двоичные файлы сервера 1.10 в репо, и они будут доступны гостю в /vagrant
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.10.md#server -binaries

Журналы, связанные с kubelet etcd:

root<strong i="6">@vagrant</strong>:~# journalctl -xefu kubelet | grep -i etcd
Mar 28 16:32:07 vagrant kubelet[14676]: W0328 16:32:07.808776   14676 status_manager.go:459] Failed to get status for pod "etcd-vagrant_kube-system(7278f85057e8bf5cb81c9f96d3b25320)": Get https://10.0.2.15:6443/api/v1/namespaces/kube-system/pods/etcd-vagrant: dial tcp 10.0.2.15:6443: getsockopt: connection refused
Mar 28 16:32:07 vagrant kubelet[14676]: I0328 16:32:07.880412   14676 reconciler.go:217] operationExecutor.VerifyControllerAttachedVolume started for volume "etcd" (UniqueName: "kubernetes.io/host-path/7278f85057e8bf5cb81c9f96d3b25320-etcd") pod "etcd-vagrant" (UID: "7278f85057e8bf5cb81c9f96d3b25320")
Mar 28 16:34:27 vagrant kubelet[14676]: W0328 16:34:27.472534   14676 status_manager.go:459] Failed to get status for pod "etcd-vagrant_kube-system(7278f85057e8bf5cb81c9f96d3b25320)": Get https://10.0.2.15:6443/api/v1/namespaces/kube-system/pods/etcd-vagrant: dial tcp 10.0.2.15:6443: getsockopt: connection refused
Mar 28 16:57:33 vagrant kubelet[14676]: W0328 16:57:33.683648   14676 kubelet.go:1597] Deleting mirror pod "etcd-vagrant_kube-system(122348c3-32a6-11e8-8dc5-080027d6be16)" because it is outdated
Mar 28 16:57:33 vagrant kubelet[14676]: I0328 16:57:33.725564   14676 reconciler.go:217] operationExecutor.VerifyControllerAttachedVolume started for volume "etcd-certs" (UniqueName: "kubernetes.io/host-path/37936d2107e31b457cada6c2433469f1-etcd-certs") pod "etcd-vagrant" (UID: "37936d2107e31b457cada6c2433469f1")
Mar 28 16:57:33 vagrant kubelet[14676]: I0328 16:57:33.725637   14676 reconciler.go:217] operationExecutor.VerifyControllerAttachedVolume started for volume "etcd-data" (UniqueName: "kubernetes.io/host-path/37936d2107e31b457cada6c2433469f1-etcd-data") pod "etcd-vagrant" (UID: "37936d2107e31b457cada6c2433469f1")
Mar 28 16:57:35 vagrant kubelet[14676]: E0328 16:57:35.484901   14676 kuberuntime_container.go:66] Can't make a ref to pod "etcd-vagrant_kube-system(7278f85057e8bf5cb81c9f96d3b25320)", container etcd: selfLink was empty, can't make reference
Mar 28 16:57:35 vagrant kubelet[14676]: I0328 16:57:35.889458   14676 reconciler.go:191] operationExecutor.UnmountVolume started for volume "etcd" (UniqueName: "kubernetes.io/host-path/7278f85057e8bf5cb81c9f96d3b25320-etcd") pod "7278f85057e8bf5cb81c9f96d3b25320" (UID: "7278f85057e8bf5cb81c9f96d3b25320")
Mar 28 16:57:35 vagrant kubelet[14676]: I0328 16:57:35.889595   14676 operation_generator.go:643] UnmountVolume.TearDown succeeded for volume "kubernetes.io/host-path/7278f85057e8bf5cb81c9f96d3b25320-etcd" (OuterVolumeSpecName: "etcd") pod "7278f85057e8bf5cb81c9f96d3b25320" (UID: "7278f85057e8bf5cb81c9f96d3b25320"). InnerVolumeSpecName "etcd". PluginName "kubernetes.io/host-path", VolumeGidValue ""
Mar 28 16:57:35 vagrant kubelet[14676]: I0328 16:57:35.989892   14676 reconciler.go:297] Volume detached for volume "etcd" (UniqueName: "kubernetes.io/host-path/7278f85057e8bf5cb81c9f96d3b25320-etcd") on node "vagrant" DevicePath ""
Mar 28 16:58:03 vagrant kubelet[14676]: E0328 16:58:03.688878   14676 mirror_client.go:88] Failed deleting a mirror pod "etcd-vagrant_kube-system": Timeout: request did not complete within allowed duration
Mar 28 16:58:03 vagrant kubelet[14676]: E0328 16:58:03.841447   14676 event.go:200] Server rejected event '&v1.Event{TypeMeta:v1.TypeMeta{Kind:"", APIVersion:""}, ObjectMeta:v1.ObjectMeta{Name:"etcd-vagrant.152023ff626cfbc5", GenerateName:"", Namespace:"kube-system", SelfLink:"", UID:"", ResourceVersion:"", Generation:0, CreationTimestamp:v1.Time{Time:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, DeletionTimestamp:(*v1.Time)(nil), DeletionGracePeriodSeconds:(*int64)(nil), Labels:map[string]string(nil), Annotations:map[string]string(nil), OwnerReferences:[]v1.OwnerReference(nil), Initializers:(*v1.Initializers)(nil), Finalizers:[]string(nil), ClusterName:""}, InvolvedObject:v1.ObjectReference{Kind:"Pod", Namespace:"kube-system", Name:"etcd-vagrant", UID:"37936d2107e31b457cada6c2433469f1", APIVersion:"v1", ResourceVersion:"", FieldPath:""}, Reason:"SuccessfulMountVolume", Message:"MountVolume.SetUp succeeded for volume \"etcd-certs\" ", Source:v1.EventSource{Component:"kubelet", Host:"vagrant"}, FirstTimestamp:v1.Time{Time:time.Time{wall:0xbea7103f713e59c5, ext:1534226953099, loc:(*time.Location)(0x5859e60)}}, LastTimestamp:v1.Time{Time:time.Time{wall:0xbea7103f713e59c5, ext:1534226953099, loc:(*time.Location)(0x5859e60)}}, Count:1, Type:"Normal", EventTime:v1.MicroTime{Time:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, Series:(*v1.EventSeries)(nil), Action:"", Related:(*v1.ObjectReference)(nil), ReportingController:"", ReportingInstance:""}': 'Timeout: request did not complete within allowed duration' (will not retry!)
Mar 28 16:58:33 vagrant kubelet[14676]: E0328 16:58:33.844276   14676 event.go:200] Server rejected event '&v1.Event{TypeMeta:v1.TypeMeta{Kind:"", APIVersion:""}, ObjectMeta:v1.ObjectMeta{Name:"etcd-vagrant.152023ff626cfb82", GenerateName:"", Namespace:"kube-system", SelfLink:"", UID:"", ResourceVersion:"", Generation:0, CreationTimestamp:v1.Time{Time:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, DeletionTimestamp:(*v1.Time)(nil), DeletionGracePeriodSeconds:(*int64)(nil), Labels:map[string]string(nil), Annotations:map[string]string(nil), OwnerReferences:[]v1.OwnerReference(nil), Initializers:(*v1.Initializers)(nil), Finalizers:[]string(nil), ClusterName:""}, InvolvedObject:v1.ObjectReference{Kind:"Pod", Namespace:"kube-system", Name:"etcd-vagrant", UID:"37936d2107e31b457cada6c2433469f1", APIVersion:"v1", ResourceVersion:"", FieldPath:""}, Reason:"SuccessfulMountVolume", Message:"MountVolume.SetUp succeeded for volume \"etcd-data\" ", Source:v1.EventSource{Component:"kubelet", Host:"vagrant"}, FirstTimestamp:v1.Time{Time:time.Time{wall:0xbea7103f713e5982, ext:1534226953033, loc:(*time.Location)(0x5859e60)}}, LastTimestamp:v1.Time{Time:time.Time{wall:0xbea7103f713e5982, ext:1534226953033, loc:(*time.Location)(0x5859e60)}}, Count:1, Type:"Normal", EventTime:v1.MicroTime{Time:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, Series:(*v1.EventSeries)(nil), Action:"", Related:(*v1.ObjectReference)(nil), ReportingController:"", ReportingInstance:""}': 'Timeout: request did not complete within allowed duration' (will not retry!)
Mar 28 16:59:03 vagrant kubelet[14676]: E0328 16:59:03.692450   14676 kubelet.go:1612] Failed creating a mirror pod for "etcd-vagrant_kube-system(37936d2107e31b457cada6c2433469f1)": the server was unable to return a response in the time allotted, but may still be processing the request (post pods)
Mar 28 16:59:03 vagrant kubelet[14676]: E0328 16:59:03.848007   14676 event.go:200] Server rejected event '&v1.Event{TypeMeta:v1.TypeMeta{Kind:"", APIVersion:""}, ObjectMeta:v1.ObjectMeta{Name:"etcd-vagrant.152023ff641f915f", GenerateName:"", Namespace:"kube-system", SelfLink:"", UID:"", ResourceVersion:"", Generation:0, CreationTimestamp:v1.Time{Time:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, DeletionTimestamp:(*v1.Time)(nil), DeletionGracePeriodSeconds:(*int64)(nil), Labels:map[string]string(nil), Annotations:map[string]string(nil), OwnerReferences:[]v1.OwnerReference(nil), Initializers:(*v1.Initializers)(nil), Finalizers:[]string(nil), ClusterName:""}, InvolvedObject:v1.ObjectReference{Kind:"Pod", Namespace:"kube-system", Name:"etcd-vagrant", UID:"7278f85057e8bf5cb81c9f96d3b25320", APIVersion:"v1", ResourceVersion:"", FieldPath:"spec.containers{etcd}"}, Reason:"Killing", Message:"Killing container with id docker://etcd:Need to kill Pod", Source:v1.EventSource{Component:"kubelet", Host:"vagrant"}, FirstTimestamp:v1.Time{Time:time.Time{wall:0xbea7103f72f0ef5f, ext:1534255433999, loc:(*time.Location)(0x5859e60)}}, LastTimestamp:v1.Time{Time:time.Time{wall:0xbea7103f72f0ef5f, ext:1534255433999, loc:(*time.Location)(0x5859e60)}}, Count:1, Type:"Normal", EventTime:v1.MicroTime{Time:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}, Series:(*v1.EventSeries)(nil), Action:"", Related:(*v1.ObjectReference)(nil), ReportingController:"", ReportingInstance:""}': 'Timeout: request did not complete within allowed duration' (will not retry!)
Mar 28 16:59:14 vagrant kubelet[14676]: W0328 16:59:14.472661   14676 kubelet.go:1597] Deleting mirror pod "etcd-vagrant_kube-system(122348c3-32a6-11e8-8dc5-080027d6be16)" because it is outdated
Mar 28 16:59:14 vagrant kubelet[14676]: W0328 16:59:14.473138   14676 status_manager.go:459] Failed to get status for pod "etcd-vagrant_kube-system(37936d2107e31b457cada6c2433469f1)": Get https://10.0.2.15:6443/api/v1/namespaces/kube-system/pods/etcd-vagrant: dial tcp 10.0.2.15:6443: getsockopt: connection refused
Mar 28 16:59:14 vagrant kubelet[14676]: E0328 16:59:14.473190   14676 mirror_client.go:88] Failed deleting a mirror pod "etcd-vagrant_kube-system": Delete https://10.0.2.15:6443/api/v1/namespaces/kube-system/pods/etcd-vagrant: dial tcp 10.0.2.15:6443: getsockopt: connection refused
Mar 28 16:59:14 vagrant kubelet[14676]: E0328 16:59:14.473658   14676 kubelet.go:1612] Failed creating a mirror pod for "etcd-vagrant_kube-system(37936d2107e31b457cada6c2433469f1)": Post https://10.0.2.15:6443/api/v1/namespaces/kube-system/pods: dial tcp 10.0.2.15:6443: getsockopt: connection refused
Mar 28 16:59:15 vagrant kubelet[14676]: W0328 16:59:15.481336   14676 kubelet.go:1597] Deleting mirror pod "etcd-vagrant_kube-system(122348c3-32a6-11e8-8dc5-080027d6be16)" because it is outdated
Mar 28 16:59:15 vagrant kubelet[14676]: E0328 16:59:15.483705   14676 mirror_client.go:88] Failed deleting a mirror pod "etcd-vagrant_kube-system": Delete https://10.0.2.15:6443/api/v1/namespaces/kube-system/pods/etcd-vagrant: dial tcp 10.0.2.15:6443: getsockopt: connection refused
Mar 28 16:59:15 vagrant kubelet[14676]: E0328 16:59:15.497391   14676 kubelet.go:1612] Failed creating a mirror pod for "etcd-vagrant_kube-system(37936d2107e31b457cada6c2433469f1)": Post https://10.0.2.15:6443/api/v1/namespaces/kube-system/pods: dial tcp 10.0.2.15:6443: getsockopt: connection refused
Mar 28 17:00:34 vagrant kubelet[14676]: W0328 17:00:34.475851   14676 kubelet.go:1597] Deleting mirror pod "etcd-vagrant_kube-system(122348c3-32a6-11e8-8dc5-080027d6be16)" because it is outdated
Mar 28 17:01:07 vagrant kubelet[14676]: W0328 17:01:07.720076   14676 status_manager.go:459] Failed to get status for pod "etcd-vagrant_kube-system(37936d2107e31b457cada6c2433469f1)": Get https://10.0.2.15:6443/api/v1/namespaces/kube-system/pods/etcd-vagrant: http2: server sent GOAWAY and closed the connection; LastStreamID=47, ErrCode=NO_ERROR, debug=""
Mar 28 17:01:07 vagrant kubelet[14676]: E0328 17:01:07.720107   14676 mirror_client.go:88] Failed deleting a mirror pod "etcd-vagrant_kube-system": Delete https://10.0.2.15:6443/api/v1/namespaces/kube-system/pods/etcd-vagrant: http2: server sent GOAWAY and closed the connection; LastStreamID=47, ErrCode=NO_ERROR, debug=""; some request body already written
Mar 28 17:01:07 vagrant kubelet[14676]: E0328 17:01:07.725335   14676 kubelet.go:1612] Failed creating a mirror pod for "etcd-vagrant_kube-system(37936d2107e31b457cada6c2433469f1)": Post https://10.0.2.15:6443/api/v1/namespaces/kube-system/pods: dial tcp 10.0.2.15:6443: getsockopt: connection refused
Mar 28 17:01:07 vagrant kubelet[14676]: I0328 17:01:07.728709   14676 reconciler.go:217] operationExecutor.VerifyControllerAttachedVolume started for volume "etcd" (UniqueName: "kubernetes.io/host-path/7278f85057e8bf5cb81c9f96d3b25320-etcd") pod "etcd-vagrant" (UID: "7278f85057e8bf5cb81c9f96d3b25320")
Mar 28 17:01:07 vagrant kubelet[14676]: W0328 17:01:07.734475   14676 status_manager.go:459] Failed to get status for pod "etcd-vagrant_kube-system(37936d2107e31b457cada6c2433469f1)": Get https://10.0.2.15:6443/api/v1/namespaces/kube-system/pods/etcd-vagrant: dial tcp 10.0.2.15:6443: getsockopt: connection refused
Mar 28 17:01:07 vagrant kubelet[14676]: W0328 17:01:07.740642   14676 status_manager.go:459] Failed to get status for pod "etcd-vagrant_kube-system(7278f85057e8bf5cb81c9f96d3b25320)": Get https://10.0.2.15:6443/api/v1/namespaces/kube-system/pods/etcd-vagrant: dial tcp 10.0.2.15:6443: getsockopt: connection refused
Mar 28 17:01:09 vagrant kubelet[14676]: E0328 17:01:09.484412   14676 kuberuntime_container.go:66] Can't make a ref to pod "etcd-vagrant_kube-system(37936d2107e31b457cada6c2433469f1)", container etcd: selfLink was empty, can't make reference
Mar 28 17:01:09 vagrant kubelet[14676]: I0328 17:01:09.848794   14676 reconciler.go:191] operationExecutor.UnmountVolume started for volume "etcd-certs" (UniqueName: "kubernetes.io/host-path/37936d2107e31b457cada6c2433469f1-etcd-certs") pod "37936d2107e31b457cada6c2433469f1" (UID: "37936d2107e31b457cada6c2433469f1")
Mar 28 17:01:09 vagrant kubelet[14676]: I0328 17:01:09.849282   14676 reconciler.go:191] operationExecutor.UnmountVolume started for volume "etcd-data" (UniqueName: "kubernetes.io/host-path/37936d2107e31b457cada6c2433469f1-etcd-data") pod "37936d2107e31b457cada6c2433469f1" (UID: "37936d2107e31b457cada6c2433469f1")
Mar 28 17:01:09 vagrant kubelet[14676]: I0328 17:01:09.849571   14676 operation_generator.go:643] UnmountVolume.TearDown succeeded for volume "kubernetes.io/host-path/37936d2107e31b457cada6c2433469f1-etcd-data" (OuterVolumeSpecName: "etcd-data") pod "37936d2107e31b457cada6c2433469f1" (UID: "37936d2107e31b457cada6c2433469f1"). InnerVolumeSpecName "etcd-data". PluginName "kubernetes.io/host-path", VolumeGidValue ""
Mar 28 17:01:09 vagrant kubelet[14676]: I0328 17:01:09.849503   14676 operation_generator.go:643] UnmountVolume.TearDown succeeded for volume "kubernetes.io/host-path/37936d2107e31b457cada6c2433469f1-etcd-certs" (OuterVolumeSpecName: "etcd-certs") pod "37936d2107e31b457cada6c2433469f1" (UID: "37936d2107e31b457cada6c2433469f1"). InnerVolumeSpecName "etcd-certs". PluginName "kubernetes.io/host-path", VolumeGidValue ""
Mar 28 17:01:09 vagrant kubelet[14676]: I0328 17:01:09.949925   14676 reconciler.go:297] Volume detached for volume "etcd-certs" (UniqueName: "kubernetes.io/host-path/37936d2107e31b457cada6c2433469f1-etcd-certs") on node "vagrant" DevicePath ""
Mar 28 17:01:09 vagrant kubelet[14676]: I0328 17:01:09.949975   14676 reconciler.go:297] Volume detached for volume "etcd-data" (UniqueName: "kubernetes.io/host-path/37936d2107e31b457cada6c2433469f1-etcd-data") on node "vagrant" DevicePath ""

Текущий обходной путь - продолжать повторять попытки обновления, и в какой-то момент все будет успешно.

@stealthybox У вас случается выходить логи из докера для контейнера etcd? кроме того, grep -i etcd может маскировать часть вывода kubelet, например, некоторые сообщения об ошибках, в которых нет имени контейнера, но которые все еще актуальны.

Я только что наткнулся на еще один странный крайний случай, связанный с этой ошибкой. Обновление kubeadm пометило обновление etcd как завершенное до извлечения нового образа etcd и развертывания нового статического модуля. Это приводит к тайм-ауту обновления на более позднем этапе и сбою отката обновления. Это также оставляет кластер в нерабочем состоянии. Восстановление исходного манифеста статического модуля etcd необходимо для восстановления кластера.

О да, я тоже застрял там. мой кластер полностью отключен. Может кто-нибудь поделится инструкциями, как вылечиться из этого состояния?

Был там при моей второй попытке обновления, как описал @detiber , довольно болезненно. :плакать:

Нашел несколько резервных копий в / etc / kubernetes / tmp, чувствуя, что etcd может быть виновником, я скопировал его старый манифест поверх нового в папку манифестов. В этот момент мне нечего было терять, потому что я полностью потерял контроль над кластером. Тогда я точно не помню, но думаю, что перезапустил всю машину, а позже понизил все до версии 1.9.6. В конце концов, я получил контроль над кластером, а затем потерял всякую мотивацию снова возиться с v1.10.0. Это было совсем не весело ...

Если вы откатываете манифест статического модуля etcd с /etc/kubernetes/tmp , важно также откатить манифест apiserver до версии 1.9 из-за новой конфигурации TLS в 1.10.

^ вам, вероятно, не нужно этого делать, потому что я считаю, что обновление etcd блокирует остальную часть обновления панели управления.

Похоже, что только манифест etcd не откатывается при неудачном обновлении, все остальное в порядке. После перемещения манифеста резервной копии и перезапуска kubelet все возвращается в норму.

Я столкнулся с той же проблемой тайм-аута, и kubeadm откатил манифест kube-apiserv до 1.9.6, но оставил манифест etcd как есть (читай: с включенным TLS), что, очевидно, привело к неудачному сбою apiserv, фактически нарушив работу моего главного узла. Я полагаю, хороший кандидат для отдельного отчета о проблеме.

@dvdmuckle @codepainters , к сожалению, успешный откат зависит от того, какой компонент попадает в состояние гонки (etcd или api server). Я нашел исправление для состояния гонки, но оно полностью нарушает обновление kubeadm. Я работаю с @stealthybox, чтобы попытаться найти правильный путь для правильного исправления обновления.

@codepainters Я думаю, это та же проблема.

Есть несколько основных проблем, вызывающих эту проблему:

  • При обновлении создается хэш зеркального модуля для каждого компонента на основе результата запроса зеркального модуля из API. Затем обновление проверяет, изменяется ли это хешированное значение, чтобы определить, обновлен ли модуль на основе изменения статического манифеста. Хешированное значение включает поля, которые могут быть изменены по причинам, отличным от изменения статического манифеста (например, обновления статуса модуля). Если статус модуля изменяется между сравнениями хэшей, то обновление преждевременно будет продолжено до следующего компонента.
  • Обновление выполняет обновление статического манифеста модуля etcd (включая добавление безопасности tls в etcd) и пытается использовать apiserver для проверки того, что модуль обновлен, однако манифест apiserver на данный момент не обновлен для использования tls для связи с etcd .

В результате обновление выполняется успешно только тогда, когда происходит обновление статуса модуля для модуля etcd, которое вызывает изменение хэша до того, как кубелет получит новый статический манифест для etcd. Кроме того, сервер api должен оставаться доступным для первой части обновления apiserver, когда инструменты обновления запрашивают api перед обновлением манифеста apiserver.

Нам с @detiber позвонили, чтобы обсудить изменения, которые необходимо внести в процесс обновления.
Мы планируем реализовать 3 исправления этой ошибки в выпусках патча

  • Удалите etcd TLS из обновления.
    Текущий цикл обновления выполняет пакетные модификации каждого компонента последовательным образом.
    При обновлении компонента не известны конфигурации зависимых компонентов.
    Для проверки обновления требуется наличие APIServer для проверки статуса модуля.
    Etcd TLS требует связанного изменения конфигурации etcd + apiserver, что нарушает этот контракт.
    Это минимальное жизнеспособное изменение для устранения этой проблемы, при котором обновленные кластеры остаются небезопасными и т.д.

  • Исправьте условие гонки хэша зеркального модуля при изменении статуса модуля.
    https://github.com/kubernetes/kubernetes/blob/master/cmd/kubeadm/app/phases/upgrade/staticpods.go#L189.
    Обновления теперь будут правильными при условии совместимости флагов etcd и apiserver.

  • Обновите TLS специально на отдельном этапе.
    Etcd и APIServer необходимо обновить вместе.
    kubeadm alpha phase ensure-etcd-tls ?.
    Этот этап должен выполняться независимо от обновления кластера.
    Во время обновления кластера этот этап должен выполняться перед обновлением всех компонентов.


Для версии 1.11 мы хотим:

  • Используйте API kubelet для проверки обновленных статических модулей во время выполнения.
    Нежелательно полагаться на apiserver и etcd для мониторинга локальных процессов, как мы сейчас делаем.
    Локальный источник данных о подах лучше, чем полагаться на распределенные компоненты кубернетов более высокого порядка.
    Это заменит текущие проверки времени выполнения модуля в цикле обновления.
    Это позволит нам добавить проверки на этап sure-etcd-tls.

альтернатива: используйте CRI для получения информации о пакете (демонстрация жизнеспособна с использованием crictl ).
предостережение: CRI на dockershim и, возможно, других средах выполнения контейнеров в настоящее время не поддерживает обратную совместимость для критических изменений CRI.

ДЕЛАТЬ:

  • [] открыть и связать проблемы для этих 4 изменений.

PR для решения проблемы гонки обновлений статических модулей: https://github.com/kubernetes/kubernetes/pull/61942
PR cherry-pick для ветки release-1.10: https://github.com/kubernetes/kubernetes/pull/61954

@detiber не могли бы вы объяснить, о каком состоянии гонки мы говорим? Я не очень знаком с внутренним устройством kubeadm, но это звучит интересно.

К вашему сведению - та же проблема / проблема при обновлении с 1.9.3
Пробовал обходной путь повторной попытки несколько раз. Наконец, наступило состояние гонки с сервером API, и обновление не могло откатиться.

@stealthybox thx, я не

У меня такая же проблема .. [ОШИБКА APIServerHealth]: сервер API неисправен; / healthz не вернул "ок"
[ERROR MasterNodesReady]: не удалось получить список мастеров в кластере: получить https ....... во время обновления. Пожалуйста, помогите мне с этим. Я обновляюсь с 1.9.3 до 1.10.0. Первоначально он мог достичь определенной точки «[upgrade / staticpods] Ожидание, пока кубелет перезапустит компонент».

Временное решение - обеспечить сертификаты и обновить модули etcd и apiserver, минуя проверки.

Обязательно проверьте свою конфигурацию и добавьте все флажки для вашего варианта использования:

kubectl -n kube-system edit cm kubeadm-config  # change featureFlags
...
  featureGates: {}
...
kubeadm alpha phase certs all
kubeadm alpha phase etcd local
kubeadm alpha phase controlplane all
kubeadm alpha phase upload-config

Спасибо @stealthybox
Для меня процесс upgrade apply остановился на [upgrade/apply] Upgrading your Static Pod-hosted control plane to version "v1.10.1"... однако кластер был успешно обновлен.

@stealthybox Я не уверен, но кажется, что что-то сломалось после этих шагов, потому что после этого зависает 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] Fetching available versions to upgrade to
[upgrade/versions] Cluster version: v1.10.1
[upgrade/versions] kubeadm version: v1.10.1
[upgrade/versions] Latest stable version: v1.10.1

При применении обновления я тоже повесил [upgrade/apply] Upgrading your Static Pod-hosted control plane to version "v1.10.1"...

@kvaps @stealthybox, это, скорее всего, проблема etcd ( kubeadm говорит HTTP/2 с etcd включенным TLS), я тоже столкнулся. См. Другую проблему: https://github.com/kubernetes/kubeadm/issues/755

Честно говоря, я не могу понять, почему один и тот же TCP-порт используется как для TLS, так и для прослушивателей не-TLS etcd , это вызывает только проблемы, подобные этой. Получение простого, старого _connection отказано_ даст немедленную подсказку, здесь мне пришлось прибегнуть к tcpdump чтобы понять, что происходит.

ОЙ!
Блин, вы правы, это работает только с моим локальным патчем TLS для проверки статуса Etcd.

Сделайте это, чтобы завершить обновление:

kubeadm alpha phase controlplane all
kubeadm alpha phase upload-config

отредактировал вышеуказанный обходной путь, чтобы он был правильным

@stealthybox вторая команда kubeadm не работает:

# kubeadm alpha phase upload-config
The --config flag is mandatory

@renich просто файлу вашей конфигурации

Если вы не используете никаких пользовательских настроек, вы можете передать ему пустой файл.
Вот простой способ сделать это в bash:

1.10_kubernetes/server/bin/kubeadm alpha phase upload-config --config <(echo)

Теперь это должно быть решено путем слияния https://github.com/kubernetes/kubernetes/pull/62655 и станет частью выпуска v1.10.2.

Я могу подтвердить, что обновление 1.10.0 -> 1.10.2 с помощью kubeadm 1.10.2 прошло гладко, без таймаутов

У меня все еще есть тайм-аут на 1.10.0 -> 1.10.2, но еще один:
[upgrade/staticpods] Waiting for the kubelet to restart the component Static pod: kube-apiserver-master hash: a273591d3207fcd9e6fd0c308cc68d64 [upgrade/apply] FATAL: couldn't upgrade control plane. kubeadm has tried to recover everything into the earlier state. Errors faced: [timed out waiting for the condition]

Я не знаю, что делать ...

@ denis111 проверяет журналы сервера API при обновлении с помощью docker ps . Я чувствую, что вы можете столкнуться с проблемой, с которой столкнулся и я.

@dvdmuckle Что ж, я не вижу никаких ошибок в этих журналах, только записи, начинающиеся с I и нескольких W.
И я думаю, что хеш kube-apiserver не меняется во время обновления.

У меня есть кластер ARM64 на 1.9.3 и он успешно обновлен до 1.9.7, но возникла та же проблема тайм-аута при обновлении с 1.9.7 до 1.10.2.

Я даже пробовал редактировать и перекомпилировать kubeadm, увеличивая таймауты (например, эти последние коммиты https://github.com/anguslees/kubernetes/commit/kubeadm-gusfork) с теми же результатами.

$ sudo kubeadm upgrade apply  v1.10.2 --force
[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/version] You have chosen to change the cluster version to "v1.10.2"
[upgrade/versions] Cluster version: v1.9.7
[upgrade/versions] kubeadm version: v1.10.2-dirty
[upgrade/version] Found 1 potential version compatibility errors but skipping since the --force flag is set:

   - Specified version to upgrade to "v1.10.2" is higher than the kubeadm version "v1.10.2-dirty". Upgrade kubeadm first using the tool you used to install kubeadm
[upgrade/prepull] Will prepull images for components [kube-apiserver kube-controller-manager kube-scheduler]
[upgrade/apply] Upgrading your Static Pod-hosted control plane to version "v1.10.2"...
Static pod: kube-apiserver-kubemaster1 hash: ed7578d5bf9314188dca798386bcfb0e
Static pod: kube-controller-manager-kubemaster1 hash: e0c3f578f1c547dcf9996e1d3390c10c
Static pod: kube-scheduler-kubemaster1 hash: 52e767858f52ac4aba448b1a113884ee
[upgrade/etcd] Upgrading to TLS for etcd
Static pod: etcd-kubemaster1 hash: 413224efa82e36533ce93e30bd18e3a8
[etcd] Wrote Static Pod manifest for a local etcd instance to "/etc/kubernetes/tmp/kubeadm-upgraded-manifests346927148/etcd.yaml"
[certificates] Using the existing etcd/ca certificate and key.
[certificates] Using the existing etcd/server certificate and key.
[certificates] Using the existing etcd/peer certificate and key.
[certificates] Using the existing etcd/healthcheck-client certificate and key.
[upgrade/staticpods] Moved new manifest to "/etc/kubernetes/manifests/etcd.yaml" and backed up old manifest to "/etc/kubernetes/tmp/kubeadm-backup-manifests190581659/etcd.yaml"
[upgrade/staticpods] Not waiting for pod-hash change for component "etcd"
[upgrade/etcd] Waiting for etcd to become available
[util/etcd] Waiting 30s for initial delay
[util/etcd] Attempting to get etcd status 1/10
[util/etcd] Attempt failed with error: dial tcp 127.0.0.1:2379: getsockopt: connection refused
[util/etcd] Waiting 15s until next retry
[util/etcd] Attempting to get etcd status 2/10
[util/etcd] Attempt failed with error: dial tcp 127.0.0.1:2379: getsockopt: connection refused
[util/etcd] Waiting 15s until next retry
[util/etcd] Attempting to get etcd status 3/10
[util/etcd] Attempt failed with error: dial tcp 127.0.0.1:2379: getsockopt: connection refused
[util/etcd] Waiting 15s until next retry
[util/etcd] Attempting to get etcd status 4/10
[upgrade/staticpods] Writing new Static Pod manifests to "/etc/kubernetes/tmp/kubeadm-upgraded-manifests346927148"
[controlplane] Wrote Static Pod manifest for component kube-apiserver to "/etc/kubernetes/tmp/kubeadm-upgraded-manifests346927148/kube-apiserver.yaml"
[controlplane] Wrote Static Pod manifest for component kube-controller-manager to "/etc/kubernetes/tmp/kubeadm-upgraded-manifests346927148/kube-controller-manager.yaml"
[controlplane] Wrote Static Pod manifest for component kube-scheduler to "/etc/kubernetes/tmp/kubeadm-upgraded-manifests346927148/kube-scheduler.yaml"
[upgrade/staticpods] The etcd manifest will be restored if component "kube-apiserver" fails to upgrade
[certificates] Using the existing etcd/ca certificate and key.
[certificates] Using the existing apiserver-etcd-client certificate and key.
[upgrade/staticpods] Moved new manifest to "/etc/kubernetes/manifests/kube-apiserver.yaml" and backed up old manifest to "/etc/kubernetes/tmp/kubeadm-backup-manifests190581659/kube-apiserver.yaml"
[upgrade/staticpods] Waiting for the kubelet to restart the component
[upgrade/apply] FATAL: couldn't upgrade control plane. kubeadm has tried to recover everything into the earlier state. Errors faced: [timed out waiting for the condition]

Обновление v1.10.2 -> v1.10.2 (что может быть ерундой. Просто тестирую ...)

Ubuntu 16.04.

И это выходит из строя с ошибкой.

kubeadm upgrade apply v1.10.2

[upgrade/apply] FATAL: couldn't upgrade control plane. kubeadm has tried to recover everything into the earlier state. Errors faced: [timed out waiting for the condition]

Интересно, отслеживается ли это по какой-то проблеме ... не смог найти.

Я также вижу, что обновления по-прежнему не работают с ошибкой timed out waiting for the condition .

Изменить: обсуждение перенесено в новый тикет https://github.com/kubernetes/kubeadm/issues/850 , обсудите там.

Если у кого-то еще есть эта проблема с 1.9.x:

Если вы используете aws с настраиваемыми именами хостов, вам необходимо отредактировать конфигурационную карту kubeadm-config и установить в nodeName внутреннее имя aws: ip-xx-xx-xx-xx. $ REGION.compute.internal)

kubectl -n kube-system edit cm kubeadm-config -oyaml

Это помимо настройки клиента и т. Д. На http. Я еще не готовлю версии писем, чтобы посмотреть, исправят ли они это.

Это потому, что kubeadm пытается прочитать этот путь в api: / api / v1 / namespaces / kube-system / pods / kube-apiserver- $ NodeName

Поскольку в версии 1.10.6 тайм-аут был увеличен, пару недель назад я успешно обновил свое развертывание 1.9.7 до 1.10.6.

Планируется обновление до 1.11.2, как только будут готовы пакеты .deb, так как те же изменения есть в этой версии.

Мой кластер работает локально на платах ARM64.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги