3

我正在使用 securityContext 进行测试,但是当我将 runAsNonRoot 设置为 true 时,我无法启动一个 pod。我使用 vagrant 以用户 abdelghani 的身份将一个 master 和两个 minions 和 ssh 部署到主机:

id $USER
uid=1001(abdelghani) gid=1001(abdelghani) groups=1001(abdelghani),27(sudo)

集群信息:

Kubernetes 版本:4.4.0-185-generic 正在使用的云:(如果不在公共云上,则放置裸机)安装方法:手动主机操作系统:ubuntu16.04.6 CNI 和版本:CRI 和版本:

apiVersion: v1
kind: Pod
metadata:
  name: buggypod
spec:
  containers:
  - name: container
    image: nginx
    securityContext:        
      runAsNonRoot: true

我这样做:kubectl apply -f pod.yml 它说 pod mybugypod created 但是当我检查时:kubectl get pods pod 的状态是 CreateContainerConfigError

我做错了什么?

4

2 回答 2

1

默认情况下,Nginx 服务将期望对其配置路径 (/etc/nginx) 具有读写权限,非 root 用户将拥有对其失败原因的路径的访问权限。您刚刚设置了 runAsNonRoot,但您不能期望或保证容器将以用户 1001 身份启动服务。请尝试将 runAsUser 显式设置为 1001,如下所示,这应该可以解决您的问题。

apiVersion: v1
kind: Pod
metadata:
  name: buggypod
spec:
  containers:
    - name: container
      image: nginx
      securityContext:        
        runAsUser: 1001 
于 2020-08-13T15:50:44.757 回答
1

我尝试根据您的要求运行 pod。它失败的原因是 Nginx 需要修改 root 拥有的 /etc/ 中的某些配置,当你运行 AsNonRoot 时它会失败,因为它无法编辑 Nginx 默认配置。

这是您在运行它时实际遇到的错误。

10-listen-on-ipv6-by-default.sh: error: can not modify /etc/nginx/conf.d/default.conf (read-only file system?)
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2020/08/13 17:28:55 [warn] 1#1: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:2
nginx: [warn] the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:2
2020/08/13 17:28:55 [emerg] 1#1: mkdir() "/var/cache/nginx/client_temp" failed (13: Permission denied)
nginx: [emerg] mkdir() "/var/cache/nginx/client_temp" failed (13: Permission denied)

我运行的规范。

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: buggypod
  name: buggypod
spec:
  securityContext:
    runAsNonRoot: true
    runAsUser: 1000
  containers:
  - image: nginx
    name: buggypod
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

我的建议是您使用 Dockerfile 创建一个自定义 Nginx 映像,该映像还创建用户并为新创建的用户提供对文件夹 /var/cache/nginx、/etc/nginx/conf.d、/var/log/nginx 的权限。这样您就可以将容器作为非根运行。

于 2020-08-13T17:39:39.380 回答