我有一个图像,需要根特权才能启动。
现在,我正试图将其部署到OpenShift上。
这是我用来部署它的部署yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: xyz
annotations:
k8s.v1.cni.cncf.io/networks: macvlan-conf
spec:
selector:
matchLabels:
name: xyz
template:
metadata:
labels:
name: xyz
spec:
containers:
- name: xyz
image: 172.30.1.1:5000/myproject/xyz@sha256:bf3d219941ec0de7f52f6babbca23e03cc2611d327552b08f530ead9ec627ec2
imagePullPolicy: Always
securityContext:
capabilities:
add:
- ALL
privileged: false
allowPrivilegeEscalation: false
runAsUser: 0
serviceAccount: runasanyuid
serviceAccountName: runasanyuid
hostNetwork: true
resources:
limits:
memory: "12000Mi"
requests:
memory: "6000Mi"
ports:
- containerPort: 2102
command:
- /usr/sbin/sshd -D请注意,我已经创建了一个名为“SCC”的scc,以运行我正在处理的任何UID项目中的pods,因为我知道OpenShift默认不允许pods以root权限启动。
kind: SecurityContextConstraints
apiVersion: v1
metadata:
name: scc-admin
allowPrivilegedContainer: true
runAsUser:
type: RunAsAny
seLinuxContext:
type: RunAsAny
fsGroup:
type: RunAsAny
supplementalGroups:
type: RunAsAny
users:
- developer
groups:
- developer这就是我在互联网上发现的解决我问题的方法,但我想它也没有起作用。
[root@centos72_base ~]# oc get scc
NAME PRIV CAPS SELINUX RUNASUSER FSGROUP SUPGROUP PRIORITY READONLYROOTFS VOLUMES
anyuid true [] MustRunAs RunAsAny RunAsAny RunAsAny 10 false [configMap downwardAPI emptyDir hostPath persistentVolumeClaim projected secret]
hostaccess false [] MustRunAs MustRunAsRange MustRunAs RunAsAny <none> false [configMap downwardAPI emptyDir hostPath persistentVolumeClaim projected secret]
hostmount-anyuid false [] MustRunAs RunAsAny RunAsAny RunAsAny <none> false [configMap downwardAPI emptyDir hostPath nfs persistentVolumeClaim projected secret]
hostnetwork false [] MustRunAs MustRunAsRange MustRunAs MustRunAs <none> false [configMap downwardAPI emptyDir persistentVolumeClaim projected secret]
nonroot false [] MustRunAs MustRunAsNonRoot RunAsAny RunAsAny <none> false [configMap downwardAPI emptyDir persistentVolumeClaim projected secret]
privileged true [*] RunAsAny RunAsAny RunAsAny RunAsAny <none> false [*]
restricted false [] MustRunAs MustRunAsRange MustRunAs RunAsAny <none> false [configMap downwardAPI emptyDir persistentVolumeClaim projected secret]
scc-admin true [] RunAsAny RunAsAny RunAsAny RunAsAny <none> false [awsElasticBlockStore azureDisk azureFile cephFS cinder configMap downwardAPI emptyDir fc flexVolume flocker gcePersistentDisk gitRepo glusterfs iscsi nfs persistentVolumeClaim photonPersistentDisk portworxVolume projected quobyte rbd scaleIO secret storageOS vsphere]
[root@centos72_base ~]#还请注意,使用下面的命令,这个映像对docker很好地工作。
docker run -d --network host --privileged --cap-add=ALL --security-opt seccomp=unconfined --name xyz 172.30.1.1:5000/myproject/xyz /usr/sbin/sshd -D[root@centos72_base ~]# docker ps | grep xyz
793e339ff732 172.30.1.1:5000/myproject/xyz "/usr/sbin/sshd -D" About a minute ago Up About a minute xyz在OpenShift上,我在上面提供的部署文件中获得了这些错误
创建
错误: "xyz-7966f58588-“被禁止:无法针对任何安全上下文约束进行验证:无效值: 0:必须在范围内: 1000140000,1000149999 capabilities.add:无效值:"ALL":功能可能不添加]
这意味着我必须移除
capabilities:
add:
- ALL和
runAsUser: 0启动吊舱
当我将它们从yaml文件中删除时,我会从吊舱中得到一个崩溃回环错误。
所以有人能帮我吗?
发布于 2021-07-27 19:07:12
您创建的SCC当前应用于用户developer和组developer。
您的部署使用ServiceAccount runasanyuid。
您需要编辑您的SecurityContextConstraint,允许ServiceAccount:
[...]
users:
- developer
- system:serviceaccount:<namespace-for-your-deployment>:runasanyuid
groups:
- developer顺便提一句,如果您只需要运行一个特权容器,OpenShift不需要创建自己的SCC,而是附带可以重用的anyuid容器--只需将SA添加到它的用户列表中即可。
而最好的做法是避免特权容器。除非有一个很好的理由,否则您不应该以根用户身份运行进程--早在OCI之前,这是正确的。
如果您的应用程序需要在某个地方编写一些东西,您可以使用一些emptyDir卷。如果应用程序试图在特权端口上绑定,则应该能够重新配置它。如果您的应用程序抱怨无法解析其UID的用户名,则可以查看its包装器。慎重考虑,授予SecurityContextConstraints或PodSecurityPolicies的特权并不是常态,它们应该是例外。
如果您的Pod在作为非root用户运行时崩溃,请尝试检查其日志。如果这没有帮助,请尝试oc debug -n <namespace> pod/<podname>,它应该启动一个新的Pod,打开一个shell,在其中您可以自己执行它的入口点,可能尝试另一组选项,稍微改变配置,.直到你把它弄对。您甚至可以尝试从您的工作站docker run --user=12435679 xxx:传递一个随机的UID,看看您的容器/应用程序如何处理它。
发布于 2021-07-28 13:27:45
这就是我如何解决问题并解决它的方法:
在调试模式下,我使用
[root@centos72_base ~]# oc debug -n myproject pod/xyz-5b4875f8d7-n7m2g
Defaulting container name to xyz.
Use 'oc describe pod/xyz-5b4875f8d7-n7m2g-debug -n myproject' to see all of the containers in this pod.
Debugging with pod/xyz-5b4875f8d7-n7m2g-debug, original command: /usr/sbin/sshd -D
Waiting for pod to start ...
If you don't see a command prompt, try pressing enter.
sh-4.2# whoami
whoami: cannot find name for user ID 1000140000
sh-4.2$ 我想这个吊舱不是带根特权运行的。
我必须检查我的吊舱正在工作的SCC所以我执行了
[root@centos72_base ~]# oc get pod xyz-5b4875f8d7-n7m2g -o yaml | grep openshift.io/scc
openshift.io/scc: restricted我看到我的荚仍然在受限SCC中,所以我不得不使用
[root@centos72_base ~]# oc adm policy add-scc-to-group privileged system:authenticated
scc "privileged" added to groups: ["system:authenticated"]
[root@centos72_base ~]# 现在我可以看到它变成了特权(我知道它不是最好的实践,但我只是想确保吊舱能够运行,最好的做法是用非根特权运行荚)。
在再次运行部署之后,我再次检查SCC,发现它现在使用特权SCC运行。
[root@centos72_base ~]# oc get pod xyz-5b4875f8d7-n7m2g -o yaml | grep openshift.io/scc
openshift.io/scc: privileged然后,我在调试模式下进入pod,以检查我是否正在与root用户一起运行pod。
[root@centos72_base ~]# oc debug -n myproject pod/xyz-5b4875f8d7-n7m2g
Defaulting container name to xyz.
Use 'oc describe pod/xyz-5b4875f8d7-n7m2g-debug -n myproject' to see all of the containers in this pod.
Debugging with pod/xyz-5b4875f8d7-n7m2g-debug, original command: /usr/sbin/sshd -D
Waiting for pod to start ...
If you don't see a command prompt, try pressing enter.
sh-4.2# whoami
root
sh-4.2# 我不建议使用它作为这个问题的默认解决方案,我只是使用它来测试并确保我的应用程序在OpenShift上工作。
以下是帮助我的命令列表:在调试模式下运行pod:
oc debug -n <project-name> pod/<pod-name>在具有根优先级的调试模式下运行pod:
oc debug deployment/<deployment-name> --as-root -n <project-name>列出您的安全上下文:
oc get scc打开pod的yaml文件:
oc get pod <pod-name> -o yaml 若要列出其scc:
oc get pod <pod-name> -o yaml | grep openshift.io/scc若要设置默认scc,请执行以下操作:
oc adm policy add-scc-to-group <scc-name> system:authenticatedhttps://stackoverflow.com/questions/68543425
复制相似问题