为已部署的 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

    我如何获取由 DeploymentServicePod 创建的 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.clusterIPmetadata.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 已被弃用,要以“原始”格式从资源中获取输出(刚刚清理,没有关于当前对象状态的任何信息(在这种情况下不需要元数据)),您可以执行以下操作使用yqv4.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 &lt;namespace&gt; -o yaml

你也可以把它放在某个文件里

kubectl get service servicename -n &lt;namespace&gt; -o yaml &gt; 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 &lt;namespace&gt; get &lt;resource type&gt; &lt;resource Name&gt; -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 &gt; 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?的主要内容,如果未能解决你的问题,请参考以下文章

kube-state-metrics部署

Docker&Kubernetes ❀ Kubernetes集群 - DashBoard服务(Web管理)安装部署

Docker&Kubernetes ❀ Kubernetes集群 - DashBoard服务(Web管理)安装部署

自动化集成:Pipeline整合Docker+K8S

部署k8s-dashboard

部署k8s-dashboard