【问题标题】:OpenShift oc create fails with "already exists"OpenShift oc create 失败并显示“已经存在”
【发布时间】:2018-03-28 04:13:36
【问题描述】:

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

根据docs hereoc create应该:

解析配置文件并创建一个或多个 OpenShift Enterprise objects ... 任何现有资源都会被忽略。

(强调我的)。

我看不到此命令的任何配置选项,也看不到会改变此行为的全局配置选项,在我看来这与文档相反。

我运行的命令是oc create -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 项目的状态。

【问题讨论】:

    标签: kubernetes openshift


    【解决方案1】:

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

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

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

    此外,当您创建一组资源时,通常最好在所有资源类型中使用一个名称,而不是为每个资源类型使用不同的名称,例如,仅使用“my-app-name”所有这些,而不是单独的,'my-buildconfig','my-imagestream'。

    更重要的是,您需要确保在所有标签上添加具有相同键/值的标签,以便轻松将它们一起使用,包括一次性删除它们。

    您尝试部署的应用程序类型是什么?我可以向您指出可以用作指南的示例模板。


    更新 1

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

    【讨论】:

    • 对不起,我真正想做的是“创建”相同的资源(如果它们不存在)。本质上试图将其用作幂等调用,以确保资源集存在一次,而不是重新创建它们。它不会忽略该尝试,而是引发错误。值得注意的是,我实际上对每个资源都使用了相同的名称,我只是将上面的内容用作(糟糕的)示例。他们每个都有一个标签也是如此。
    • 尝试使用“oc apply”而不是“oc create”。如果它不存在,它将被创建。如果存在,它将更新为您尝试将其设置为的内容。如果不希望当前设置的内容与尝试设置的内容相匹配,请查看oc apply--overwrite=false 选项是否达到您想要的效果。
    • 哦,完美,这似乎是我真正想要的!您介意将其添加到您的答案中,以便我接受吗?
    【解决方案2】:

    oc replace怎么样:

    oc replace --filename file.yml --force
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-13
      • 1970-01-01
      • 2018-11-11
      • 2014-08-29
      • 2019-05-27
      • 1970-01-01
      • 2016-10-28
      相关资源
      最近更新 更多