Skip to content

TKE 拉取 elasticsearch 镜像失败

🏷️ TKE Docker Elasticsearch

在 TKE 集群重启 elasticsearch 服务时,拉取镜像失败,导致服务一直处于 Pending 状态。

Elasticsearch 镜像版本为 docker.elastic.co/elasticsearch/elasticsearch:7.13.3

登录到 Pod 所在的云服务器执行 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.13.3,显示的下载进度条会卡在某个百分比,然后就不动了。

估计是镜像太大,另外国内访问 docker 默认仓库可能也比较慢,最后导致拉取超时了。

在 Deployment 的事件中,也可以看到拉取镜像超时的错误,最后导致 Pod 一直处于 Pending 的状态。

更令人恼火的是,这个处于 Pending 状态的 Pod 一直无法关闭,点击重新部署没有任何效果。

这种情况应该可以通过 kubectl delete 命令删除 Pod,但是 TKE 开启 APIServer 需要创建 CLB。这种 CLB 费用的大头是实例费用(一年要 1752 元),仅仅为了删除一个 Pod 有些太浪费了。

最后只能通过将 Pod 数量缩减到 0,然后等 TKE 自动删除 Pod,再扩容回去。具体等了多久没注意,大概有一二十分钟。

至于镜像的拉取,项目本身打包的镜像是上传到 Coding 提供的镜像仓库的,既然直接拉取官方仓库比较慢,就干脆自己上传到 Coding 的镜像仓库。

首先要现在本地把镜像 pull 下来。虽然有些慢,但并不会像在 TKE 中一样卡住不动。

powershell
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.13.3

pull 下来之后发现这个镜像确实比较大,通过 docker images 查看结果如下。

powershell
PS C:\WINDOWS\System32\WindowsPowerShell\v1.0> docker images
REPOSITORY                                      TAG      IMAGE ID       CREATED      SIZE
docker.elastic.co/elasticsearch/elasticsearch   7.13.3   84840c8322fe   2 years ago  1.02GB

之后打开 Coding 的制品仓库页面,首页上提供了操作指引按钮,点击可以看到一个上传镜像的命令生成页面。

如果本地没有配置过凭据,需要先执行 docker login 命令(详见操作指引中的【配置凭据】标签)。

powershell
docker login -u {username} -p {password} {docker-repository-domain}

上面 {} 中的值在操作指引页面上输入用户密码后会自动生成。下同。

之后在【推送】标签页面输入本地镜像 Tag、制品名称和制品版本,会生成对应的 docker 命令。

1. 给本地镜像打标签

powershell
docker tag docker.elastic.co/elasticsearch/elasticsearch:7.13.3 {company-name}-docker.pkg.coding.net/{project-name}/{docker-repository-name}/elasticsearch:7.13.3

第二个标签就是 Coding 仓库的镜像地址。

2. 推送镜像到 Coding 仓库

powershell
docker push {company-name}-docker.pkg.coding.net/{project-name}/{docker-repository-name}/elasticsearch:7.13.3

最后在 TKE 集群中,修改 Deployment 的镜像地址为 Coding 仓库的镜像地址,之后拉取镜像就快多了。