Error: failed to create containerd container: cannot load seccomp profile, no such file or directory

Error: failed to create containerd container: cannot load seccomp profile, no such file or directory

尝试在使用 kubectl apply 时设置自定义 seccomp 配置文件,尽管文件在容器中,但 pod 不会启动并出现以下错误:

Error: failed to create containerd container: cannot load seccomp profile "/var/lib/kubelet/seccomp/custom_profile.json": open /var/lib/kubelet/seccomp/custom_profile.json: no such file or directory

K8部署YAML

...
containers:
  - name: container-name
    image: container-image:version
    securityContext:
      seccompProfile:
        type: Localhost
        localhostProfile: custom_profile.json
...

创建容器并进入 pod 的 shell 时复制文件我可以看到它确实存在(当不尝试加载它并且 pod 启动时)

Dockerfile

...
COPY custom_profile.json /var/lib/kubelet/seccomp/custom_profile.json
...

我也尝试过更改所有者 (chown) 和 运行 root 权限,但只要 localhostProfile: custom_profile.json 行在 YAML 中,就会再次出现相同的错误。

我错过了什么阻止找到文件? YAML 中缺少某些内容,container/dockerfile?

中缺少某些内容

以下文章让我走到这一步,但仍然无法设置配置文件:https://docs.openshift.com/container-platform/4.8/security/seccomp-profiles.html

如果使用 type: Localhost seccomp 配置文件,则 seccomp 配置文件必须存在于调度 pod 的节点上。另外,路径是相对于路径/var/lib/kubelet/seccomp。这里 /var/lib/kubelet/kubelet 配置的默认路径。

这是来自官方的相关片段 documentation:

localhost/<path> - Specify a profile as a file on the node located at <seccomp_root>/, where <seccomp_root> is defined via the --seccomp-profile-root flag on the Kubelet. If the --seccomp-profile-root flag is not defined, the default path will be used, which is /seccomp where is specified by the --root-dir flag.

Example-1:要使以下内容正常工作,custom_profile.json 文件必须存在于节点上的 /var/lib/kubelet/seccomp 路径中。

securityContext:
  seccompProfile:
    type: Localhost
    localhostProfile: custom_profile.json

Example-2:要使以下内容正常工作,custom_profile.json 文件必须存在于节点上的 /var/lib/kubelet/seccomp/profiles 路径中。

securityContext:
  seccompProfile:
    type: Localhost
    localhostProfile: profiles/custom_profile.json

这是一个最小的工作示例:

seccomp 个配置文件被复制到工作节点上。

ps@worker-node:~$ sudo ls -lrt /var/lib/kubelet/seccomp/profiles
[sudo] password for ps:
total 12
-rw-r--r-- 1 root root   39 Sep 10 13:54 audit.json
-rw-r--r-- 1 root root   41 Sep 10 13:54 violation.json
-rw-r--r-- 1 root root 1657 Sep 10 13:54 fine-grained.json
ps@worker-node:~$

使用以下路径创建pod,注意路径是相对于/var/lib/kubelet/seccomp.

apiVersion: v1
kind: Pod
metadata:
  name: audit-pod
  labels:
    app: audit-pod
spec:
  securityContext:
    seccompProfile:
      type: Localhost
      localhostProfile: profiles/audit.json
  containers:
  - name: test-container
    image: nginx
    securityContext:
      allowPrivilegeEscalation: false