Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "41b6df943a3e6c7c3bc417a52593e0b8f04ed044e47c67998b222ecfa28b37bf" network for pod "harbor-database-0": networkPlugin cni failed to set up pod "harbor-database-0_harbor" network: RPC failed; request ip return 500, route is not ready for pod harbor/harbor-database-0 provider ovn, please see kube-ovn-controller logs to find errors
时间: 2025-08-04 10:34:25 浏览: 17
<think>我们正在解决两个问题:1. PersistentVolumeClaim不可变配置导致的安装失败;2. CNI网络设置失败。
根据用户提供的引用和上下文,我们之前配置Harbor时使用了NFS存储类,现在遇到PVC不可变错误和CNI网络问题。
问题分析:
1. PVC不可变错误:在Kubernetes中,PVC一旦创建,其部分字段(如storageClassName、accessModes、resources.requests.storage等)是不可变的。如果Helm升级时尝试修改这些字段,就会报错。
2. CNI网络设置失败:可能是由于集群网络插件(如Calico、Flannel)未正确安装或配置导致。
解决方案:
第一部分:解决PVC不可变错误
方法1:删除旧PVC(确保数据已备份)并重新创建
- 步骤:
1. 备份原有数据(如果重要)
2. 删除旧PVC:`kubectl delete pvc <pvc-name> -n <namespace>`
3. 修改Helm values.yaml中的PVC配置(如调整storageClassName或size)
4. 重新运行Helm upgrade
方法2:通过修改PVC的保留策略(resourcePolicy)为keep,然后手动管理PVC(不推荐,因为无法修改PVC配置)
方法3:如果只是需要扩容,可以使用Kubernetes的PVC扩容功能(需要StorageClass支持扩容)
- 步骤:
1. 确保StorageClass的`allowVolumeExpansion`设置为true(如之前配置的nfs-volume)
2. 修改PVC的存储大小:直接编辑PVC的`spec.resources.requests.storage`字段(例如:`kubectl edit pvc <pvc-name> -n <namespace>`,将50Gi改为更大的值)
3. 注意:扩容只能增大,不能减小。
第二部分:解决CNI网络设置失败
根据引用[3],我们配置了kubeconfig,但是CNI网络插件(如Calico、Flannel)可能未安装或配置错误。
- 步骤:
1. 检查节点状态:`kubectl get nodes`,如果NotReady,可能是CNI问题。
2. 检查kube-system命名空间中的Pod:`kubectl get pods -n kube-system`,查看网络插件Pod是否运行正常。
3. 如果未安装网络插件,需要安装一个(例如Calico):
- 参考:https://docs.projectcalico.org/getting-started/kubernetes/quickstart
- 安装命令(对于kubeadm):
```bash
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
```
4. 如果已安装但未运行,查看日志:`kubectl logs <pod-name> -n kube-system`。
结合用户之前配置Harbor的上下文,我们给出具体步骤:
详细步骤:
步骤1:解决PVC不可变错误(假设我们要修改PVC的配置,比如大小或存储类)
- 备份Harbor数据(重要!)
- 卸载Harbor(保留PVC):
helm uninstall harbor -n harbor
- 删除原有的PVC(因为不可变,我们删除后重新创建):
kubectl delete pvc -n harbor --all # 或者只删除registry的PVC
- 修改values.yaml(调整PVC配置,如将size从50Gi改为100Gi)
- 重新安装:
helm install harbor harbor/harbor -f harbor-values.yaml -n harbor
步骤2:如果不想删除数据,且只是需要扩容,则使用扩容方法(前提:StorageClass支持扩容):
- 编辑PVC:`kubectl edit pvc harbor-registry -n harbor`
- 修改`spec.resources.requests.storage`为更大的值(例如100Gi)
- 等待PVC扩容完成(可能需要底层存储支持)
- 如果文件系统也需要扩容,可能需要进入Pod执行扩容命令(如xfs_growfs或resize2fs)
步骤3:解决CNI网络问题
- 安装Calico网络插件(如果集群未安装):
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
- 等待Calico Pod运行:`kubectl get pods -n kube-system -w`
- 检查节点状态:`kubectl get nodes`,应显示Ready。
注意:如果集群已经安装网络插件,但节点仍不可用,需要检查网络插件日志。
针对用户的问题,我们给出一个综合的解决方案:
1. 首先处理PVC问题(假设用户需要修改PVC配置):
- 备份数据(使用velero或手动备份)
- 卸载Harbor(保留PVC):
helm uninstall harbor -n harbor
- 删除PVC(因为不可变,无法修改):
kubectl delete pvc harbor-registry -n harbor # 根据实际PVC名称
- 修改values.yaml中的PVC配置(如大小、存储类)
- 重新安装Harbor
2. 然后处理CNI问题:
- 安装Calico网络插件(如果未安装):
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
- 等待网络插件就绪
3. 验证:
- 检查节点状态:`kubectl get nodes`
- 检查Harbor Pod:`kubectl get pods -n harbor`
如果用户遇到其他CNI问题(如端口冲突),需要根据具体日志调整。
生成的相关问题:
1. 如何在不删除PVC的情况下修改Kubernetes中的存储配置?
2. 如何备份和恢复Harbor中的数据?
3. Kubernetes中常见的CNI插件有哪些?如何选择?
4. 如何诊断和解决Kubernetes节点NotReady问题?
注意:在操作前务必备份数据,特别是生产环境。</think>### 解决 Harbor 部署中的 PVC 不可变错误与 CNI 网络问题
#### 问题分析
1. **PVC 不可变错误**
Kubernetes 中 PVC 创建后,`storageClassName`、`accessModes` 等字段不可修改[^1]。当 Helm 升级时尝试修改这些字段会导致:
```bash
cannot patch PVC: field is immutable
```
2. **CNI 网络设置失败**
通常表现为节点处于 `NotReady` 状态,或 Pod 网络通信异常,常见原因:
- 网络插件未正确安装
- `kubeconfig` 配置错误(引用[3])
- 端口冲突(如 Calico 默认使用 179/BGP)
---
### 解决方案
#### 第一阶段:解决 PVC 不可变错误
**方法1:删除重建 PVC(推荐)**
```bash
# 1. 备份数据(重要!)
kubectl scale deployment harbor-registry --replicas=0 -n harbor
cp -r /nfs/harbor-data /backup/harbor-data
# 2. 删除旧PVC
kubectl delete pvc harbor-registry-pvc -n harbor
# 3. 修改 values.yaml 配置
persistentVolumeClaim:
registry:
storageClass: "nfs-volume" # 确保与之前一致
size: 100Gi # 可在此调整大小
accessMode: ReadWriteOnce
# 4. 重新部署
helm upgrade harbor harbor/harbor -f values.yaml -n harbor
```
**方法2:通过 StorageClass 动态扩容(需支持扩容)**
```bash
# 1. 确认 StorageClass 支持扩容
kubectl get storageclass nfs-volume -o jsonpath='{.allowVolumeExpansion}'
# 2. 直接修改 PVC 大小(K8s 1.16+)
kubectl patch pvc harbor-registry-pvc -n harbor -p '{"spec":{"resources":{"requests":{"storage":"100Gi"}}}}'
```
> **关键配置**:在 StorageClass 中设置 `allowVolumeExpansion: true`(引用[1]):
> ```yaml
> apiVersion: storage.k8s.io/v1
> kind: StorageClass
> metadata:
> name: nfs-volume
> provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
> allowVolumeExpansion: true # 必须开启
> ```
---
#### 第二阶段:解决 CNI 网络问题
**步骤1:验证基础配置**
```bash
# 检查 kubeconfig 配置(引用[3])
cat ~/.kube/config | grep server
# 正确应显示 APIServer 地址
# 检查节点状态
kubectl get nodes -o wide
```
**步骤2:安装/修复 CNI 插件(以 Calico 为例)**
```bash
# 1. 应用 Calico 清单
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
# 2. 检查 Pod 状态
kubectl get pods -n kube-system -l k8s-app=calico-node
# 3. 若端口冲突,修改 Calico 配置
kubectl edit daemonset calico-node -n kube-system
# 搜索 179 并修改 BGP 端口
```
> **网络选择建议**:
> - 公有云:使用云厂商 CNI(如 AWS VPC CNI)
> - 本地集群:Calico 或 Flannel
> - 多网络需求:Multus CNI(引用[2])
**步骤3:验证网络功能**
```bash
# 创建测试 Pod
kubectl run testnet --image=alpine -- sleep 3600
# 跨节点 ping 测试
kubectl exec testnet -- ping <其他节点IP>
```
---
### 完整操作流程
```mermaid
graph TD
A[开始] --> B[备份Harbor数据]
B --> C{选择PVC解决方案}
C -->|修改配置| D[删除重建PVC]
C -->|在线扩容| E[修改PVC size]
D & E --> F[验证PVC状态]
F --> G{检查CNI状态}
G -->|正常| H[部署Harbor]
G -->|异常| I[安装/修复CNI]
I --> H
H --> J[验证服务]
```
---
### 验证部署成功
```bash
# 检查所有Pod状态
kubectl get pods -n harbor -o wide
# 测试镜像推送(需配置DNS或hosts)
docker login harbor.yourdomain.com
docker push harbor.yourdomain.com/library/nginx:test
# 检查网络连通性
kubectl exec -it harbor-registry-pod -n harbor -- curl -I https://core.harbor.domain
```
> **避坑指南**:
> 1. 始终在 Helm 升级前备份:`velero backup create harbor-backup --include-namespaces harbor`
> 2. 避免修改 PVC 的 `storageClassName` 和 `accessModes`
> 3. CNI 插件需与 Kubernetes 版本兼容([Calico 版本矩阵](https://projectcalico.docs.tigera.io/getting-started/kubernetes/requirements))
阅读全文
相关推荐




















