kubernetes - 正确的 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,但我只想确保我所做的是否正确或任何其他更好的方法。
解决方案
在这种特定情况下,这是正确的,但您需要小心处理,因为对于所有类型的资源没有一致的方法来执行此操作。
从历史上看,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 或类似文件中,这样您就不需要导出它。
推荐阅读
- php - laravel orm mult 在哪里覆盖条件
- java - KeyListener 错误 - 类不覆盖
- r - 数据表:通过检查多行上的多列来创建新列
- php - 基于 Woocommerce 中用户角色的运费折扣
- sql - 不包含指定表达式作为聚合视图的一部分 - 这是什么意思?
- javascript - 在画布(js)中超时改变的颜色/ setInterval 的问题
- maven - TomEE 7.0.5 - 正确排除 JSF 2.2 jar 并包含 JSF 2.3 jar
- git - 致命:请求的 URL 返回错误:403 权限被拒绝
- exception - VB6 可执行文件在 Windows 8 和 10 中间歇性崩溃 - 对 WinDbg 有疑问
- python-3.x - PyCharm 未解决的导入参考?