我正在尝试将hostPath volume装入Kubernetes Pod。下面显示了hostPath
卷规格的示例,该示例取自文档。我正在部署到运行启用了SELinux的RHEL 7的主机。
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: k8s.gcr.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /test-pd
name: test-volume
volumes:
- name: test-volume
hostPath:
# directory location on host
path: /data
# this field is optional
type: Directory
当我的Pod尝试读取从基础主机装载的文件时,出现“权限被拒绝”错误。当我运行setenforce 0
关闭SELinux时,错误消失了,我可以访问文件了。当我将目录绑定到Docker容器中时,会遇到相同的错误。
here中描述了该问题,在使用Docker时,可以使用Docker文档here中所述的z
或Z
绑定安装标志来解决。
虽然我可以通过运行来解决问题
chcon -Rt svirt_sandbox_file_t /path/to/my/host/dir/to/mount
我将其视为讨厌的黑客,因为我需要在Kubernetes集群中的每台主机上执行此操作,并且还因为YAML规范中描述的我对Kubernetes的部署并不能完整描述完成以使我的YAML正常运行。无法关闭SELinux。
我可以看到Kubernetes在文档here中提到了SELinux安全上下文,但是在没有出现权限拒绝错误的情况下,我无法成功地将hostPath卷挂载到pod中。
YAML要使容器成功地从运行SELinux的基础主机上装载HostPath卷,需要什么样的外观?
更新:
我正在访问的文件是具有以下标签的CA证书:
system_u:object_r:cert_t:s0
当我使用以下选项时:
securityContext:
seLinuxOptions:
level: "s0:c123,c456"
,然后通过ausearch -m avc -ts recent
检查访问控制审核错误,我可以看到容器的级别标签为s0:c123,c456
时存在权限拒绝错误,因此我可以看到该级别标签作品。我将标签设置为s0
。
但是,如果我尝试将type
标签更改为cert_t
,则容器甚至无法启动,就会出现错误:
container_linux.go:247: starting container process caused "process_linux.go:364: container init caused \"write /proc/self/task/1/attr/exec: invalid argument\""
我似乎无法更改容器的类型标签。
答案 0 :(得分:0)
您可以尝试使用完整权限:
...
image: k8s.gcr.io/test-webserver
securityContext:
privileged: true
...
答案 1 :(得分:0)
您可以使用seLinuxOptions
分配SELinux标签:
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: k8s.gcr.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /test-pd
name: test-volume
securityContext:
seLinuxOptions:
level: "s0:c123,c456"
volumes:
- name: test-volume
hostPath:
# directory location on host
path: /data
# this field is optional
type: Directory
答案 2 :(得分:0)
我正面临类似的问题,唯一可行的解决方法是在“ securityContext”中添加“ privileged:true”。
如果您已找到解决方案,请告诉我。
答案 3 :(得分:0)
在the answer from VAS上展开,因为它部分正确:
仅当重新标记hostPath
卷所指向的路径目标时,才可以指定SELinux标签的级别部分。这是通过seLinuxOptions.level
中指定的securityContext
属性自动完成的。
但是,诸如seLinuxOptions.type
之类的属性当前对卷重新标记没有影响。在撰写本文时,这仍然是open issue within Kubernetes