Kubernetes Openshift“oc apply”是覆盖整个配置还是仅覆盖包含的参数?

Kubernetes Openshift“oc apply”是覆盖整个配置还是仅覆盖包含的参数?,kubernetes,openshift,Kubernetes,Openshift,我们当前正在使用以下命令更新Openshift中的configmap设置,然后重新启动POD以使设置生效: oc apply -f configmap.yml 我的问题是: 此命令是否会删除现有的configmap并将其替换为此文件的内容,还是仅从该文件导入设置并保留任何其他设置不变 基本上,如果live configmap包含设置mytest:true且新文件不包含参数mytest,则该参数是否保留在Openshift中的live configmap中,还是因为未在导入的文件中列出而被删除?

我们当前正在使用以下命令更新Openshift中的configmap设置,然后重新启动POD以使设置生效:

oc apply -f configmap.yml
我的问题是:

此命令是否会删除现有的configmap并将其替换为此文件的内容,还是仅从该文件导入设置并保留任何其他设置不变

基本上,如果live configmap包含设置mytest:true且新文件不包含参数mytest,则该参数是否保留在Openshift中的live configmap中,还是因为未在导入的文件中列出而被删除?

oc apply计算并应用对象之间的差异:

它在以下各项之间执行三向合并:

命令的输入

对象的当前版本,以及

最新的用户指定对象定义存储为 当前对象中的注释

然后使用结果更新现有对象

文档中还有更多内容。

oc应用计算并应用对象之间的差异:

它在以下各项之间执行三向合并:

命令的输入

对象的当前版本,以及

最新的用户指定对象定义存储为 当前对象中的注释

然后使用结果更新现有对象


文档中还有更多内容。

我复制了您的案例,在使用不同的configmap设置应用新的yaml后,新版本正在生成。所以OpenShift不是在合并configmap,而是在替换

让我们一起度过难关吧

kind: ConfigMap
apiVersion: v1
metadata:
  name: example-config
data: 
  mytest0: "HELLO"
  mytest1: "STACK"
  mytest2: "COMMUNITY"
  mytest3: "!!!"
oc应用-f configmap_lab.yaml

正如我们所看到的,我们已经按预期包括了所有内容:

$ oc get configmap/example-config -o yaml
apiVersion: v1
data:
  mytest0: HELLO
  mytest1: STACK
  mytest2: COMMUNITY
  mytest3: '!!!'
kind: ConfigMap
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","data":{"mytest0":"HELLO","mytest1":"STACK","mytest2":"COMMUNITY","mytest3":"!!!"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"example-config","namespace":"myproject"}}
  creationTimestamp: 2020-01-09T10:42:11Z
  name: example-config
  namespace: myproject
  resourceVersion: "7987774"
  selfLink: /api/v1/namespaces/myproject/configmaps/example-config
  uid: b148dbef-32cc-11ea-9339-525400d653ae
现在,让我们在此基础上部署一个新的yaml:

kind: ConfigMap
apiVersion: v1
metadata:
  name: example-config
data: 
  mytest0: "THANKS"
  mytest1: "STACK"
  newmytest0: "COMMUNITY"
  newmytest1: "!!!"
在这里,我们将更改该值,删除2个参数并添加2个参数。让我们看看OC将如何处理:

oc apply -f configmap_lab_new.yaml
正如我们所注意到的,所有的变更都被接受并被激活


不过,如果您想以更可控的方式进行此操作,您可能需要使用oc patch

我复制了您的案例,在使用不同的configmap设置应用了新的yaml之后,新版本正在生成。所以OpenShift不是在合并configmap,而是在替换

让我们一起度过难关吧

kind: ConfigMap
apiVersion: v1
metadata:
  name: example-config
data: 
  mytest0: "HELLO"
  mytest1: "STACK"
  mytest2: "COMMUNITY"
  mytest3: "!!!"
oc应用-f configmap_lab.yaml

正如我们所看到的,我们已经按预期包括了所有内容:

$ oc get configmap/example-config -o yaml
apiVersion: v1
data:
  mytest0: HELLO
  mytest1: STACK
  mytest2: COMMUNITY
  mytest3: '!!!'
kind: ConfigMap
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","data":{"mytest0":"HELLO","mytest1":"STACK","mytest2":"COMMUNITY","mytest3":"!!!"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"example-config","namespace":"myproject"}}
  creationTimestamp: 2020-01-09T10:42:11Z
  name: example-config
  namespace: myproject
  resourceVersion: "7987774"
  selfLink: /api/v1/namespaces/myproject/configmaps/example-config
  uid: b148dbef-32cc-11ea-9339-525400d653ae
现在,让我们在此基础上部署一个新的yaml:

kind: ConfigMap
apiVersion: v1
metadata:
  name: example-config
data: 
  mytest0: "THANKS"
  mytest1: "STACK"
  newmytest0: "COMMUNITY"
  newmytest1: "!!!"
在这里,我们将更改该值,删除2个参数并添加2个参数。让我们看看OC将如何处理:

oc apply -f configmap_lab_new.yaml
正如我们所注意到的,所有的变更都被接受并被激活


不过,如果您想以更可控的方式进行此操作,您可能需要使用oc patch

我给了你+1分,谢谢你的尝试。我本以为问这个问题的用户会先尝试一下。。。无论如何-这似乎与我在回答中链接到的文档相矛盾,但这并不是ConfigMap-s所特有的。我想自己尝试一下,而且必须尝试一下,但目前我的任务太多了。奇怪的是,现在我有三个相互冲突的规则:我们的经验是,如果导入的文件中不存在变量,那么它将保持不变。官方文件谈到了合并,这似乎支持这一点。然后我们这里有一个测试,显示变量被删除了。Openshift和oc版本之间的这种行为可能有这么大的不同吗?+1来自我的试用。我本以为问这个问题的用户会先尝试一下。。。无论如何-这似乎与我在回答中链接到的文档相矛盾,但这并不是ConfigMap-s所特有的。我想自己尝试一下,而且必须尝试一下,但目前我的任务太多了。奇怪的是,现在我有三个相互冲突的规则:我们的经验是,如果导入的文件中不存在变量,那么它将保持不变。官方文件谈到了合并,这似乎支持这一点。然后我们这里有一个测试,显示变量被删除了。Openshift和oc版本之间的这种行为可能有这么大的不同吗?