io.k8s.api.core.v1.PodSecurityContext 中的未知字段“功能”(在容器/k8s pod 中运行 tshark)

u12*_*123 6 tshark docker kubernetes

我已经构建了一个 docker 映像,其中包含tshark(它是我将用于从 kubernetes pod 进行各种手动调试的映像)。

我已经在运行该映像的 kubernetes 中部署了一个容器。但是当我访问容器并尝试运行时,tshark我得到:

$ kubectl exec myapp-cbd49f587-w2swx -it bash
root@myapp-cbd49f587-w2swx:/# tshark -ni any -f "test.host" -w sample.pcap -F libpcap
Running as user "root" and group "root". This could be dangerous.
Capturing on 'any'
tshark: cap_set_proc() fail return: Operation not permitted
Run Code Online (Sandbox Code Playgroud)

谷歌搜索该错误:

https://www.weave.works/blog/container-capabilities-kubernetes/ https://unofficial-kubernetes.readthedocs.io/en/latest/concepts/policy/container-capabilities/

看来我需要securityContext为我的容器/吊舱配置一个。在我的 deployment.yaml 中,我添加了:

  containers:
     ...
  securityContext:
    capabilities:
      add:
        - NET_ADMIN
Run Code Online (Sandbox Code Playgroud)

但是当我应用该部署时,我得到:

error: error validating "deployment.yaml": error validating data: ValidationError(Deployment.spec.template.spec.securityContext): unknown field "capabilities" in io.k8s.api.core.v1.PodSecurityContext; if you choose to ignore these errors, turn validation off with --validate=false
Run Code Online (Sandbox Code Playgroud)

添加--validate=false删除错误,但也意味着 securityContext 被忽略。

是什么阻止我设置:

  securityContext:
    capabilities:
      add:
        - NET_ADMIN
Run Code Online (Sandbox Code Playgroud)

根据我发现的指南,这应该没问题。

我也看过(看起来不是免费的):

https://sysdig.com/blog/tracing-in-kubernetes-kubectl-capture-plugin/

所以可能正确的方法是使用类似的工具 ( ksniff ) 或设置一个 sidecar 容器。但我仍然很好奇为什么会出现上述错误。

Mar*_*ney 9

专门查看错误,您只发布了清单的一部分,通过查看此错误,我们可以看到您securityContext:与以下级别处于同一级别containers:

  containers:
     ...
  securityContext:
    capabilities:
      add:
        - NET_ADMIN
Run Code Online (Sandbox Code Playgroud)

它应该按照文档containers:中的描述

要为容器添加或删除 Linux 功能,请在容器清单capabilitiessecurityContext部分中包含该 字段。

例子:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: security-context-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: security-context-demo
  template:
    metadata:
      labels:
        app: security-context-demo
    spec:
      containers:
      - name: sec-ctx-4
        image: gcr.io/google-samples/node-hello:1.0
        securityContext:
          capabilities:
            add:
            - NET_ADMIN
Run Code Online (Sandbox Code Playgroud)

  • 检查 [Yasir](/sf/users/329260431/) 答案,它只能在容器级别。 (3认同)

小智 5

Linux 功能只能在容器级别安全上下文中添加,而不能在 Pod 级别添加。

这里并不明显,但看到有关添加功能的部分仅提到将其添加到容器中:

https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-capability-for-a-container