首页 > 解决方案 > 正确的 Kubernetes 迁移 YAML 格式

问题描述

我有一个 YAML 文件,如下所示,我从现有集群中导出了该文件:

apiVersion: v1
items:
- apiVersion: v1
  kind: ServiceAccount
  metadata:
    creationTimestamp: 2019-03-20T23:17:42Z
    name: default
    namespace: dev4
    resourceVersion: "80999"
    selfLink: /api/v1/namespaces/dev4/serviceaccounts/default
    uid: 5c6e0d09-4b66-11e9-b4e3-0a779a87bb40
  secrets:
  - name: default-token-tl4dd
- apiVersion: v1
  kind: ServiceAccount
  metadata:
    annotations:
      kubectl.kubernetes.io/last-applied-configuration: |
        {"apiVersion":"v1","kind":"ServiceAccount","metadata":{"annotations":{},"name":"pod-labeler","namespace":"dev4"}}
    creationTimestamp: 2020-04-21T05:46:25Z
    name: pod-labeler
    namespace: dev4
    resourceVersion: "113455688"
    selfLink: /api/v1/namespaces/dev4/serviceaccounts/pod-labeler
    uid: 702dadda-8393-11ea-abd9-0a768ca51346
  secrets:
  - name: pod-labeler-token-6vgp7
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""

如果我执行上述 YAML 并应用于新集群,则会收到错误,这超出了此问题的范围。

总之,我必须摆脱以下属性:

uid:
selfLink:
resourceVersion:
creationTimestamp:

所以我得到了一个像下面这样的 sed 命令

sed -i '/uid: \|selfLink: \|resourceVersion: \|creationTimestamp: /d' dev4-serviceaccounts.yaml

最终的 YAML 文件如下所示:

apiVersion: v1
items:
- apiVersion: v1
  kind: ServiceAccount
  metadata:
    name: default
    namespace: dev4
  secrets:
  - name: default-token-tl4dd
- apiVersion: v1
  kind: ServiceAccount
  metadata:
    annotations:
      kubectl.kubernetes.io/last-applied-configuration: |
        {"apiVersion":"v1","kind":"ServiceAccount","metadata":{"annotations":{},"name":"pod-labeler","namespace":"dev4"}}
    name: pod-labeler
    namespace: dev4
  secrets:
  - name: pod-labeler-token-6vgp7
kind: List
metadata:

我的问题是,它是否是正确的 YAML 文件,因为它删除了元数据的空标签和值......(在 YAML 文件的最后)

我可以创建对象 - 在这种情况下为 serviceaccounts,但我只想确保我所做的是否正确或任何其他更好的方法。

标签: kubernetesyaml

解决方案


在这种特定情况下,这是正确的,但您需要小心处理,因为对于所有类型的资源没有一致的方法来执行此操作。

从历史上看,kubectl 有 --export 标志,它正在生成准备应用的 yaml,但由于许多错误,它被贬低了。查看k8s github repo 上的问题以获取更多详细信息。

kubectl apply如果您曾经创建它,还有另一种导出资源的方法。

kubectl apply view-last-applied <api-resource> <name> -oyaml
e.g.:
kubectl apply view-last-applied serviceaccount pod-labeler -oyaml

但请记住,这不适用于使用 helm 或其他工具创建的资源。

您可以做的最好的事情是始终将所有源文件保存在 git 或类似文件中,这样您就不需要导出它。


推荐阅读