【发布时间】:2021-05-11 10:58:32
【问题描述】:
Redhat Openshift 自动创建一系列可在给定命名空间中使用的用户 ID,例如
$ oc describe namespace xyz-123
Name: xyz-123
Labels: <none>
Annotations: xx.com/accountID: id-testcluster-account
xx.com/type: System
openshift.io/sa.scc.mcs: s0:c25,c20
openshift.io/sa.scc.supplemental-groups: 1000640000/10000
openshift.io/sa.scc.uid-range: 1000640000/10000
问题来了:
在创建 docker 镜像时,我在 Dockerfile 中设置 USER id:
USER 1001121001:1001121001
我在 Helm 图表中指定 runAsUser 来部署此映像:
runAsUser : 1001121001
当我尝试创建部署时,部署失败。因为用户 ID 1001121001 不在上述范围内,即 [1000640000, 1000640000+10000]。
部署错误:
$ oc get deployment abc-123 -n xyz-123 -o yaml
....
....
message: 'pods "abc-123-7f8fc74765-" is forbidden: unable to validate against any security context constraint: [spec.containers[0].securityContext.runAsUser: Invalid value: 1000321001: must be in the ranges: [1000660000, 1000669999]]'
....
....
尝试过的选项 - 1:
使用 anyuid 的工作方式如下所述:https://www.openshift.com/blog/a-guide-to-openshift-and-uids 但文件说: “在仔细检查‘anyuid’ SCC 后,很明显,任何用户和任何组都可以被具有访问‘anyuid’ SCC 的 ServiceAccount 启动的 Pod 使用。‘RunAsAny’ 策略有效地跳过了默认的 OpenShift限制和授权允许 Pod 选择任何 ID。”
因此,我不想使用这个 anyuid 选项。
尝试了选项 2: 创建命名空间后,获取该命名空间允许的范围并从该范围中选择一个 id(比如 1000660000),并在部署时通过为 runAsUser 设置该 id 来使用它:1000660000。
docker 映像中的所有文件/文件夹的所有权/权限都设置为 USER 1001121001,并且容器以 id 1000660000 启动,因此由于读/写/执行权限,运行容器会出现问题。 为了克服这个问题,我需要为所有文件授予 o+rwx 权限,这是有风险的。
有没有其他方法可以在 Dockerfile 中指定 USER 并在 Redhat Openshift 中部署时使用相同的 USER id?
$ oc version
Client Version: 4.6.9
Server Version: 4.6.9
Kubernetes Version: v1.19.0+7070803
解决方案: Ritesh 的建议奏效了。 创建了指定 UID 范围并覆盖特定 USER ID 的命名空间。然后在这个命名空间中创建部署:
在部署到命名空间之前,创建了一个具有预定义用户 ID 范围(覆盖特定 USER id 1001121001)的命名空间。
apiVersion: v1
kind: Namespace
metadata:
name: xyz-123
annotations:
annotations:
openshift.io/sa.scc.mcs: 's0:c26,c5'
openshift.io/sa.scc.supplemental-groups: 1001120001/10000
openshift.io/sa.scc.uid-range: 1001120001/10000
【问题讨论】: