io.k8s.api.core.v1.PodSecurityContext 中的未知字段 "capabilities"(container/k8s pod 中的 运行 tshark)
unknown field "capabilities" in io.k8s.api.core.v1.PodSecurityContext (running tshark in a container/k8s pod)
我构建了一个包含 tshark
的 docker 图像(我将使用该图像从 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
谷歌搜索该错误:
https://www.weave.works/blog/container-capabilities-kubernetes/
https://unofficial-kubernetes.readthedocs.io/en/latest/concepts/policy/container-capabilities/
看来我需要为我的 container/pod 配置一个 securityContext
。在我的 deployment.yaml 中,我添加了:
containers:
...
securityContext:
capabilities:
add:
- NET_ADMIN
但是当我应用该部署时,我得到:
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
添加 --validate=false
可消除错误,但也意味着 securityContext 将被忽略。
什么阻止我设置:
securityContext:
capabilities:
add:
- NET_ADMIN
根据指南,我发现这应该没问题。
我也看过(好像是非免费的):
https://sysdig.com/blog/tracing-in-kubernetes-kubectl-capture-plugin/
所以可能正确的方法是使用类似的工具(ksniff) or setup a sidecar container。但我仍然很好奇为什么会出现上述错误。
具体查看错误,您只发布了清单的一部分,我们可以看到您将 securityContext:
与 containers:
:
放在同一级别
containers:
...
securityContext:
capabilities:
add:
- NET_ADMIN
它应该在 containers:
下,如 documentation 中所写:
To add or remove Linux capabilities for a Container, include the
capabilities
field in the securityContext
section of the Container
manifest.
示例:
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
Linux 功能只能在容器级别安全上下文中添加,不能在 pod 级别添加。
这里不明显,但是看到添加功能部分只提到将其添加到容器中:
我构建了一个包含 tshark
的 docker 图像(我将使用该图像从 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
谷歌搜索该错误:
https://www.weave.works/blog/container-capabilities-kubernetes/ https://unofficial-kubernetes.readthedocs.io/en/latest/concepts/policy/container-capabilities/
看来我需要为我的 container/pod 配置一个 securityContext
。在我的 deployment.yaml 中,我添加了:
containers:
...
securityContext:
capabilities:
add:
- NET_ADMIN
但是当我应用该部署时,我得到:
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
添加 --validate=false
可消除错误,但也意味着 securityContext 将被忽略。
什么阻止我设置:
securityContext:
capabilities:
add:
- NET_ADMIN
根据指南,我发现这应该没问题。
我也看过(好像是非免费的):
https://sysdig.com/blog/tracing-in-kubernetes-kubectl-capture-plugin/
所以可能正确的方法是使用类似的工具(ksniff) or setup a sidecar container。但我仍然很好奇为什么会出现上述错误。
具体查看错误,您只发布了清单的一部分,我们可以看到您将 securityContext:
与 containers:
:
containers:
...
securityContext:
capabilities:
add:
- NET_ADMIN
它应该在 containers:
下,如 documentation 中所写:
To add or remove Linux capabilities for a Container, include the
capabilities
field in thesecurityContext
section of the Container manifest.
示例:
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
Linux 功能只能在容器级别安全上下文中添加,不能在 pod 级别添加。
这里不明显,但是看到添加功能部分只提到将其添加到容器中: