机器重启后 ICP 启动失败

ICP fails to start after machine reboot

我已将 ICP V2.1 安装到 RHEL VMWare 映像中。重启映像后,ICP 无法启动,这似乎是文档中的第一个已知问题(Kubernetes 控制器管理器在主节点或集群重启后无法启动)。但是,规定的分辨率无法让我的系统正常运行。

这是 运行 播客列表:

NAME READY STATUS RESTARTS AGE 印花布节点-amd64-dtl47 2/2 运行 14 20h filebeat-ds-amd64-mvcsj 1/1 运行 8 20h k8s-etcd-192.168.232.131 1/1 运行 7 20h k8s-mariadb-192.168.232.131 1/1 运行 7 20h k8s-master-192.168.232.131 2/3 CrashLoopBackOff 15 17m k8s-proxy-192.168.232.131 1/1 运行 7 20h 计量-reader-amd64-gkwt4 1/1 运行 7 20h 监控-prometheus-nodeexporter-amd64-sghrv 1/1 运行 7 20h

删除 k8s-master-192.168.232.131 pod 并允许它重新启动只会让它回到 CrashLoopBackOff 状态。这是控制器管理器日志中最后一行的样子:

F1029 23:55:07.345341 1 controllermanager.go:176] 构建控制器上下文时出错:无法从服务器获取支持的资源:无法检索服务器 API 的完整列表:servicecatalog.k8s。io/v1alpha1: 服务器上的错误 ("Error: 'dial tcp 10.0.0.145:443: getsockopt: connection refused'\nTrying to reach: 'https://10.0.0.145:443/apis/servicecatalog.k8s.io/v1alpha1'") 已阻止请求成功

删除 pod 或直接删除故障控制器主 docker 容器没有任何效果。似乎另一项服务尚未启动,或未能启动。我等了几个小时想看看问题是否自行解决,但无济于事。

谢谢...

之前 https://github.com/kubernetes/kubernetes/pull/49495, kuberentes controller manager failed to start if an registered extension-apiserver 的修复还没有准备好。在 ICP 中,服务目录被实现为 extension-apiserver。

通常在ICP master重启后,kubelet会先启动k8s管理服务作为static pod。之后会从kubernetes api服务器获取pods/nodes/service信息,然后启动所有pods包括catalogapi服务。对于那种情况,整个集群都被恢复了。

但是对于你的情况,存在一个竞争条件,当 kubelet 从 kuberentes api 服务器获取 pods 信息并启动所有 pods 时,它没有获取节点信息来自 kubernetes api 服务器。结果,由于未满足 nodeSelector,kubelet 无法启动目录 api 服务。整个集群无法恢复。

在ICP 2.1.0.1 的下一版本中,kuberentes 将升级到1.8.2 并修复https://github.com/kubernetes/kubernetes/pull/49495。问题将得到彻底解决。

在此之前,您可以尝试以下解决方法。

Use the -s flag form of the kubectl command if your token has expired after restart and you no longer have access to the GUI to re-establish it.

  1. 删除v1alpha1.servicecatalog的api服务。k8s.io

    kubectl delete apiservices v1alpha1.servicecatalog.k8s.io

    kubectl -s 127.0.0.1:8888 delete apiservices v1alpha1.servicecatalog.k8s.io

  2. 删除死掉的控制器管理器

    docker rm <k8s controller manager>

  3. 等待服务目录启动

  4. 通过重新注册v1alpha1.servicecatalog的api服务恢复服务目录api服务。k8s.io

    kubectl apply -f cluster/cfc-components/service-catalog/apiregistration.yaml

    kubectl -s 127.0.0.1:8888 apply -f cluster/cfc-components/service-catalog/apiregistration.yaml