Linux --cap add=NET_ADMIN和.yml中的add功能之间的区别

Linux --cap add=NET_ADMIN和.yml中的add功能之间的区别,linux,docker,kubernetes,kubectl,Linux,Docker,Kubernetes,Kubectl,我有一个关于能力的问题 当我运行docker run--cap add=NET\u ADMIN…时,为什么我的程序可以工作 如果我用文件.yml运行我的程序,它是不起作用的,它是: containers: - name: snake image: docker.io/kelysa/snake:lastest imagePullPolicy: Always securityContext: privileg

我有一个关于能力的问题

当我运行docker run--cap add=NET\u ADMIN…时,为什么我的程序可以工作

如果我用文件.yml运行我的程序,它是不起作用的,它是:

      containers:
      - name: snake
        image: docker.io/kelysa/snake:lastest
        imagePullPolicy: Always
        securityContext:
          privileged: true
          capabilities:
            add: ["NET_ADMIN","NET_RAW"]
使用--cap add运行docker和使用相同功能运行pod之间有什么区别

如码头工人所述

默认情况下,Docker容器是“非特权”的,例如,不能在Docker容器内运行Docker守护程序。这是因为默认情况下,不允许容器访问任何设备,但允许“特权”容器访问所有设备(请参阅关于cgroups设备的文档)

当操作员执行
docker run--privileged
时,docker将启用对主机上所有设备的访问,并在AppArmor或SELinux中设置一些配置,以允许容器几乎与主机上容器外部运行的进程一样访问主机

除了--privileged之外,操作员还可以使用--cap add和--cap drop对功能进行细粒度控制

您可以找到两种功能:

  • 具有保留的默认功能列表的Docker
  • 默认情况下未授予且可添加的功能
此命令
docker run--cap add=NET\u ADMIN
将应用额外的linux功能

根据文件:

为了与网络堆栈交互,他们应该使用--cap add=NET_ADMIN来修改网络接口,而不是使用--privileged

注意

为了减少系统调用攻击,最好只授予容器所需的权限。另请参阅

从容器中,可通过以下方式实现:

securityContext:
  capabilities:
    drop: ["all"]
    add: ["NET_BIND"]
要查看容器内应用的容量,可以使用:
getpcaps process\u id或$(pgrep your-proces\u name)
列出并探索您使用的linux功能
capsh--print

资源

  • ,
  • ,

希望这能有所帮助。

什么叫“不起作用”?通常Docker和Kubernetes都为您管理网络环境,需要这种功能是非常不寻常的;这表明该工具在非Docker环境中运行可能更好。您是否找到了导致此问题的原因?这并没有突出两者之间的区别。
securityContext:
  capabilities:
    drop: ["all"]
    add: ["NET_BIND"]