为已部署的 Kubernetes 服务获取 YAML?
Posted
技术标签:
【中文标题】为已部署的 Kubernetes 服务获取 YAML?【英文标题】:Get YAML for deployed Kubernetes services? 【发布时间】:2017-10-12 00:17:25 【问题描述】:我正在尝试将我的应用部署到在 Google 容器中运行的 Kubernetes 引擎。
可以在以下位置找到该应用程序:https://github.com/Industrial/docker-znc。
Dockerfile 内置在 Google Container Registry 上的映像中。
我已经通过 + 按钮在 Kubernetes 中部署了应用程序。我没有 YAML 为此。
我在 Kubernetes 中为应用所需的 PEM 文件插入了一个 Secret。
-
我如何获取由 Deployment、Service 和 Pod 创建的 YAML
Kubernetes 通过填写表格?
如何将 Secret 放入我的 Pod 以供使用?
【问题讨论】:
您可以关注本次实验,了解如何导出已部署 k8s 服务的 yaml-youtu.be/Wc9T4tdcsr0 【参考方案1】:获取部署的 yaml(服务、pod、secret 等):
kubectl get deploy deploymentname -o yaml
【讨论】:
知道如何为整个集群(所有部署)执行此操作吗?当然,这个想法是创建具有完全相同服务的镜像环境。 @Sinaesthetic,目前不支持列表导出,而且似乎不会很快推出。您可能需要一个脚本来列出所有资源,然后循环浏览这些资源以构建您的列表。 github.com/kubernetes/kubernetes/issues/… 从 Kubernetes 1.14 开始,--export
已弃用;见here。您可以使用 get -o yaml
而不使用 --export
,尽管这包括有关当前对象状态的信息,以及(重新)配置对象所需的声明性配置。
仍然需要从“-o yaml”生成的yaml中删除一些当前状态,例如spec.clusterIP
和metadata.resourceVersion
在服务中。
--export 选项现在不起作用。需要替代方法【参考方案2】:
如何获取由以下人员创建的 Deployment、Service 和 Pod 的 YAML Kubernetes 通过填表?
kubectl get deployment,service,pod yourapp -o yaml --export
回答@Sinaesthetic 问题:
知道如何为整个集群(所有部署)执行此操作吗?
kubectl get deploy --all-namespaces -o yaml --export
这个方法的问题是 export 不包含命名空间。所以如果你想同时导出多个资源,我建议每个命名空间都这样做:
kubectl get deploy,sts,svc,configmap,secret -n default -o yaml --export > default.yaml
不幸的是 kubernetes still doesn't support 一个真正的 get all 命令,所以你需要手动列出你想要导出的资源类型。您可以使用
获取资源类型列表kubectl api-resources
【讨论】:
kubectl get $(kubectl api-resources | awk 'print $1' | tail -n +2 | tr '\n' ',' | sed s/,\$//) -o yaml > manifest.yaml
【参考方案3】:
at kubernetes GitHub issues page 讨论了同样的问题,用户“alahijani”制作了一个 bash 脚本,导出所有 yaml 并将它们写入单个文件和文件夹。
由于这个问题在 Google 上的排名很高,而且我发现这个解决方案非常好,所以我在这里代表它。
将 yaml 导出到子文件夹的 Bash 脚本:
for n in $(kubectl get -o=name pvc,configmap,serviceaccount,secret,ingress,service,deployment,statefulset,hpa,job,cronjob)
do
mkdir -p $(dirname $n)
kubectl get -o=yaml --export $n > $n.yaml
done
另一个用户“acondrat”制作了一个不使用目录的脚本,这样以后可以很容易地制作一个kubectl apply -f
。
将 yaml 导出到当前文件夹的 Bash 脚本:
for n in $(kubectl get -o=name pvc,configmap,ingress,service,secret,deployment,statefulset,hpa,job,cronjob | grep -v 'secret/default-token')
do
kubectl get -o=yaml --export $n > $(dirname $n)_$(basename $n).yaml
done
最后一个脚本不包含服务帐号。
【讨论】:
【参考方案4】:从 kubernetes 下载 yaml 的语法
kubectl get [resource type] -n [namespace] [resource Name] -o yaml > [New file name]
从正在运行的 pod 创建 yaml 文件:
kubectl get po -n nginx nginx-deployment-755cfc7dcf-5s7j8 -o yaml > podDetail.yaml
从正在运行的 pod 创建副本集 yaml 文件:
kubectl get rs -n nginx -o yaml > latestReplicaSet.yaml
从正在运行的 pod 创建部署 yaml 文件:
kubectl get deploy -n nginx -o yaml > latestDeployement.yaml
【讨论】:
【参考方案5】:现在 --export
已被弃用,要以“原始”格式从资源中获取输出(刚刚清理,没有关于当前对象状态的任何信息(在这种情况下不需要元数据)),您可以执行以下操作使用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)' -
【讨论】:
我喜欢这个,只是一个注 yq 通常不在操作系统上 这是一个更好的解决方案。【参考方案6】:关于秘密的第二个问题,来自 k8s 文档。请参阅https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets 了解更多信息。
-
创建一个秘密或使用现有的。多个 pod 可以引用同一个 secret。
修改您的 Pod 定义以在 spec.volumes[] 下添加一个卷。将卷命名为任何名称,并有一个 spec.volumes[].secret.secretName 字段等于秘密对象的名称。
为每个需要密钥的容器添加一个 spec.containers[].volumeMounts[]。将 spec.containers[].volumeMounts[].readOnly = true 和 spec.containers[].volumeMounts[].mountPath 指定为您希望秘密出现的未使用目录名称。
修改您的图像和/或命令行,以便程序在该目录中查找文件。秘密数据映射中的每个键都成为 mountPath 下的文件名。
我用过这个,效果很好。
【讨论】:
【参考方案7】:也可以使用view-last-applied 命令,例如
kubectl apply view-last-applied services --all > services.yaml
这将返回所有应用于创建服务的清单。您也可以通过 services/resource-name 标签指定某个 k8 资源。
【讨论】:
【参考方案8】: 如上所述,“--export”是获取与 kubeernetes 对象对应的清单的一种选择 但是“--export”被认为是有问题的,并且有人建议弃用它 目前更好的选择是执行“-o yaml”或“-o json”并删除不必要的字段 主要区别在于“--export”预计会删除集群特定设置(例如,k8s 服务的集群服务 IP)。但在这方面发现不一致【讨论】:
【参考方案9】:使用此命令获取服务的 yaml 格式
kubectl get service servicename -n <namespace> -o yaml
你也可以把它放在某个文件里
kubectl get service servicename -n <namespace> -o yaml > service.yaml
【讨论】:
【参考方案10】:以下代码将一次提取所有 K8s 定义并将它们放在当前文件夹下的各个文件夹中。
for OBJ in $(kubectl api-resources --verbs=list --namespaced -o name)
do
for DEF in $(kubectl get --show-kind --ignore-not-found $OBJ -o name)
do
mkdir -p $(dirname $DEF)
kubectl get $DEF -o yaml \
| yq eval 'del(.metadata.resourceVersion, .metadata.uid, .metadata.annotations, .metadata.creationTimestamp, .metadata.selfLink, .metadata.managedFields)' - > $DEF.yaml
done
done
【讨论】:
虽然您的回答可能会解决问题,但 including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。您可以编辑您的答案以添加解释并指出适用的限制和假设。 - From Review【参考方案11】:如果您具有读取权限,我们可以通过命令行从 Kubernetes 集群中获取与任何种类相关的内容。
kubectl get <kind> <kindname> -n <namespace> -o <yaml or json>
例如,如果您想从命名空间导出部署,请按照以下命令 -
kubectl get deploy mydeploy -n mynamespace -o yaml > mydeploy.yaml
kubectl get deploy mydeploy -n mynamespace -o json > mydeploy.json
【讨论】:
【参考方案12】:获取所有 yaml 文件部署备份(不是特定部署):
kubectl get deployments -n <namespace> -o yaml > deployments.yaml
用于获取所有 yaml 文件服务备份(不是特定部署):
kubectl get services -n <namespace> -o yaml > services.yaml
好好享受吧。
【讨论】:
【参考方案13】:如果您需要“干净”导出,删除 Kubernetes 添加的注释,有一个开源项目通过管道输出 kubectl get
- https://github.com/itaysk/kubectl-neat 来做到这一点。
它会删除时间戳元数据等。
kubectl get pod mypod -o yaml | kubectl neat
kubectl get pod mypod -oyaml | kubectl neat -o json
【讨论】:
【参考方案14】:kubectl -n <namespace> get <resource type> <resource Name> -o yaml
通过上面的命令,Kubernetes 中定义的任何资源都可以以YAML
格式导出。
【讨论】:
【参考方案15】:如果您需要查看和编辑文件,请使用:
kubectl edit service servicename
【讨论】:
【参考方案16】:您可以使用该命令获取资源的yaml文件
kubectl -n <namespace> get <resource type> <resource Name> -o yaml
要将秘密放入您的 pod,
使用类似的东西
env
- valueFrom
secretKeyRef:
name: secret_name
key: key_name
或
envFrom
- secretRef:
name: secret_name
【讨论】:
【参考方案17】:与@Janos Lenart 的回答只有细微差别!
kubectl get deploy deploymentname -o yaml > outputFile.yaml
可以
【讨论】:
【参考方案18】:我知道回答太老了,但希望有人会觉得它有帮助。
我们可以尝试下面的命令从所有命名空间中获取一种导出 -
kubectl get <kind> --all-namespaces --export -o yaml
【讨论】:
【参考方案19】:您可以尝试使用kube-dump bash 脚本
使用此实用程序,您可以将 Kubernetes 集群资源保存为纯 yaml 清单,而无需不必要的元数据。
GitHub repository Review of the utility in blog page【讨论】:
以上是关于为已部署的 Kubernetes 服务获取 YAML?的主要内容,如果未能解决你的问题,请参考以下文章
Docker&Kubernetes ❀ Kubernetes集群 - DashBoard服务(Web管理)安装部署