我正在使用coreos构造沙箱。我的deployment.yaml文件包含应该检测通过kubernetes在主机上运行的docker守护程序的容器。 容器使用docker守护程序来识别docker事件。由于某种原因,没有检测到docker守护程序。
deployment.yaml
containers:
- name: idn-docker
image: sample/id-docker:latest
- name: docker-socket
mountpath: /var/run/docker.sock
有些人可以帮我确定问题所在。
答案 0 :(得分:0)
对于在Docker中运行Docker,您有两个选项 - DooD(Docker中的Docker)和DinD(Docker中的Docker)。我认为你需要第一个,因为你需要访问主机上的事件。
关于这两种方案,这是一个很好的article。
pod的配置示例:
apiVersion: v1
kind: Pod
metadata:
name: idn-docker
spec:
containers:
- name: idn-docker
image: sample/id-docker:latest
volumeMounts:
- mountPath: /var/run
name: docker-sock
volumes:
- name: docker-sock
hostPath:
path: /var/run
您可以使用部署中示例中的containers
部分,因为template
部分中的结构与单独的pod配置相同,就是Pod模板。
但是,请记住,该解决方案会有一些限制:
Pod网络 - 无法使用Pod IP访问容器。
Pod生命周期 - 在Pod终止时,此容器将继续运行,尤其是在使用-d标志启动容器时。
Pod清理 - 在pod终止后,图形存储将不会被清理。
调度和资源利用 - Pod请求的Cpu和内存仅适用于Pod,而不适用于从Pod生成的容器。此外,生成容器不会继承对Pod的CPU和内存设置的限制。
答案 1 :(得分:0)
与Why we don't let non-root users run Docker in CentOS, Fedora, or RHEL中一样,CoreOS默认情况下没有docker组,并试图通过限制对root的访问来保护对docker socket的访问。
默认情况下,作为Docker容器进程的Kuberneses pod不会以root用户身份运行,而SELinux标签也会阻止pod /容器访问docker socket。使用ps -Z检查pod进程,使用ls -Z检查docker socket以验证标签。
允许从容器访问Docker套接字存在安全风险,但如果由于某种原因必须这样做,则一种方法是使用安全上下文将pod作为特权运行,并使pod进程以root身份运行(有风险)。
securityContext:
privileged: true
不确定是否使用构造,但默认情况下OpenShift会阻止使用hostPath mount和tectonic可能有相似之处。另一个问题是用于pod的服务帐户以及帐户的角色/绑定。