这篇文章描述了一个BreakingChangein RunCV1.0.0-RC93,随后具有WorkAroundImplemented,该工作方法将是v1.0.0-rc94中的值得包含的。感谢@Haircommander通过与我的恐惧谈话并实施随后的解决方法,并在@Mattomata上咨询分发/静态:NOROOTBEAMAVIOR。如果您在问题的后台进行了无谓者,您可以跳过阅读这篇文章并查看我的Crosslanerepo上的详细测试场景,或者我与DistrolessRepo上的Nonroot Image冲突的细目。
最近,交叉平面用户报告说,他们将其寄出到最新版本的OpenShift和Their Pods开始立即进入CrashloopBackoff.they返回并验证了相同版本的Cradlepane在旧的OpenShift版本上运行,但现在容器是出现的:
level =错误msg =" container_linux.go:366:启动容器过程导致:Chdir到CWD(\" / home / nonroot \")在config.json中设置了:权限被拒绝&#34 ;
幸运的是,虽然这个错误对于那些不是容器运行时内部的人来说是非常详细的,但是对于ITPROVIDE文件名,行号和显式表达式的ActionStapsaused aftably,它非常有用。大多数kubernetes平台这些天气使用container作为他们的“高级”containerRuntime,并runc作为他们的“低级”容器运行时。我不会对每个人的文字进行太多细节(我建议您查看此博客IAN LEWIS),而是一个极其简单的解释,ContaintROD通过RUNC管理的生命周期管理的容器。此错误与实际上启动容器有关,这是我们正在处理Runc的Adead赠品,但如果您不确定它可以通过查看Container_Linux.Go来源来确认。
一个容器基本上只是一个Linuxpect使用命名空间和cgroups的沙盒。这意味着它们具有与任何其他进程具有相同的属性,包括状态,各种标识符,调度条件和更多(如果要了解一个进程的所有属性,请查看Task_Structin Linux内核源是一个伟大的冒险)。 OCI映像允许您批准其中一些属性,然后通过ContainErruntime强制强制执行这些属性,在这种情况下是Runc。
不幸的是(或幸运的是,根据您的观察方式),可以在容器编排器的各个级别中定义TheStributes,特别是建立时间和运行时间。例如,在Dockerfile中,您可以定义用户,WorkDir和Restspoint,但您也可以使用所构建的图像运行容器时覆盖。同样,KubernetEsexpose通过Fields Mutims RunasUser,RunasGroup和WorkingDir中的POD规范中的一些这些属性。这允许最高次数,但也可以导致在构建广播的图像或在群集中运行第三方图像时的岩石用户体验。
所以回到原始问题:用于运行交叉平面内化进程的参数尚未更改,但运行频率已失败它们。再次查看错误消息,我们可以将RUNC ISSUSINABLE到CHDIR到CHDIR(或Dockerfile Parlance中的Workdir)。当Acontainer启动时,Runc必须标识以图形方式指定的CWD,或者在容器Orchestrator中覆盖,然后在实际启动过程之前切换到该目。由于此步骤目前失败,因此runc如何执行它。
在Red Hat BugTracker中查看此问题,我们可以看到近来的incangein runc切换了与容器图像指定的runc toute UID的UID执行CHDIR步骤(或者被ContainerOrchestrator覆盖)。但是,为什么这一变化主要导致在分布/静态上的图像的问题:nonroot basimimage?要了解,Wemust首先要查看基础图像的构建方式。
Distroless项目的目的是提供具有应用程序运行所需的最终组件的基础图像。许多常见的基本图像(例如Alpine)被剥离了大部分的全部Linux分布,但仍有许多工具和Unifitiesthat不需要,如果容器仍然存在,则不必要的攻击向量。因此,不再包装了一个关于去应用程序的安全性,是CA-Certificates和Tzdata等包装。Distroless项目还提供了这种裸骨图像的非热变量,这与静态相同,但设置了SUTOSORO NOROOT(UID) = 65532),以及与/ home / nonroot的工作目录。
注意:这些图像使用Bazel构建,但是您可以了解.bzl文件如何通过查看Docker规则来映射到DockerFile的DockerFile如何映射到DockerFile。
使用0700权限创建/ home / nonroot目录,这意味着权限(nonroot)已读取,写入和执行对图中的权限,但其他用户甚至是同一组中的用户,也没有权限。订单到CHDIR ,调用进程必须在Thetarget目录上执行权限。在这种情况下,只有UID 65532具有那些权限,但是NOROOT图像为我们设置用户,以便不应该是一个问题?
如前所述,有时在运行时覆盖构建时属性,并且在OpenShift上覆盖,此类总是覆盖的。当在OpenShift群集中创建命名空间时,ITIS给定一系列UID和GID,以及在命名空间中部署的每个POD都被分配了该范围内的第一个UID和GID。但是,这是OpenShift中的效果,因此如果65532 UID在旧版本中已经WisoverRiddensid,为什么能够开始才能才能才能才能才能
原因在于,较新版本的OpenShift升级到Runc V1.0.0-RC93,其中包含与容器用户的上述更改为CHDIR,而不是用于RUNC进程本身的用户。除非RooLseMedMode,Runc运行root用户,它通常具有特殊的特权功能,如允许它绕过权限。因此,虽然旧oppenshift版本仍然使用“随机”uid,但是由于底层的raccersion正在作为root执行的chdir,因此它不会导致许可证的错误。
此更改是否是一个功能,或者错误主要是如何interintprets集装箱运行时的职责。但是,无论是“正确”,它是一个突破变化,对集装箱生态系统的相当重要的信息,这导致了随后推出的,推出将被推出在V1.0.0-RC94中。作为非目的基础图像的福电流用户,尽管我在DistrolessRepo上有一个问题,但我不期望(也不推荐)对图像配置进行的更改。图像的特点是强制使用单个非透明用户的使用,索明可以不打破原始意图。相反,如果您同意Red Hat的断言(Seethe“传统应用程序和UID),则应用程序不应该”期待他们将运行的特定UID“,是使用普通打败/静态图像和手动设置的可行替代品UID = 65532 inyour的图像构建,有效地说“默认情况下,您将作为NONROOT运行,但如果您知道您正在做什么,您可以自由地覆盖”。这是我们最近的交叉平面释放的方向。
希望这篇文章成为遇到问题的其他人的有用指南。 我想向所有工作的人喊出巨大的喊叫,这些人像符合runc和containerd那样,这是云本机景观的大部分地区的基础。 当吹气性行为发生变化时,我鼓励人们用恩典和构造反应回应。 通常,根据这种变化,如符合这一变化,即使它可能导致短期术语,新行为也在保护用户的兴趣中。