【问题标题】:Get YAML for deployed Kubernetes services?为已部署的 Kubernetes 服务获取 YAML?
【发布时间】:2017-10-12 00:17:25
【问题描述】:

我正在尝试将我的应用部署到在 Google 容器中运行的 Kubernetes 引擎

可以在以下位置找到该应用程序:https://github.com/Industrial/docker-znc

Dockerfile 内置在 Google Container Registry 上的映像中。

我已经通过 + 按钮在 Kubernetes 中部署了应用程序。我没有 YAML 为此。

我在 Kubernetes 中为应用所需的 PEM 文件插入了一个 Secret

  1. 我如何获取由 DeploymentServicePod 创建的 YAML Kubernetes 通过填写表格?
  2. 如何将 Secret 放入我的 Pod 以供使用?

【问题讨论】:

标签: docker yaml kubernetes google-kubernetes-engine google-container-registry


【解决方案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 文件:

    1. kubectl get po -n nginx nginx-deployment-755cfc7dcf-5s7j8 -o yaml > podDetail.yaml

    从正在运行的 pod 创建副本集 yaml 文件:

    1. kubectl get rs -n nginx -o yaml > latestReplicaSet.yaml

    从正在运行的 pod 创建部署 yaml 文件:

    1. 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 了解更多信息。

      1. 创建一个秘密或使用现有的。多个 pod 可以引用同一个 secret。
      2. 修改您的 Pod 定义以在 spec.volumes[] 下添加一个卷。将卷命名为任何名称,并有一个 spec.volumes[].secret.secretName 字段等于秘密对象的名称。
      3. 为每个需要密钥的容器添加一个 spec.containers[].volumeMounts[]。将 spec.containers[].volumeMounts[].readOnly = true 和 spec.containers[].volumeMounts[].mountPath 指定为您希望秘密出现的未使用目录名称。
      4. 修改您的图像和/或命令行,以便程序在该目录中查找文件。秘密数据映射中的每个键都成为 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】:
                        1. 您可以使用该命令获取资源的yaml文件

                          kubectl -n &lt;namespace&gt; get &lt;resource type&gt; &lt;resource Name&gt; -o yaml

                        2. 要将秘密放入您的 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 清单,而无需不必要的元数据。

                              【讨论】:

                                猜你喜欢
                                • 1970-01-01
                                • 1970-01-01
                                • 2021-03-20
                                • 1970-01-01
                                • 1970-01-01
                                • 2019-02-28
                                • 2022-01-23
                                • 2021-12-08
                                • 1970-01-01
                                相关资源
                                最近更新 更多