TL;DR - 问题的解决方案,感谢 Paul
如果您遇到下面描述的问题,最简单的解决方法是在运行 Recipe 启动单节点 k8s 之前执行以下命令:
sudo chcon -Rt svirt_sandbox_file_t /var/lib/kubelet
原始问题描述
我正在尝试根据此配方构建一个 k8s 环境 >https://github.com/kubernetes/kubernetes/blob/release-1.1/docs/getting-started-guides/docker.md https://github.com/kubernetes/kubernetes/blob/release-1.1/docs/getting-started-guides/docker.md为了集成测试我们的代码库,该代码库在 k8s 集群中配置容器。
为了复制/粘贴方便,我将配方中的所有命令包含在下面的“运行配方”部分中
我有一个简单的复制控制器定义(在下面的“复制控制器定义”中复制)
对于非常标准的图像(nginx)。在此 RC 定义中,我尝试使用“emptyDir”挂载共享文件夹。
为简单起见,我在代表控制器定义中只有一个容器(因此实际上没有太多共享。)
现在,当我通过命令“kubectl create -f shared.folder.json”针对我们的多节点集群配置此 RC 时
我可以登录容器“nginx”并执行以下操作:
touch /backup-folder/fooFile
我们的多节点集群的版本信息是:
Server Version:
version.Info{
Major:"1",
Minor:"1+",
GitVersion:"v1.1.3-beta.0.308+71b088a96ee101-dirty",
GitCommit:"71b088a96ee101967fc06e1f95b1cade8f6e30f9", GitTreeState:"dirty"}
但是...当我使用“运行配方”中的步骤启动单节点 k8s 集群并配置时
使用命令“kubectl create -f shared.folder.json”针对该集群,然后生成一个 bash shell
在 nginx 容器中并尝试与上面相同的 touch 命令,但在单节点情况下我得到一个
错误:触摸:无法触摸“/backup-folder/fooo”:权限被拒绝
如果它有用,这里是我在两种情况下运行 mount -l 获得的信息:
1)单节点k8s
root@foo-hzxd6:/# mount -l | grep backup-folder
/dev/mapper/cl-root on /backup-folder type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
2)多节点k8s
root@foo-vcbc9:/# mount -l | grep backup-folder
/dev/vdb on /backup-folder type ext3 (rw,relatime,data=ordered)
复制控制器定义
shared.folder.json
{
"kind": "ReplicationController",
"apiVersion": "v1",
"metadata":{
"name":"foo",
"labels":{
"app":"foo",
"role":"foo"
}
},
"spec": {
"replicas": 1,
"selector": {
"name": "nginx"
},
"template": {
"metadata": {
"name": "nginx",
"labels": {
"name": "nginx"
}
},
"spec": {
"containers": [
{
"name": "nginx",
"image": "nginx",
"imagePullPolicy": "Always",
"ports": [
{
"containerPort": 8080
},
{
"containerPort": 8081
}
],
"command": ["sleep", "10000"],
"volumeMounts": [
{
"name": "shared-volume",
"mountPath": "/backup-folder"
}
]
}
],
"volumes": [
{
"name": "shared-volume",
"emptyDir": { }
}
]
}
}
}
}
运行食谱
docker run --net=host -d gcr.io/google_containers/etcd:2.0.12 /usr/local/bin/etcd --addr=127.0.0.1:4001 --bind-addr=0.0.0.0:4001 --data-dir=/var/etcd/data
docker run \
--volume=/:/rootfs:ro \
--volume=/sys:/sys:ro \
--volume=/dev:/dev \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/var/lib/kubelet/:/var/lib/kubelet:rw \
--volume=/var/run:/var/run:rw \
--net=host \
--pid=host \
--privileged=true \
-d \
gcr.io/google_containers/hyperkube:v1.0.1 \
/hyperkube kubelet --containerized --hostname-override="127.0.0.1" --address="0.0.0.0" --api-servers=http://localhost:8080 --config=/etc/kubernetes/manifests
docker run -d --net=host --privileged gcr.io/google_containers/hyperkube:v1.0.1 /hyperkube proxy --master=http://127.0.0.1:8080 --v=2
边注
(我们的 k8s 版本——我们用于多节点情况——在“库存”kubernetes 之上进行了一些更改,但我很确定这些更改都与安装文件夹无关)。
尾声 - 有关 SELinux 拒绝访问共享文件夹的更多详细信息
为了回答保罗提供更多细节的要求,我们在这里:
首先,通过“setenforce 1”将强制执行恢复为“是”
接下来,终止所有 docker 容器,然后通过上面提供的 3 步配方重新启动 k8s 单节点。
接下来,通过“kubectl create -f shared.folder.json”配置 pod
接下来,通过以下方式将 shell 放入容器中:“kubectl exec -i -t foo-podxxx -c nginx -- bash ”
在 bash shell 中:“touch /backup-folder/blah”
RESULTS:
> sudo ausearch -ts recent -m AVC
----
time->Tue Jan 19 11:33:19 2016
type=SYSCALL msg=audit(1453231999.925:865015): arch=c000003e syscall=2 success=no exit=-13 a0=7ffd65fc1e45 a1=941 a2=1b6 a3=7ffd65fc09f0 items=0 ppid=25089 pid=25127 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts4 ses=4294967295 comm="touch" exe="/bin/touch" subj=system_u:system_r:svirt_lxc_net_t:s0:c202,c694 key=(null)
type=AVC msg=audit(1453231999.925:865015): avc: denied { create } for pid=25127 comm="touch" name="blah" scontext=system_u:system_r:svirt_lxc_net_t:s0:c202,c694 tcontext=system_u:object_r:docker_var_lib_t:s0 tclass=file
(backup-agent-scripts) /home/chris/dev/krylov/scripts >
kubelet的日志:https://dl.dropboxusercontent.com/u/9940067/kubelet.log https://dl.dropboxusercontent.com/u/9940067/kubelet.log