为部署的Kubernetes服务获取YAML?

Ind*_*ial 64 yaml docker kubernetes google-kubernetes-engine google-container-registry

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

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

Dockerfile内置的图像谷歌集装箱登记.

我已经通过+按钮在Kubernetes中部署了应用程序.我没有这个YAML.

我在Kubernetes中插入了一个Secret,用于应用程序所需的PEM文件.

  1. 如何填写表格,获取Kubernetes创建的部署,服务Pod的YAML ?
  2. 如何将秘密放入我的Pod以供使用?

Jan*_*art 110

获取部署的yaml(服务,pod,secret等):

kubectl get deploy deploymentname -o yaml --export
Run Code Online (Sandbox Code Playgroud)

  • 从Kubernetes 1.14开始,不推荐使用--export; 参见[here](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.14.md#deprecations)。您可以使用不带--export的get -o yaml`,尽管其中包括有关当前对象状态以及(重新)配置对象所需的声明性配置的信息。 (5认同)
  • 任何想法如何为完整集群(所有部署)做到这一点?当然,这个想法是创建具有完全相同服务的镜像环境. (3认同)
  • @Sinaesthetic,到目前为止还不支持列表导出,而且似乎不会很快推出。您可能需要一个脚本来列出所有资源,然后循环浏览这些资源来构建您的列表。https://github.com/kubernetes/kubernetes/issues/24855#issuecomment-329889844 (2认同)
  • 仍然需要从“-o yaml”生成的yaml中删除一些当前状态,例如服务中的``spec.clusterIP``和``metadata.resourceVersion```。 (2认同)

the*_*per 14

在 kubernetes GitHub 问题页面讨论了同样的问题,用户“alahijani”制作了一个 bash 脚本,用于导出所有 yaml 并将它们写入单个文件和文件夹。

由于这个问题在谷歌上排名很好,而且我发现这个解决方案非常好,我在这里代表它。

将 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
Run Code Online (Sandbox Code Playgroud)

另一个用户“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
Run Code Online (Sandbox Code Playgroud)

最后一个脚本不包括服务帐户。


小智 13

从 kubernetes 下载 yaml 的语法

kubectl get [resource type] -n [namespace] [resource Name] -o yaml > [New file name]
Run Code Online (Sandbox Code Playgroud)

从正在运行的 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


Che*_* A. 12

如果您需要“干净”导出,删除 Kubernetes 添加的注释,有一个开源项目可以通过管道传输https://github.com/itaysk/kubectl-neatkubectl get的输出来实现此目的。

它删除时间戳元数据等。

kubectl get pod mypod -o yaml | kubectl neat

kubectl get pod mypod -oyaml | kubectl neat -o json
Run Code Online (Sandbox Code Playgroud)


小智 11

也可以使用view-last-applied命令,例如

kubectl apply view-last-applied services --all > services.yaml
Run Code Online (Sandbox Code Playgroud)

它将返回用于创建服务的所有清单。您还可以通过 services/resource-name 标签指定某个 k8 资源。


nfo*_*ced 8

所有服务

kubectl get service --all-namespaces -o yaml  > all-service.yaml
Run Code Online (Sandbox Code Playgroud)

所有部署

kubectl get deploy --all-namespaces -o yaml  > all-deployment.yaml
Run Code Online (Sandbox Code Playgroud)


小智 8

要获取 kubernetes 上当前正在运行的部署的 YAML,您可以运行以下命令:

kubectl get deployment <deployment_name> -o yaml
Run Code Online (Sandbox Code Playgroud)

要生成用于部署的 YAML,您可以运行命令式命令。

kubectl create deployment <deployment_name>--image=<image_name> -o yaml
Run Code Online (Sandbox Code Playgroud)

要生成和导出部署,您可以运行命令式命令。

 kubectl create deployment <deployment_name>--image=<image_name> --dry-run=client -o yaml > example.yaml
Run Code Online (Sandbox Code Playgroud)


Sac*_*ote 7

使用此命令获取服务的 yaml 格式

kubectl get service servicename -n <namespace> -o yaml

您也可以将其放入某个文件中

kubectl get service servicename -n <namespace> -o yaml > service.yaml


小智 7

以下代码将立即提取所有 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
Run Code Online (Sandbox Code Playgroud)

  • 虽然您的答案可能会解决问题,但[包括解释](https://meta.stackexchange.com/q/114762)如何以及为什么解决问题将真正有助于提高您的帖子的质量,并可能导致结果更多的赞成票。请记住,您是在为将来的读者回答问题,而不仅仅是现在提问的人。您可以编辑您的答案以添加解释并指出适用的限制和假设。- [来自评论](https://stackoverflow.com/review/late-answers/28401429) (3认同)

Gra*_*ant 6

现在--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)' -
Run Code Online (Sandbox Code Playgroud)


小智 6

  1. 您可以使用以下命令存储已部署的 kubernetes 服务的输出 -

    kubectl get svc -n -o yaml > svc-output.yaml

对于部署 -

kubectl get deploy <deployment-name> -n <your-namespace> -o yaml > deploy-output.yaml
Run Code Online (Sandbox Code Playgroud)

对于 Pod -

kubectl get pod <pod-name> -n <your-namespace> -o yaml > pod-output.yaml
Run Code Online (Sandbox Code Playgroud)
  1. 您可以使用以下命令获取您的秘密详细信息 -

    kubectl get Secret -n -o yaml 为了使用以下命令更新您的部署文件 -

    kubectl edit deploy -n 在您的 pod 模板下添加以下内容 -


小智 5

关于秘密的第二个问题,来自 k8s 文档。有关更多信息,请参阅https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets 。

  1. 创建一个秘密或使用现有的秘密。多个 pod 可以引用同一个机密。
  2. 修改 Pod 定义以在 spec.volumes[] 下添加卷。将卷命名为任意名称,并有一个等于秘密对象名称的 spec.volumes[].secret.secretName 字段。
  3. 将spec.containers[].volumeMounts[]添加到每个需要秘密的容器。将spec.containers[].volumeMounts[].readOnly = true 和spec.containers[].volumeMounts[].mountPath 指定为您希望在其中显示机密的未使用目录名称。
  4. 修改您的图像和/或命令行,以便程序在该目录中查找文件。秘密数据映射中的每个密钥都成为 mountPath 下的文件名。

我已经用过这个并且效果很好。


vic*_*rtv 5

如何通过填写表格获取Kubernetes创建的Deployment,Service和Pod的YAML?

kubectl get deployment,service,pod yourapp -o yaml --export
Run Code Online (Sandbox Code Playgroud)

回答@Sinaesthetic问题:

任何想法如何为整个群集(所有部署)做到这一点?

kubectl get deploy --all-namespaces -o yaml --export
Run Code Online (Sandbox Code Playgroud)

这种方法的问题是导出不包括名称空间。因此,如果您想同时导出许多资源,建议您针对每个命名空间执行此操作:

kubectl get deploy,sts,svc,configmap,secret -n default -o yaml --export > default.yaml
Run Code Online (Sandbox Code Playgroud)

不幸的是,kubernetes 仍然不支持 true get all命令,因此您需要手动列出要导出的资源类型。您可以使用以下方法获取资源类型列表

kubectl api-resources
Run Code Online (Sandbox Code Playgroud)

  • `kubectl get $(kubectl api-resources | awk '{print $1}' | tail -n +2 | tr '\n' ',' | sed s/,\$//) -o yaml &gt; manifest.yaml` (2认同)

pr-*_*pal 5

  • 正如上面提到的,“--export”是获取与 kubeernetes 对象对应的清单的一种选项
  • 但“--export”被认为是有问题的,并且有建议弃用它
  • 目前更好的选择是执行“-o yaml”或“-o json”并删除不必要的字段
  • 主要区别是“--export”预计会删除集群特定设置(例如 k8s 服务的集群服务 IP)。但发现这方面不一致