在 oc 补丁的 jsonpath 中包含变量(openshift CLI 操作)

Include variable in jsonpath for oc patch (openshift CLI operations)

在 bash 中,我正在尝试将 jsonpath 中的变量用于 openshift patch cli 命令:

  OS_OBJECT='sample.k8s.io/element'
  VALUE='5'
  oc patch quota "my-object" -p '{"spec":{"hard":{"$OS_OBJECT":"$VALUE"}}}'

但这给出了错误:

Error from server: quantities must match the regular expression '^([+-]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$'

表示变量不是substituted/expanded.

如果我明确地写它,它就可以工作:

oc patch quota "my-object" -p '{"spec":{"hard":{"sample.k8s.io/element":"5"}}}'

关于如何在 jsonstring 中包含变量有什么建议吗?

编辑: 基于以下答案我也尝试过:

oc patch quota "my-object" -p "{'spec':{'hard':{'$OS_OBJECT':'$VALUE'}}}"

但这给出了错误:

 Error from server (BadRequest): invalid character '\'' looking for beginning of object key string 

在单引号中,所有内容都由 bash 保留,您必须使用双引号来进行字符串插值(并使用转义序列 \" 来表示其他双引号)。

试试这个:

oc patch quota "my-object" -p "{\"spec\":{\"hard\":{\"$OS_OBJECT\":\"$VALUE\"}}}"

而不是 OC patch 更喜欢 OC apply 在你的模板上. 模板是配置 Openshift/Kubernetes 对象 的最佳方式,它可以存储在 git 中,以便版本控制遵循基础架构即代码.

我不是我的 Openshift 集群的管理员,所以无法访问资源配额因此建议在 Kubernetes 中使用一种方法,但同样可以应用于Openshift 也是 ,除了 CLI 从 kubectl 更改为 oc

我们来看一个简单的资源配额模板:

$ cat resourcequota.yaml 
apiVersion: v1
kind: ResourceQuota
metadata:
  name: demo-quota
spec:
  hard:
    cpu: "1"
    memory: 2Gi
    pods: "10"
  scopeSelector:
    matchExpressions:
    - operator : In
      scopeName: PriorityClass
      values: ["high"]

现在使用模板 kubectl apply 配置配额。这将创建在模板中配置的资源,在我们的例子中是 resourcequota

$ kubectl apply -f resourcequota.yaml 
resourcequota/demo-quota created

$ kubectl get quota
NAME         CREATED AT
demo-quota   2019-11-19T12:23:37Z

$ kubectl describe quota demo-quota
Name:       demo-quota
Namespace:  default
Resource    Used  Hard
--------    ----  ----
cpu         0     1
memory      0     2Gi
pods        0     10

当您使用patch寻找资源配额更新时,我建议在这里编辑模板并执行 kubectl apply 再次更新对象

$ kubectl apply -f resourcequota.yaml 
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
resourcequota/demo-quota configured


$ kubectl describe quota demo-quota
Name:       demo-quota
Namespace:  default
Resource    Used  Hard
--------    ----  ----
cpu         0     2
memory      0     4Gi
pods        0     20

同样,您可以执行 oc apply 您的操作,因为 oc patch 是配置不那么人性化.