我正在AWS EKS上运行集群。当前运行的Container(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:错误设置限制(不允许操作)
在我的研究中,我经历了一些无法解决我的问题的技巧。 我列出了我尝试过但未解决的解决方案
第一个解决方案:(我在容器内跑了) 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群集上工作
任何帮助将不胜感激!
答案 0 :(得分:2)
我在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"]
答案 1 :(得分:1)
POD容器可能需要运行时特权和Linux功能 例如,在docker外容器中,您需要为此容器赋予特权
(defn function
[input] ;assume input = '(First (Second (Last)))
(last input)
)
然后,该泊坞窗可以执行docker run --privileged
,以在容器内使用泊坞窗命令
有kubernetes API的Controller和Pod的设置:
service docker start
或创建spec:
containers:
- name: pause
image: k8s.gcr.io/pause
securityContext:
privileged: true
。