问题
发现Kibana页面无法打开,于是查看K8S控制台,发现Kibana挂了,显示镜像拉取失败。
解决过程
K8S控制台点击重新部署,仍然拉不起来,查看原因,依旧是镜像docker.elastic.co/kibana/kibana:7.14.0拉取失败,猜测大概率是K8S访问外部镜像源受限了。于是登上其它网络下的服务器,用docker pull这个kibana镜像,试了3台,失败两台(部分layer超时),成功一台。果断通过docker save将下载的kibana镜像输出到tar文件。内部的镜像仓库因为安全问题暂时无法使用,于是将kibana的tar文件直接传输到K8S的两个亲和节点上。
登上这两个节点,通过docker load导入kibana镜像,报无docker命令错误,和预期一致,因为记得这个部署的K8S集群运行时直接用的containerd。搜了一下containerd的客户端如何导入镜像,输入ctr -n k8s.io images import kibana.tar,这里的-n k8s.io指的是命名空间为k8s.io,因为K8S会使用这个命名空间。导入完毕后,输入ctr -n k8s.io images list | grep kibana检查一下,确认kibana镜像导入成功。
服务器上直接kubectl apply -f kibana.yaml启动kibana,没有报错。于是开心地去控制台查看kibana容器,搜了一下没找到,就在服务器上输入kubectl get pods -A | grep kibana,无返回,有点懵逼。在服务器上输入kubectl describe kibana,有kibana资源的详情信息返回,但是pod的确没有被创建。
思索一下,应该要查eck的日志,这个毕竟是通过自定义的资源创建的。输入kubectl -n elastic-system logs -f statefulset.apps/elastic-operator,报无法拉取operator镜像,心想该不会是eck operator也挂了吧,去控制台一看,果然挂了。于是去其它网络下的服务器,docker pull这个eck operator的镜像,然后重复kibana之前的流程。因为eck operator部署时是个stateful set,加上存储的亲和性,每次调度都到同一个节点,于是将镜像tar文件传送到这个固定节点上。通过ctr导入这个镜像,导入成功后,pod就直接起来了。
最后kubectl delete -f kibana.yaml删除之前部署失败的kibana,然后kubectl apply -f kibana.yaml重新部署,控制台显示部署成功,kibana的页面也能点开,完结撒花。