【问题标题】:Docker service won't run inside Container - ERROR : ulimit: error setting limit (Operation not permitted)Docker 服务不会在容器内运行 - 错误:ulimit:错误设置限制(不允许操作)
【发布时间】:2019-12-28 12:17:00
【问题描述】:

我在 AWS EKS 上运行一个集群。当前运行的容器(StatefulSet POD)内部安装了 Docker。

我在集群中将此映像作为 Kubernetes StatefulSet 运行。这是我的 yaml 文件,

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: jenkins
  labels:
    run: jenkins
spec:
  serviceName: jenkins
  replicas: 1
  selector:
    matchLabels:
      run: jenkins
  template:
    metadata:
      labels:
        run: jenkins
    spec:
      securityContext:
        fsGroup: 1000
      containers:
      - name: jenkins
        image: 99*****.dkr.ecr.<region>.amazonaws.com/<my_jenkins_image>:0.0.3
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
          name: jenkins-port

在这个 POD 中,我无法运行任何给出错误的 docker 命令:

/etc/init.d/docker: 96: ulimit: error setting limit (Operation not allowed)

在我的研究中,我浏览了一些无法解决我的问题的文章。 我列出了我尝试过但在我的情况下没有修复的解决方案

第一个解决方案:(我在容器内跑) aricle link

$ sudo service docker stop
$ sudo bash -c "echo \"limit nofile 262144 262144\" >> /etc/init/docker.conf"
$ sudo service docker start

第二种解决方案:(我在容器内跑)

ulimit -n 65536 in /etc/init.d/docker

第三种解决方案:** article link 这似乎是一个更好的答案,我无法将其添加到我的配置文件中。 它说,以特权运行 pod。但是没有办法在 ***Kubernetes StatefulSet* 中添加该选项。 所以我尝试在配置文件中添加这样的 SecurityContext (securityContext:fsGroup: 1000)

spec:
  serviceName: jenkins
  replicas: 1
  selector:
    matchLabels:
      run: jenkins
  template:
    metadata:
      labels:
        run: jenkins
    spec:
      securityContext:
        fsGroup: 1000

还是不行。

注意:相同的图像在 Docker swarm 上工作

任何帮助将不胜感激!

【问题讨论】:

    标签: docker kubernetes containers amazon-eks


    【解决方案1】:

    我在使用 Elastic Search 时遇到了这个问题,添加 initContainer 有效。在这种情况下,它可能是解决方案:

    spec:
      .
      .
      .
      initContainers:  
      - name: increase-fd-ulimit
        image: busybox
        command: ["sh", "-c", "ulimit -n 65536"]
        securityContext:
          privileged: true
    

    如果它不起作用,有一个second 方法来解决这个问题,包括创建一个新的 Dockerfile 或更改现有的:

    FROM 99*****.dkr.ecr.<region>.amazonaws.com/<my_jenkins_image>:0.0.3
    RUN ulimit -n 65536
    USER 1000
    

    并将 securityContext 更改为:

      securityContext:
        runAsNonRoot: true
        runAsUser: 1000
        capabilities:
          add: ["IPC_LOCK"]
    

    【讨论】:

      【解决方案2】:

      也许 POD 容器需要运行时权限和 Linux 功能 比如在容器外的docker中,需要给这个容器权限

      docker run --privileged

      那么,这个docker可以执行service docker start,在容器内使用docker命令

      kubernetes API 的 Controller 和 Pod 有设置:

      spec:
        containers:
          - name:  pause
            image: k8s.gcr.io/pause
            securityContext:
              privileged: true
      

      或创建PodSecurityPolicy

      【讨论】:

        猜你喜欢
        • 2019-02-08
        • 1970-01-01
        • 2020-03-26
        • 2012-03-07
        • 2014-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多