先说结论,问题原因是系统默认拉取的是k8s.gcr.io的镜像,而该网址国内无法访问,所以最简单的方式是科学上网,没有条件的可以继续看下去。

错误介绍

官方默认禁用了docker的iptablesbridge,虽然可以通过指定配置文件的方式来避免这些限制,但是升级系统的时候还是会恢复到原先的配置,每次都要重新指定,也比较麻烦。故萌生了使用官方提供的k8s的方式来创建应用。

官方提供的app非常少,好在有第三方提供的模板可供使用,地址:02 - Adding TrueCharts to SCALE - TrueCharts

但是在尝试创建应用时,却一直卡在DEPLOYING状态,点击后点开Application Events,提示waiting for a volume to be created, either by external provisioner "zfs.csi.openebs.io" or manually created by system administrator。由于没接触过k8s,只能网上搜索该错误提示。

image-20211016232057855

有人说是因为权限问题,选择给ix-applications目录赋予777权限,完全没有解决。

定位问题

仔细查看出错提示,猜测问题可能出在zfs.csi.openebs.io。查询openebs的官方文档:OpenEBS Documentation | OpenEBS Docs,进入ZFS Local PV分页,在README中发现使用kubectl get pods -n kube-system -l role=openebs-zfs可以查看ZFS驱动的运行状态(注意在TrueNAS中需要使用k3s运行该命令,即k3s kubectl get ...)。输出:

NAME                       READY   STATUS             RESTARTS   AGE
openebs-zfs-node-wqn2v 1/2 ImagePullBackOff 0 7h43m
openebs-zfs-controller-0 1/5 ImagePullBackOff 0 7h43m

很明显驱动没有正常运行,查询ImagePullBackOff错误提示,得知是镜像拉取失败。运行k3s kubectl describe pod openebs-zfs-controller-0 -n kube-system查看pod的状态,主要看Events部分的输出:

Events:
Type Reason Age From Message
Warning Failed 48m (x12 over 7h23m) kubelet Failed to pull image "k8s.gcr.io/sig-storage/snapshot-controller:v4.0.0": rpc error: code = Unknown desc = Error response from daemon: Get "https://k8s.gcr.io/v2/": context deadline exceeded
Warning Failed 43m (x151 over 7h29m) kubelet (combined from similar events): Failed to pull image "k8s.gcr.io/sig-storage/csi-snapshotter:v4.0.0": rpc error: code = Unknown desc = Error response from daemon: Get "https://k8s.gcr.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
Normal Pulling 38m (x72 over 7h39m) kubelet Pulling image "k8s.gcr.io/sig-storage/csi-resizer:v1.1.0"
Normal BackOff 3m33s (x1396 over 7h33m) kubelet Back-off pulling image "k8s.gcr.io/sig-storage/csi-resizer:v1.1.0"

可以看出,系统想要从k8s.gcr.io拉取镜像,而该站无法访问,所以拉取失败。

解决方法

搜索该问题,发现可以通过国内镜像仓库手动拉取后,修改tag来标记为gcr.io的镜像。国内可以使用阿里云的镜像站:registry.aliyuncs.com/google_containers

当前系统版本为TrueNAS-SCALE-21.08-BETA.2,下面所列出的镜像版本可能随着系统的变更会有变化,还是以实际情况为准。

  1. 首先通过前述的describe pod命令查看有哪些镜像需要拉取,主要有:csi-resizer:v1.1.0csi-snapshotter:v4.0.0snapshot-controller:v4.0.0csi-provisioner:v2.1.0csi-node-driver-registrar:v2.1.0

  2. 手动拉取并标记

    docker pull registry.aliyuncs.com/google_containers/csi-resizer:v1.1.0
    # 注意空格
    docker tag registry.aliyuncs.com/google_containers/csi-resizer:v1.1.0 k8s.gcr.io/sig-storage/csi-resizer:v1.1.0
  3. 删除国内镜像的标记(可选)

    docker rmi registry.aliyuncs.com/google_containers/csi-resizer:v1.1.0
  4. 重复2、3两步,将所有需要的镜像都手动拉取下来

  5. 查看驱动安装状态,应该显示Running状态,此时就可以正常安装app了

为了方便,给出所有的拉取、标记、删除镜像的命令

docker pull registry.aliyuncs.com/google_containers/csi-resizer:v1.1.0
docker tag registry.aliyuncs.com/google_containers/csi-resizer:v1.1.0 k8s.gcr.io/sig-storage/csi-resizer:v1.1.0
docker rmi registry.aliyuncs.com/google_containers/csi-resizer:v1.1.0
docker pull registry.aliyuncs.com/google_containers/csi-snapshotter:v4.0.0
docker tag registry.aliyuncs.com/google_containers/csi-snapshotter:v4.0.0 k8s.gcr.io/sig-storage/csi-snapshotter:v4.0.0
docker rmi registry.aliyuncs.com/google_containers/csi-snapshotter:v4.0.0
docker pull registry.aliyuncs.com/google_containers/snapshot-controller:v4.0.0
docker tag registry.aliyuncs.com/google_containers/snapshot-controller:v4.0.0 k8s.gcr.io/sig-storage/snapshot-controller:v4.0.0
docker rmi registry.aliyuncs.com/google_containers/snapshot-controller:v4.0.0
docker pull registry.aliyuncs.com/google_containers/csi-provisioner:v2.1.0
docker tag registry.aliyuncs.com/google_containers/csi-provisioner:v2.1.0 k8s.gcr.io/sig-storage/csi-provisioner:v2.1.0
docker rmi registry.aliyuncs.com/google_containers/csi-provisioner:v2.1.0
docker pull registry.aliyuncs.com/google_containers/csi-node-driver-registrar:v2.1.0
docker tag registry.aliyuncs.com/google_containers/csi-node-driver-registrar:v2.1.0 k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.1.0
docker rmi registry.aliyuncs.com/google_containers/csi-node-driver-registrar:v2.1.0

参考

  1. 无法直接在国内网络环境下从k8s.gcr.io下载镜像问题 - 散尽浮华 - 博客园 (cnblogs.com)