在Kubernetes Pod中使用Docker套接字

时间:2019-10-30 09:17:53

标签: docker kubernetes azure-aks kubernetes-pod

我想要prune Docker镜像,我使用node-docker-api编写了一个小的Docker镜像,并且能够在本地成功测试。
当我将DaemonSet部署到Kubernetes时,该pod无法访问Docker套接字:

Error: connect EACCES /var/run/docker.sock

deployment.yaml如下所示:

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  labels:
    name: docker-image-cleanup
  name: docker-image-cleanup
spec:
  template:
    metadata:
      labels:
        app: docker-image-cleanup 
    spec:
      volumes:
        - name: docker-sock
          hostPath:
            path: "/var/run/docker.sock"
            type: File
        - name: docker-directory
          hostPath:
            path: "/var/lib/docker"

      containers:
        - name: docker-image-cleanup
          image: image:tag
          securityContext:
            privileged: true
          env:
            - name: PRUNE_INTERVAL_SECONDS
              value: "30"
            - name: PRUNE_DANGLING
              value: "true"
          volumeMounts:
            - mountPath: /var/run/docker.sock
              name: docker-sock
              readOnly: false
            - mountPath: "/var/lib/docker"
              name: docker-directory
              readOnly: false

运行AKS v1.13.10-如果相关

2 个答案:

答案 0 :(得分:2)

不能保证您的kubernetes集群实际上使用docker作为容器引擎。由于存在cri-o和kata容器之类的许多替代方案,因此您的应用程序/部署应不对基础容器引擎进行任何假设。

Kubernetes会自动清理未使用的容器映像。如果您自己运行集群,请参阅有关如何配置它的文档:https://kubernetes.io/docs/concepts/cluster-administration/kubelet-garbage-collection/

除此之外,您似乎对套接字有一个简单的权限问题:请确保清理容器中的应用程序以root身份运行或具有适当的用户访问套接字。

答案 1 :(得分:0)

我已将runAsUser: 0添加到了容器属性:

containers:
  - name: docker-image-cleanup
    image: image:tag
    securityContext:
      privileged: true
      runAsUser: 0

现在可以使用