# Volcano调度器插件升级后，Volcano Job（vcjob）资源无法正常运行
#### 问题现象
Volcano调度器插件由1.4.7及以下版本升级到1.4.7以后版本时，出现新建的vcjob资源无法正常运行的现象。同时，API Server日志报错信息和volcano-admission组件报错信息分别如下。
API Server的日志报错信息：
```
...
W0318 14:57:51.376736      13 dispatcher.go:142] Failed calling webhook, failing open validatejob.volcano.sh: failed calling webhook "validatejob.volcano.sh": failed to call webhook: Post "https://volcano-admission-service.kube-system.svc:443/jobs/validate?timeout=30s": EOF 
E0318 14:57:51.376768      13 dispatcher.go:149] failed calling webhook "validatejob.volcano.sh": failed to call webhook: Post "https://volcano-admission-service.kube-system.svc:443/jobs/validate?timeout=30s": EOF
...
```
volcano-admission组件报错信息：
```
... no kind "AdmissionReview" is registered for version "admission.k8s.io/v1beta1" ...
```
#### 问题原因
主要原因在于新旧版本的"webhooks.admissionReviewVersions"字段信息不兼容。
在旧版本（1.4.7及以下）中，MutatingWebhookConfiguration和ValidatingWebhookConfiguration资源对象的webhooks.admissionReviewVersions字段值为"v1beta1"，而在新版本（1.4.7以上）中，该字段的值为"v1"。在升级插件时，如果使用了高可用模式，当扩容volcano-admission的副本数时，旧版本的ReplicaSet会启动一个旧版本的"Pod"。如果该Pod未及时销毁，它将强制覆盖MutatingWebhookConfiguration和ValidatingWebhookConfiguration资源中的配置，将"webhooks.admissionReviewVersions"字段重置为"v1beta1"。此时，Kubernetes无法识别该字段信息，从而导致创建的vcjob资源无法正常运行。
具体的MutatingWebhookConfiguration和ValidatingWebhookConfiguration资源对象请参见[表1]。
 表1涉及的资源对象 
| 资源类型                           | 资源名称                                          |
|:---|:---|
| MutatingWebhookConfiguration   | volcano-admission-service-jobs-mutate        |
| MutatingWebhookConfiguration   | volcano-admission-service-podgroups-mutate |
| MutatingWebhookConfiguration   | volcano-admission-service-queues-mutate     |
| MutatingWebhookConfiguration   | volcano-admission-service-pods-mutate        |
| ValidatingWebhookConfiguration | volcano-admission-service-jobs-validate      |
| ValidatingWebhookConfiguration | volcano-admission-service-pods-validate      |
| ValidatingWebhookConfiguration | volcano-admission-service-queues-validate    |
   
#### 解决方法
请将下列资源对象的"webhooks.admissionReviewVersions"字段信息由"v1beta1"修改为"v1"后，再尝试重新创建vcjob资源。
1. 请依次执行**kubectl edit** 命令，依次修改[表1]中字段信息。以"volcano-admission-service-jobs-mutate"为例，介绍如何修改"webhooks.admissionReviewVersions"字段信息。
   
   执行以下命令，修改"volcano-admission-service-jobs-mutate"的Yaml文件。
   ```
   kubectl edit MutatingWebhookConfiguration volcano-admission-service-jobs-mutate
   ```
   在Yaml中，按**i键** 编辑文件内容，将"webhooks.admissionReviewVersions"由"v1beta1"修改为"v1"。
   ```
   apiVersion: admissionregistration.k8s.io/v1
   kind: MutatingWebhookConfiguration
   metadata:
     annotations:
       meta.helm.sh/release-name: cceaddon-volcano
       meta.helm.sh/release-namespace: kube-system
     creationTimestamp: "2025-02-25T08:11:52Z"
     generation: 2
     labels:
       app.kubernetes.io/managed-by: Helm
       release: cceaddon-volcano
     name: volcano-admission-service-jobs-mutate
     resourceVersion: "252406"
     uid: 7e9bdaaf-1b6c-4975-a171-ada8456c12e5
   webhooks:
   - admissionReviewVersions:
     - v1beta1   # 将该内容修改为v1
    ...
   ```
   修改完成后，按**Esc键** 退出编辑，输入**:wq**保存。
   
   
2. [表1]中对象的"webhooks.admissionReviewVersions"字段都修改完成后完成，执行以下命令删除未成功运行的vcjob资源。
   
   ```
   kubectl delete vcjob -n namespace vcjob_name
   ```
   回显结果如下：
   ```
   vcjob vcjob_name deleted
   ```
   
   
3. 执行以下命令，重新创建vcjob资源。 
   ```
   kubectl create -f vcjob.yaml   # 请替换为创建vcjob资源的YAML文件
   ```
   回显结果如下：
   ```
   job.batch.volcano.sh/vcjob_name created
   ```
   
   
4. 执行以下命令，查看vcjob资源是否成功创建。 
   ```
   kubectl get vcjob_name -n namespace
   ```
   回显结果如下，当STATUS为Running时，则说明vcjob资源创建成功。
   ```
   NAME         STATUS    MINAVAILABLE   RUNNINGS   AGE
   vcjob_name   Running   1                         2m30s
   ```
   
   
 
#### 问题规避措施
在插件升级之前，您可以通过以下措施对以上问题进行规避：
- 从Volcano调度器插件版本≤1.4.7升级到版本\>1.4.7且≤1.13.7：在"升级插件"页面，请先将"插件规格"设置为"系统预置规格 \> 单实例"或"自定义规格 \> 实例数设置1"，然后进行升级。插件升级完成后，在"插件中心"中找到"Volcano调度器"插件，单击"编辑"。在"编辑插件"页面，将"插件规格"修改为所需规格即可。
- 从Volcano调度器插件版本≤1.4.7升级到版本\>1.13.7：在"升级插件"页面，请先将"插件规格"切换至"自定义规格 "，并将"volcano-admission"组件的副本数设置为1，然后进行升级。插件升级完成后，在"插件中心"中找到"Volcano调度器"插件，单击"编辑"。在"编辑插件"页面，将"插件规格"修改为所需规格即可。
 
