Openshift 缺少创建文件的权限

2023-12-12

spring boot应用程序部署在openshift 4上。该应用程序需要在nfs-share上创建一个文件。 openshift 容器已在 NFS 类型上配置卷挂载。 openshift 上的容器创建一个具有随机用户 ID 的 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

在 docker 映像上,我创建了一个用户“technical”,其 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 目录,我看到这个??????因为某些原因

UPDATE

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 将覆盖图像本身可能指定的用户 ID 来运行:

用户 ID 实际上并不是完全随机的,而是分配给您的项目的唯一用户 ID。事实上,您的项目被分配了一系列可以运行应用程序的用户 ID。用户 ID 集不会与其他项目重叠。您可以通过在项目上运行 oc describe 来查看分配给项目的范围。

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

...这是一个祝福和诅咒,例如,当使用共享持久卷声明时(例如 PVC 安装在ReadWriteMany多个 pod 读取/写入数据 - 由于文件所有权和权限不正确,一个 pod 创建的文件将无法被另一 pod 访问。

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

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

restricted security context

当运行 pod 时anyuid在安全上下文中,OpenShift 不会从为命名空间分配的 UID 范围中分配任意 UID:

anyuid security context

这只是举例,但使用具有固定 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

...然后将其安装在 Pod 中:

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在 Dockerfile 中设置.

example file created as anyuid USER

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Openshift 缺少创建文件的权限 的相关文章

随机推荐

  • 从麦克风获取音频并将其写入 iOS 上的套接字

    这就是我想做的 从麦克风获取音频 采用 AAC G 711 或 G 726 编码 将编码帧写入套接字 我找到了很多例子 但它们都写入文件 您能否将我链接到任何具有输出缓冲区或回调的教程 文档 示例 库 我通过修改 Apple 的 Speak
  • 什么是 JAXB?为什么要使用它? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 这里有人发誓 JAXB 是自切片面包以来最伟大的东西 我很好奇 Stack Overflow 用户认为 JAXB 的用例是什么 以及是什么使它成为该用例的好或坏解决方案 我是用于操作 XM
  • JavaFX 和 Spring Boot - NPE

    我仍在与我的问题作斗争 我想使用 Spring Framework 来注入依赖项 并且必须使用 Spring boot 来集成两者 不幸的是 在第一个视图中 自动装配运行正确 但如果我进入下一个阶段 我仍然只能Null Pointer Ex
  • 是否可以检查对象是否已附加到实体框架中的数据上下文?

    当尝试附加已附加到给定上下文的对象时 我收到以下错误context AttachTo ObjectStateManager 中已存在具有相同键的对象 ObjectStateManager 无法跟踪具有相同键的多个对象 有没有一种方法可以实现
  • Xcode 4.4.1:git 不再显示修改

    不幸的是 突然间 我无法确定 Xcode 停止显示 git 信息的发生时刻 也无法从 Xcode 内部通过 git 提交 恢复 等 如果我检查组织者的存储库 我的项目仍会列出其上次提交 使用命令行 git status 我可以看到所有未暂存
  • PHP 中的 Session 和 Cookie 有什么区别?

    两者有什么区别Sessions and Cookies in PHP Cookie 是浏览器存储的一点数据 并随每个请求发送到服务器 会话是存储在服务器上并与给定用户关联的数据集合 通常通过包含 ID 代码的 cookie
  • 谷歌+登录,安卓登录时反复出现唱机提示

    我是安卓开发新手 我正在将 google plus 登录集成到我的应用程序中 我有点困惑谷歌的歌唱提示重复出现 我不明白为什么 我有什么问题吗 我正在关注谷歌开发者网站做这个东西 我使用多个谷歌帐户测试了该应用程序 但其中 2 个工作正常
  • 如何从 Scrapy 获取 UTF-8 编码的 unicode 输出?

    耐心听我说 我之所以写下每一个细节 是因为工具链的很多部分都不能很好地处理 Unicode 并且不清楚是什么原因导致的 PRELUDE 我们首先设置并使用最近的 Scrapy source scrapy 1 1 2 bin activate
  • 如何使用 iPhone sdk 将 XML 字符串转换为 JSON

    我正在实现一个基于客户端的应用程序 我有一个 xml 字符串 我需要将其转换为 JSON 格式并发送到服务器 我不知道如何转换这个 你们能给我建议任何文档或想法吗 步骤 1 将 XML 读入 NSDictionary http troybr
  • 在 Eclipse 中使用 -parameters 选项进行反射

    要使用 java 反射获取方法参数名称 我们必须使用 parameters 选项编译 Java 类 但是当我使用 VM Arguments 从 eclipse 中执行此操作时 我在控制台中收到以下错误 Unrecognized option
  • OpenCSVSerde escapeChar 覆盖 quoteChar

    我有许多 csv 文件正在导入到 Hive 中 并且我发现新行的 escapeChar 会被触发 即使它位于引用字段 即我的 quoteChar 内 有什么简单的方法可以解决这个困境吗 Line1field1 text Line1field
  • 是否可以在 div 区域中包含 box-shadow 来响应单击事件?

    我有一个div充当圆形按钮 它的设计使其整体外观的很大一部分来自于box shadow div style width 50px height 50px background yellow border none div 我有一个附加到按钮
  • Common Lisp:使用与 Lisp 进程不同的工作目录启动子进程

    假设我有一个目录 A 和子目录 B 我 cd 进入 A 并启动 lisp 在该 lisp 进程中 我想启动一个 Python 子进程 其中 Python 将 B 视为其当前工作目录 lisp 进程需要在 A 中拥有 cwd 而 python
  • Youtube Data API v3:喜欢另一个用户的评论

    我想使用 Youtube Data API 来点赞评论 当我尝试喜欢自己的评论时 它可以正常工作 没有任何问题 但是当我尝试喜欢其他人的评论时 我会收到错误 reason invalidCommentMetadata message The
  • mysql_fetch_assoc():提供的参数不是有效的 MySQL 结果资源[重复]

    这个问题在这里已经有答案了 可能的重复 警告 mysql fetch array 提供的参数不是有效的 MySQL 结果 我真的坚持这一点 我收到了这个错误 mysql fetch assoc 提供的参数不是 文件名 中有效的 MySQL
  • LINQ 中的动态 where 子句?

    我正在尝试根据动态条件加载数据 string tempQry string Empty if string IsNullOrEmpty cusid string IsNullOrEmpty mktid tempQry x gt x Mark
  • Scrapy安装(需要Microsoft Visual C++ 14.0)

    我已经尝试通过命令安装 scrapy 好几天了 pip install scrapy 下载要求后 我收到此错误代码 error Microsoft Visual C 14 0 is required Get it with Microsof
  • Tridion:替换 Query.QueryOperator 方法?

    Query QueryOperator AND Field我们在 Tridion R5 3 VBscript 模板中使用了这种方法 效果很好 最近 在迁移到Tridion 2011 SP1时 我们尝试使用此方法 但它不起作用 我们了解到该方
  • 通过 pandas 坐标数据框查找单元格中的点

    我必须通过两个 pandas 数据框找到哪些点位于方形单元格网格内 给定点坐标和单元格边界坐标 我正在打电话dfc包含代码和单元格边界坐标的数据框 我简化了问题 在实际分析中我有一个大网格 其中包含地理点和大量要检查的点 Code minx
  • Openshift 缺少创建文件的权限

    spring boot应用程序部署在openshift 4上 该应用程序需要在nfs share上创建一个文件 openshift 容器已在 NFS 类型上配置卷挂载 openshift 上的容器创建一个具有随机用户 ID 的 pod 如下