不允许使用 configMap 卷
configMap volumes are not allowed to be used
我正在使用 OKD4,我正在尝试使用 ConfigMap 在我的 pods 中安装 /etc/php.ini。
为此,我在我的项目中创建了以下 K8S 对象。
Configmap(之前为 Deployment 创建):
- apiVersion: v1
kind: ConfigMap
data:
php.ini: |-
[PHP]
;;;;;;;;;;;;;;;;;;;
; About php.ini ;
;;;;;;;;;;;;;;;;;;;
metadata:
name: php-ini
部署对象:
- kind: Deployment
apiVersion: apps/v1
metadata:
name: privatebin
labels:
app: privatebin
spec:
replicas: 1
selector:
matchLabels:
app: privatebin
template:
metadata:
creationTimestamp: null
labels:
app: privatebin
deploymentconfig: privatebin
spec:
containers:
- name: privatebin
image: <my container registry>/privatebin:${IMAGE_TAG}
volumeMounts:
- name: config-volume
mountPath: php.ini
livenessProbe:
exec:
command:
- /bin/sh
- -c
- "[ -f /run/nginx.pid ] && ps -C nginx >/dev/null 2>&1 && ps -C php-fpm >/dev/null 2>&1"
initialDelaySeconds: 10
periodSeconds: 5
readinessProbe:
httpGet:
scheme: HTTP
path: /
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
ports:
- containerPort: 8080
protocol: TCP
resources:
limits:
cpu: "250m" # parameterize in tekton pipeline
memory: "368Mi" # parameterize in tekton pipeline, maybe using template
requests:
cpu: "100m" # parameterize in tekton pipeline, maybe using template
memory: "256Mi" # parameterize in tekton pipeline, maybe using template
securityContext:
runAsUser: 1000
fsGroup: 1000
fsGroupChangePolicy: "OnRootMismatch"
imagePullPolicy: Always
restartPolicy: Always
terminationGracePeriodSeconds: 30
volumes:
- name: config-volume
configMap:
name: php-ini
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
由于某种原因,我的 pods 丢失了,并且存在以下错误:
- lastTransitionTime:“2021-10-08T12:53:01Z”
最后更新时间:“2021-10-08T12:53:01Z”
消息:'pods“privatebin-55678c66c5-”被禁止:无法验证
任何安全上下文约束:[spec.containers[0].securityContext.runAsUser:
无效值:1000:必须在以下范围内:[1002460000、1002469999] spec.volumes[0]:
无效值:“configMap”:不允许使用 configMap 卷]'
ReplicaSet 也超时并出现类似的错误:
状态:
条件:
- lastTransitionTime:“2021-10-08T12:53:01Z”
消息:'pods“privatebin-55678c66c5-”被禁止:无法验证
任何安全上下文约束:[spec.containers[0].securityContext.runAsUser:
无效值:1000:必须在以下范围内:[1002460000、1002469999] spec.volumes[0]:
无效值:“configMap”:不允许使用 configMap 卷]'
为什么我无法挂载ConfigMap?是因为 Deployment 中的 Securitycontext 吗?
提前致谢,
您的集群安装了拒绝您的规范的 pod 安全策略。您可以使用 kubectl get psp
获取 psp,然后使用 kubectl describe psp <name>
检查设置。查看设置 volumes
和 runAsUser
.
(该错误与 configmaps 无关,但当您解决错误后,您可能需要稍微调整您的 configmap 以准确地将文件放入您希望它登陆的目录中。)
OKD 是 OpenShift,所以它使用的是 SCC(不是 PSP)。
默认情况下,您可以访问命名空间中的“受限”SCC。错误中抛出的 UID 来自命名空间注释 (oc get namespace FOO -o yaml) 将显示它们。
修复:
- 您可以更改 运行AsUser 以匹配名称空间注释;或者(更好)只使用“运行AsNonRoot: true”,强制它不作为 root 运行 并采用该注释范围内的第一个 uid。您可能需要更新容器映像以利用 GROUP 成员资格而不是 uid 来获得文件访问权限。
- 您可以允许您的帐户使用“非根”SCC 作为任何 uid 运行,满足您对 运行 作为 uid=1000 的期望。我建议您将第一个选项视为更可取的选项。
我正在使用 OKD4,我正在尝试使用 ConfigMap 在我的 pods 中安装 /etc/php.ini。 为此,我在我的项目中创建了以下 K8S 对象。
Configmap(之前为 Deployment 创建):
- apiVersion: v1
kind: ConfigMap
data:
php.ini: |-
[PHP]
;;;;;;;;;;;;;;;;;;;
; About php.ini ;
;;;;;;;;;;;;;;;;;;;
metadata:
name: php-ini
部署对象:
- kind: Deployment
apiVersion: apps/v1
metadata:
name: privatebin
labels:
app: privatebin
spec:
replicas: 1
selector:
matchLabels:
app: privatebin
template:
metadata:
creationTimestamp: null
labels:
app: privatebin
deploymentconfig: privatebin
spec:
containers:
- name: privatebin
image: <my container registry>/privatebin:${IMAGE_TAG}
volumeMounts:
- name: config-volume
mountPath: php.ini
livenessProbe:
exec:
command:
- /bin/sh
- -c
- "[ -f /run/nginx.pid ] && ps -C nginx >/dev/null 2>&1 && ps -C php-fpm >/dev/null 2>&1"
initialDelaySeconds: 10
periodSeconds: 5
readinessProbe:
httpGet:
scheme: HTTP
path: /
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
ports:
- containerPort: 8080
protocol: TCP
resources:
limits:
cpu: "250m" # parameterize in tekton pipeline
memory: "368Mi" # parameterize in tekton pipeline, maybe using template
requests:
cpu: "100m" # parameterize in tekton pipeline, maybe using template
memory: "256Mi" # parameterize in tekton pipeline, maybe using template
securityContext:
runAsUser: 1000
fsGroup: 1000
fsGroupChangePolicy: "OnRootMismatch"
imagePullPolicy: Always
restartPolicy: Always
terminationGracePeriodSeconds: 30
volumes:
- name: config-volume
configMap:
name: php-ini
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
由于某种原因,我的 pods 丢失了,并且存在以下错误:
- lastTransitionTime:“2021-10-08T12:53:01Z” 最后更新时间:“2021-10-08T12:53:01Z” 消息:'pods“privatebin-55678c66c5-”被禁止:无法验证 任何安全上下文约束:[spec.containers[0].securityContext.runAsUser: 无效值:1000:必须在以下范围内:[1002460000、1002469999] spec.volumes[0]: 无效值:“configMap”:不允许使用 configMap 卷]'
ReplicaSet 也超时并出现类似的错误: 状态: 条件:
- lastTransitionTime:“2021-10-08T12:53:01Z” 消息:'pods“privatebin-55678c66c5-”被禁止:无法验证 任何安全上下文约束:[spec.containers[0].securityContext.runAsUser: 无效值:1000:必须在以下范围内:[1002460000、1002469999] spec.volumes[0]: 无效值:“configMap”:不允许使用 configMap 卷]'
为什么我无法挂载ConfigMap?是因为 Deployment 中的 Securitycontext 吗?
提前致谢,
您的集群安装了拒绝您的规范的 pod 安全策略。您可以使用 kubectl get psp
获取 psp,然后使用 kubectl describe psp <name>
检查设置。查看设置 volumes
和 runAsUser
.
(该错误与 configmaps 无关,但当您解决错误后,您可能需要稍微调整您的 configmap 以准确地将文件放入您希望它登陆的目录中。)
OKD 是 OpenShift,所以它使用的是 SCC(不是 PSP)。
默认情况下,您可以访问命名空间中的“受限”SCC。错误中抛出的 UID 来自命名空间注释 (oc get namespace FOO -o yaml) 将显示它们。
修复:
- 您可以更改 运行AsUser 以匹配名称空间注释;或者(更好)只使用“运行AsNonRoot: true”,强制它不作为 root 运行 并采用该注释范围内的第一个 uid。您可能需要更新容器映像以利用 GROUP 成员资格而不是 uid 来获得文件访问权限。
- 您可以允许您的帐户使用“非根”SCC 作为任何 uid 运行,满足您对 运行 作为 uid=1000 的期望。我建议您将第一个选项视为更可取的选项。