通过Helm部署到本地K3s的NeuVector Pod无法启动:未知容器运行时
NeuVector无法识别containerd运行时导致Pod启动失败的解决方案
问题背景
在搭载containerd的K3s实例上,通过以下Helm命令安装NeuVector:
helm repo add neuvector https://neuvector.github.io/neuvector-helm/ helm upgrade --install neuvector neuvector/core --version 2.2.4 --set tag=5.0.4 --set registry=docker.io --create-namespace --namespace neuvector
安装后controller和enforcer Pod无法正常启动,日志报错:
2023-07-06T19:45:24|MON|/usr/local/bin/monitor starts, pid=1 2023-07-06T19:45:24|MON|Start ctrl, pid=7 2023-07-06T19:45:24.035|INFO|CTL|main.main: START - version=v5.0.4 2023-07-06T19:45:24.035|INFO|CTL|main.main: - join=neuvector-svc-controller.neuvector 2023-07-06T19:45:24.035|INFO|CTL|main.main: - advertise=10.42.0.241 2023-07-06T19:45:24.035|INFO|CTL|main.main: - bind=10.42.0.241 2023-07-06T19:45:24.039|INFO|CTL|system.NewSystemTools: cgroup v2 2023-07-06T19:45:24.039|INFO|CTL|container.Connect: - endpoint= 2023-07-06T19:45:24.039|ERRO|CTL|main.main: Failed to initialize - error=Unknown container runtime 2023-07-06T19:45:24|MON|Process ctrl exit status 254, pid=7 2023-07-06T19:45:24|MON|Process ctrl exit with non-recoverable return code. Monitor Exit!! Leave the cluster Error leaving: Put "http://127.0.0.1:8500/v1/agent/leave": dial tcp 127.0.0.1:8500: connect: connection refused 2023-07-06T19:45:24|MON|Clean up. Stream closed EOF for neuvector/neuvector-controller-pod-54c7bdc784-rq9np (neuvector-controller-pod)
已确认containerd服务正常运行,但NeuVector无法识别到该运行时。
解决方案
问题根源在于K3s使用的containerd套接字路径和命名空间与标准containerd不同,需要在Helm安装时显式指定这些参数:
- 修改Helm安装命令,指定containerd运行时参数
执行以下命令重新安装NeuVector,明确指定runtime类型、套接字地址和命名空间:
helm upgrade --install neuvector neuvector/core --version 2.2.4 --set tag=5.0.4 --set registry=docker.io --create-namespace --namespace neuvector \ --set controller.runtime=containerd \ --set controller.containerd.address=unix:///run/k3s/containerd/containerd.sock \ --set controller.containerd.namespace=k8s.io \ --set enforcer.runtime=containerd \ --set enforcer.containerd.address=unix:///run/k3s/containerd/containerd.sock \ --set enforcer.containerd.namespace=k8s.io
- 验证containerd配置
确认K3s的containerd已启用CRI插件,查看配置文件:
cat /var/lib/rancher/k3s/agent/etc/containerd/config.toml
确保存在以下配置段:
[plugins."io.containerd.grpc.v1.cri"] disable_tcp_service = true enable_selinux = false enable_tls_streaming = false sandbox_image = "rancher/mirrored-pause:3.6" max_container_log_line_size = 16384
- 检查Pod挂载情况
确认NeuVector的controller和enforcer Pod已正确挂载主机的containerd套接字:
kubectl describe pod -n neuvector | grep -A5 -B5 "containerd.sock"
应看到类似如下的挂载信息:
Mounts: /run/k3s/containerd/containerd.sock from containerd-sock (ro) /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-xxxx (ro)
- 验证Pod启动状态
重新部署后,查看Pod状态:
kubectl get pods -n neuvector
待Pod进入Running状态后,检查日志确认错误消失:
kubectl logs -n neuvector <neuvector-controller-pod-name>
原因说明
K3s默认使用的containerd套接字路径为/run/k3s/containerd/containerd.sock,命名空间为k8s.io,而非标准containerd的/run/containerd/containerd.sock和moby命名空间。NeuVector默认会查找标准路径和命名空间,因此需要显式指定参数以适配K3s环境。
内容的提问来源于stack exchange,提问作者Zach Gardner
相关产品推荐
相关产品推荐

