我正在运行一段代码,它打开了一个docker容器中的原始socket,其中kubernetes作为orchestrator。
下面是我的示例代码:
#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <errno.h>
#include <netinet/tcp.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>
int main (void)
{
//Create a raw socket
int s = socket (AF_INET, SOCK_RAW, IPPROTO_SCTP);
if(s == -1)
{
perror("Failed to create socket");
exit(1);
}
}
字符串
在我的container/pod中以非root用户身份运行代码时,我得到了这个错误。
./rawSocTest
Failed to create socket: Operation not permitted
型
这是显而易见的,因为它需要根级别的权限才能打开原始套接字。我通过设置capability cap_net_raw纠正了这个问题。
getcap rawSocTest
rawSocTest = cap_net_raw+eip
型
当我再次运行它。我得到一个不同的错误。
./rawSocTest
bash: ./rawSocTest: Permission denied
型
根据我的理解,设置功能应该已经解决了我的问题。我错过了什么吗?或者这是容器的已知限制吗?
先谢谢你。
2条答案
按热度按时间btqmn9zl1#
我解决了我需要在kubernetes部署的容器安全上下文部分设置功能。我添加了NET_RAW功能以允许创建原始套接字。我的印象是,在构建过程中只需添加capnet raw功能就足够了。但我的理解是错误的。
我做了一些研究并清理了部署解决方案。我在pod安全策略的允许功能部分添加了NET_RAW。然后创建角色并进行角色绑定。通过rolebinding将其链接到将部署我的pod的名称空间中的服务帐户。然后在pod部署中使用此serviceAccount。不确定这是否是一个好的解决方案。
soat7uwm2#
我使用用户kubernetes-admin运行了它
将容器定义的示例部署文件添加到前面所述的内容中
字符串
也可以参考k8s文档:https://kubernetes.io/docs/tasks/configure-pod-container/security-context/