OpenShift缺少创建文件的权限 [英] Openshift missing permissions to create a file
问题描述
在OpenShift 4上部署了Spring引导应用程序,该应用程序需要在nfs-share上创建一个文件。 OpenShift容器已在类型NFS上配置了卷装载。 OpenShift上的容器创建一个随机userid为
的podsh-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:
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屋!