Kubectl Export已被弃用。是否有替代方法?

42

我正在寻找一种方法从部署的组件中导出一个yaml文件,但不包含集群特定的信息。

kubectl get MYOBJECT --export -o yaml > my.yaml

但是,由于“导出”现在已经被弃用(自1.14版以来应该通常会在1.18版中消失(在更改日志中找不到它),那么是否有替代方法?

谢谢


1
kubectl get ... -o yaml | kubectl neat - guettli
11个回答

15

使用JQ就可以解决问题。

kubectl get secret <secretname> -ojson | jq 'del(.metadata.namespace,.metadata.resourceVersion,.metadata.uid) | .metadata.creationTimestamp=null'

生成的JSON与原始内容完全相同。

kubectl get secret <secretname> -ojson --export

1
以下是关于编程的相关内容的翻译:在这个例子中,进行了更多的清理和名称更改。kubectl get secret my-source-secret -n -my-source-ns -ojson | jq 'del(.metadata.namespace,.metadata.resourceVersion,.metadata.uid,.metadata.selfLink,.metadata.managedFields,.metadata.annotations."kubectl.kubernetes.io/last-applied-configuration") | .metadata.creationTimestamp=null | .metadata.name="my-new-secret-name"' | kubectl apply -n target-ns -f - - Tilo

13

终于有一个易于使用的工具被创建了:https://github.com/itaysk/kubectl-neat

您可以轻松地将其安装为kubectl krew插件:

kubectl krew install neat

使用方法也非常简单

kubectl get pod mypod -o yaml | kubectl neat

2
哦,kubectl-neat的命名确实恰如其分。它非常整洁。在更新基础设施即代码时,它会产生巨大的影响。感谢您添加了那个链接! - ingernet
除了我没有看到“status”键。 - Ciasto piekarz
正常工作。其目的是显示清单而不包含运行时状态。 - demonkoryu

12
如果您想使用YAML输入/输出,可以使用yq。对我而言,这个方法很管用,您可以根据需要添加或删除过滤器。
kubectl get secret "my_secret" -n "my_namespace" --context "my_context" -o yaml \
    | yq d - 'metadata.resourceVersion' \
    | yq d - 'metadata.uid' \
    | yq d - 'metadata.annotations' \
    | yq d - 'metadata.creationTimestamp' \
    | yq d - 'metadata.selfLink'

不妨删除整个元数据并写入新值。 - Sa'ad
1
添加以下这行代码: | yq d - 'metadata.managedFields' - Serge Hartmann
3
如果你和我一样,使用了 yq 4 这个新语法,则以下是相应的语法:kubectl get secret "my_secret" --namespace="my_namespace" -o yaml
| yq e 'del(.metadata.resourceVersion)' -
| yq e 'del(.metadata.uid)' -
| yq e 'del(.metadata.annotations)' -
| yq e 'del(.metadata.creationTimestamp)' -
| yq e 'del(.metadata.selfLink)' -
| yq e 'del(.metadata.managedFields)' -
- Conor

10

由于没有有关默认值和其他实时数据清理的总体指南,因此没有一种一致的方法来执行此操作。这就是为什么它被弃用的原因。您应该将源文件保存在Git或类似的平台上。


7

目前唯一的选项是执行 -o yaml-o json 命令,并删除不必要的字段。


1
实际上,使用以下命令:kubectl get MYOBJECT -o yaml > my.yaml而不是kubectl get MYOBJECT --export -o yaml > my.yaml似乎会产生几乎相同的输出,除了一些额外的字段,这并不会造成任何损害。 - finrod

5
另一种选择是利用注释字段kubectl.kubernetes.io/last-applied-configuration,其中保存了资源的初始应用配置,不包含自动生成的字段。

示例:

kubectl get <resource kind> <resource name> -o yaml | \
yq r - 'metadata.annotations."kubectl.kubernetes.io/last-applied-configuration"'

我收到了“Error: unknown command "r" for "yq"” 的错误信息。我想你是指的 yq e - Prashanth Chandra
也许我们正在使用不同的yq版本,这就是我的意思:https://mikefarah.gitbook.io/yq/v/v2.x/read - Marcelo

4

如果您使用的是 yq v4.x 版本,您可以执行以下操作来获取所需内容:

kubectl get <resource> -n <namespace> <resource-name> -o yaml \
  | yq eval 'del(.metadata.resourceVersion, .metadata.uid, .metadata.annotations, .metadata.creationTimestamp, .metadata.selfLink, .metadata.managedFields)' -

这是真正的整洁(y) - Ciasto piekarz
运行得非常好。一个字段缺少.metadata.generation - Charles Moulliard

0

在最新版本的Kube或Openshift中,Export已经被弃用。我们可以直接按照以下方式进行操作:

 oc get virtualservices -o yaml > project.yaml
 oc get routes -o yaml > project.yaml

2
第二行将覆盖第一行的输出。 - guettli

0

使用零第三方工具的解决方案:

kubectl -n $ns get [resourcetype] [resourcename] |\
 sed '/^  uid: /d; /^  resourceVersion: /d; /^  creationTimestamp: /d; /^  selfLink: /d; /^status:$/Q;'

注意:仅适用于单个资源。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接