OpenShift缺少创建文件的权限 [英] Openshift missing permissions to create a file

查看:29
本文介绍了OpenShift缺少创建文件的权限的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在OpenShift 4上部署了Spring引导应用程序,该应用程序需要在nfs-share上创建一个文件。 OpenShift容器已在类型NFS上配置了卷装载。 OpenShift上的容器创建一个随机userid为

的pod
sh-4.2$ id
uid=1031290500(1031290500) gid=0(root) groups=0(root),1031290500

挂载点为/nfs/abc

sh-4.2$ ls -la /nfs/
ls: cannot access /nfs/abc: Permission denied
total 0
drwxr-xr-x. 1 root root 29 Nov 25 09:34 .
drwxr-xr-x. 1 root root 50 Nov 25 10:09 ..
d?????????? ? ?    ?     ?            ? abc

在坞站映像上,我使用uid=gid=48760创建了用户&技术&,如下所示。

FROM quay.repository
MAINTAINER developer

LABEL description="abc image" 
      name="abc" 
      version="1.0"

ARG APP_HOME=/opt/app
ARG PORT=8080

ENV JAR=app.jar 
    SPRING_PROFILES_ACTIVE=default 
    JAVA_OPTS=""

    
RUN mkdir $APP_HOME 

ADD $JAR $APP_HOME/

WORKDIR $APP_HOME
EXPOSE $PORT
ENTRYPOINT java $JAVA_OPTS -Dspring.profiles.active=$SPRING_PROFILES_ACTIVE -jar $JAR

我的部署配置文件如下所示

 spec:
      volumes:
        - name: bad-import-file
          persistentVolumeClaim:
            claimName: nfs-test-pvc
      containers:
        - resources:
            limits:
              cpu: '1'
              memory: 1Gi
            requests:
              cpu: 500m
              memory: 512Mi
          terminationMessagePath: /dev/termination-log
          name: abc
          env:
            - name: SPRING_PROFILES_ACTIVE
              valueFrom:
                configMapKeyRef:
                  name: abc-configmap
                  key: spring.profiles.active
            - name: DB_URL
              valueFrom:
                configMapKeyRef:
                  name: abc-configmap
                  key: db.url
            - name: DB_USERNAME
              valueFrom:
                configMapKeyRef:
                  name: abc-configmap
                  key: db.username
            - name: BAD_IMPORT_PATH
              valueFrom:
                configMapKeyRef:
                  name: abc-configmap
                  key: bad.import.path
            - name: DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: abc-secret
                  key: db.password
          ports:
            - containerPort: 8080
              protocol: TCP
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - name: bad-import-file
              mountPath: /nfs/abc
      dnsPolicy: ClusterFirst
      securityContext:
        runAsGroup: 44337
        runAsNonRoot: true
        supplementalGroups:
          - 44337

PV请求如下

apiVersion: v1
kind: PersistentVolume
metadata:
  name: abc-tuc-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: classic-nfs
  mountOptions:
    - hard
    - nfsvers=3
  nfs:
    path: /tm03v06_vol3014
    server: tm03v06cl02.jit.abc.com
    readOnly: false

现在OpenShift用户具有ID

sh-4.2$ id
        uid=1031290500(1031290500) gid=44337(technical) groups=44337(technical),1031290500

最近更新

为了清楚问题,下面我从同一个Pod终端有两个命令

sh-4.2$ cd /nfs/
sh-4.2$ ls -la (The first command I tried immediately after pod creation.)
total 8
drwxr-xr-x.  1 root  root    29 Nov 29 08:20 .
drwxr-xr-x.  1 root  root    50 Nov 30 08:19 ..
drwxrwx---. 14 technical technical 8192 Nov 28 19:06 abc
sh-4.2$ ls -la(few seconds later on the same pod terminal)
ls: cannot access abc: Permission denied
total 0
drwxr-xr-x. 1 root root 29 Nov 29 08:20 .
drwxr-xr-x. 1 root root 50 Nov 30 08:19 ..
d?????????? ? ?    ?     ?            ? abc

所以问题是我看到这些问号(?)在挂载点上。 挂载工作正常,但我无法访问此/nfs/abc目录,并看到以下内容:?出于某种原因

更新

sh-4.2$ ls -la /nfs/abc/
ls: cannot open directory /nfs/abc/: Stale file handle
sh-4.2$ ls -la /nfs/abc/ (after few seconds on the same pod terminal)
ls: cannot access /nfs/abc/: Permission denied

此陈旧的文件句柄可能是导致此问题的原因吗?

推荐答案

TL;DR

您可以使用anyuid安全上下文运行Pod,以避免OpenShift分配任意UID,并将卷上的权限设置为用户的已知UID。


OpenShift will override the user ID the image itself may specify that it should run as

用户ID实际上不是完全随机的,而是分配给您的项目唯一的用户ID。实际上,为您的项目分配了一系列用户ID,应用程序可以使用这些用户ID运行。这组用户ID不会与其他项目重叠。您可以通过对项目运行oc Describe来查看分配给项目的范围。

为每个项目分配不同范围的用户ID的目的是,在多租户环境中,来自不同项目的应用程序永远不会以相同的用户ID运行。使用永久存储时,应用程序创建的任何文件在文件系统中也将拥有不同的所有权。

..。例如,在使用共享持久卷声明时,这既是好事也是坏事(例如,在ReadWriteMany中挂载的PVC具有多个Pod读/写数据-一个Pod创建的文件将无法由另一个Pod访问,因为文件所有权和权限不正确)。

解决此问题的一种方法是使用anyuid安全上下文,该上下文提供受限SCC的所有功能,但允许用户使用任何UID和任何GID";运行。

使用anyuid安全上下文时,我们知道Pod将以其身份运行的用户和组ID,并且我们可以提前设置共享卷上的权限。例如,默认情况下,所有Pod都使用restricted安全上下文运行:

使用anyuid安全上下文运行Pod时,OpenShift不会从分配给命名空间的UID范围中分配任意UID:

仅举个例子,但使用具有固定UID和GID的非root用户(例如,1000:1000)构建的映像将作为该用户在OpenShift中运行,文件将以该用户的所有权创建(例如,1000:1000),可以将PVC上的权限设置为设置为运行该服务的用户的已知UID和GID。例如,我们可以创建一个新的PVC:

cat <<EOF |kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data
  namespace: k8s
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 8Gi
  storageClassName: portworx-shared-sc
EOF

..。然后将其安装在吊舱中:

kubectl run -i --rm --tty ansible --image=lazybit/ansible:v4.0.0 --restart=Never -n k8s --overrides='
{
  "apiVersion": "v1",
  "kind": "Pod",
  "spec": {
    "serviceAccountName": "default",
    "containers": [
      {
        "name": "nginx",
        "imagePullPolicy": "Always",
        "image": "lazybit/ansible:v4.0.0",
        "command": ["ash"],
        "stdin": true,
        "stdinOnce": true,
        "tty": true,
        "env": [
          {
            "name": "POD_NAME",
            "valueFrom": {
              "fieldRef": {
                "apiVersion": "v1",
                "fieldPath": "metadata.name"
              }
            }
          }
        ],
        "volumeMounts": [
          {
            "mountPath": "/data",
            "name": "data"
          }
        ]
      }
    ],
    "volumes": [
      {
        "name": "data",
        "persistentVolumeClaim": {
          "claimName": "data"
        }
      }
    ]
  }
}'

..。并在PVC中创建USER set in the Dockerfile文件。

这篇关于OpenShift缺少创建文件的权限的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆