CDI - Containerized-Data-Importer 是Kubevirt 提供的 K8s 插件,用声明式的方式来给 Kubevirt 虚拟机 通过 PVC 构建磁盘。
CDI 目前在高速的进行功能迭代,所以经常会在一个集群遇到升级降级的问题
安装
YAML
Copy
// 升级降级版本
export VERSION=$(basename $(curl -s -w %{redirect_url} https://github.com/kubevirt/containerized-data-importer/releases/latest))
kubectl create -f https://github.com/kubevirt/containerized-data-importer/releases/download/$VERSION/cdi-operator.yaml
kubectl create -f https://github.com/kubevirt/containerized-data-importer/releases/download/$VERSION/cdi-cr.yaml
CDI 成功运行的标识是下面几个 service 都成功 running, CDI 使用 Operator Deployment 去创建和管理另外三个 Deployment
YAML
Copy
root@qvm-wz-dora1:~/ror/raw# k get pods -n cdi
NAME READY STATUS RESTARTS AGE
cdi-apiserver-767f756476-fxw85 1/1 Running 0 108s
cdi-deployment-59d7db5c97-ktrvj 1/1 Running 0 95s
cdi-operator-7dd7d8f4f5-d87vn 1/1 Running 0 2m33s
cdi-uploadproxy-85474c576b-qnxcd 1/1 Running 0 2m
如果升级过程中出现下面这种情况,只有 operator 被创建出来,但是其它的 apiserver、deployment、uploadproxy Deployment 没有被创建出来
YAML
Copy
k get pods -n cdi
NAME READY STATUS RESTARTS AGE
cdi-operator-cf56cbf6f-4jgnh 1/1 Running 0 2m2s
可以尝试 删除 oeprator,让 operator 再次尝试创建
如果还是不行可以尝试清理干净 cdi namespace 下的所有资源,在 apply operator。因为升级版本可能导致存在冲突的资源,导致升级后有问题。
清理残留资源
查看 xxx NAMESPACE 残留资源
kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get --show-kind --ignore-not-found -n xxx
YAML
Copy
// 删除残留资源
k delete crd cdis.cdi.kubevirt.io
k delete cdi cdi
k delete ns cdi
为什么需要先删除 cdi 的原因有两个 一个是因为 cdi 资源的存在会导致 namespace cdi 删除不掉
另外一个原因是由于错误状态的 crd cdi 会导致 cdi-operator 去创建其它 Deployment 服务失败
但是 删除 crd cdis.cdi.kubevirt.io 会导致集群中的 DataVolume 被删除,不适合在生产环境使用
Debug
证书问题
cdi certificate has expired or is not yet valid
x509: certificate has expired when calling
删除相关的 secret 和 pod 会进行 secret 的重新生成
删除 cdi 报错
k delete cdi cdi 报错 validate 失败
这个时候需要删除相关的验证 webhook
kubectl get validatingwebhookconfigurations
kubectl delete validatingwebhookconfiguration <name>