Kubernetes OpenShift oc create失败,返回“0”;“已经存在”;

Kubernetes OpenShift oc create失败,返回“0”;“已经存在”;,kubernetes,openshift,Kubernetes,Openshift,如果资源已经存在,则尝试通过occreate基于文件创建一组资源将失败 根据oc,创建应: 解析配置文件并创建一个或多个OpenShift Enterprise 对象忽略任何现有资源。 (我的重点) 我看不到该命令的任何配置选项,也看不到会改变此行为的全局配置选项,在我看来,这似乎与文档背道而驰 我运行的命令是occreate-f some.file 输出为: Error from server: services 'my-app' already exists Error from serve

如果资源已经存在,则尝试通过
occreate
基于文件创建一组资源将失败

根据oc,创建应:

解析配置文件并创建一个或多个OpenShift Enterprise 对象忽略任何现有资源。

(我的重点)

我看不到该命令的任何配置选项,也看不到会改变此行为的全局配置选项,在我看来,这似乎与文档背道而驰

我运行的命令是
occreate-f some.file

输出为:

Error from server: services 'my-app' already exists
Error from server: buildconfigs 'my-app' already exists
Error from server: imagestreams 'my-app' already exists
Error from server: deploymentconfigs 'my-app' already exists
Error from server: routes 'my-app' already exists
Error from server: secrets 'my-app' already exists
它还以非零退出代码退出,因此它不仅仅是一个警告。我是否遗漏了一些明显的信息,或者误解了文档中的内容


我只是希望能够应用此文件,并确保OpenShift项目的状态在之后。

文档可能有点措词不当。它的意思是,如果您尝试创建一个特定类型的对象,而该类型的对象已经存在,那么您创建新对象的尝试将被忽略

如果试图从相同的原始资源定义创建应用程序的多个实例,就会出现这种情况。无法从一组原始资源定义中使用
occreate-f
覆盖命令行中的名称,因此第二次部署是不同的

如果要从同一资源定义创建多个实例,需要做的是将定义转换为模板并对名称进行参数化,以便可以为不同的实例传递不同的名称。这样就不会有冲突

此外,当您创建一组资源时,通常最好在所有资源类型中使用一个名称,而不要对每个资源类型使用不同的名称,例如,对所有资源类型仅使用“我的应用程序名称”,而不是单独使用“我的buildconfig”、“我的imagestream”

更重要的是,您需要确保在所有标签上添加具有相同键/值的标签,以便能够轻松地与它们一起工作,包括一次性删除它们

您尝试部署的应用程序类型是什么?我可能会向您介绍一些示例模板,您可以将其用作指南


更新1

如果您希望能够运行
oc create-f
,并且不抱怨资源是否已存在,而是在资源不存在时创建它们,请改用
oc apply-f

如何使用:


对不起,我实际上想做的是“创建”相同的资源(如果它们不存在的话)。本质上,尝试将其用作幂等调用,以确保资源集只存在一次,而不是重新创建它们。它不会忽略该尝试,而是抛出错误。值得注意的是,我确实为每个资源使用了相同的名称,我只是将上面的例子用作(糟糕的)示例。同样的道理也适用于每个标签。请尝试使用“oc apply”而不是“oc create”。如果它不存在,将创建它。如果它存在,它将被更新为您试图设置的内容。如果不希望当前设置与试图设置的匹配,请查看
--overwrite=false
选项到
oc apply
是否达到您的要求。哦,太好了,这似乎是我真正想要的!你介意把它加到你的答案里吗?这样我就可以接受了?
oc replace --filename file.yml --force