为部署的Kubernetes服务获取YAML?


116

我正在尝试将我的应用程序部署到在Google Container Engine中运行的Kubernetes

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

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

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

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

  1. 如何通过填写表格获取Kubernetes创建的DeploymentServicePod的YAML ?
  2. 如何将机密信息放入Pod以便使用?

Answers:


163

要获取用于部署的Yaml(服务,窗格,机密等):

kubectl get deploy deploymentname -o yaml --export

3
任何想法如何为整个群集(所有部署)做到这一点?这个想法当然是创建具有完全相同服务的镜像环境。
Sinaesthetic

1
@Sinaesthetic,到目前为止,尚不支持列表导出,并且似乎不会很快到来。您可能需要一个脚本来列出所有资源,然后在这些资源之间循环以建立您的列表。github.com/kubernetes/kubernetes/issues/…–
mababin

23
从Kubernetes 1.14开始--export不推荐使用; 看这里。您可以get -o yaml不使用--export,尽管其中包含有关当前对象状态以及(重新)配置对象所需的声明性配置的信息。
乔什·凯利

例如,仍然需要从“ -o yaml”生成的yaml中删除一些当前状态,spec.clusterIP然后metadata.resourceVersion在使用中。
Tony Lee,

18

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

kubectl get deployment,service,pod yourapp -o yaml --export

回答@Sinaesthetic问题:

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

kubectl get deploy --all-namespaces -o yaml --export

此方法的问题在于,导出不包含名称空间。因此,如果您想同时导出许多资源,建议您按名称空间进行操作:

kubectl get deploy,sts,svc,configmap,secret -n default -o yaml --export > default.yaml

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

kubectl api-resources

2
kubectl get $(kubectl api-resources | awk '{print $1}' | tail -n +2 | tr '\n' ',' | sed s/,\$//) -o yaml > manifest.yaml
mkingston '20

10

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

由于此问题在Google上排名很高,并且由于我发现该解决方案非常好,因此在此代表它。

Bash脚本将yaml导出到子文件夹:

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以后制作脚本变得容易。

Bash脚本将yaml导出到当前文件夹:

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

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


6

从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创建copysetyaml文件:

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

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

  1. kubectl get deploy -n nginx -o yaml > latestDeployement.yaml

4

关于秘密的第二个问题,来自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下的文件名。

我已经用过了,效果很好。


4
  • 如上所述,“-export”是获取与kubeernetes对象相对应的清单的一种选择
  • 但是,“-export”被认为是越野车,因此有人提议弃用它
  • 当前,更好的选择是执行“ -o yaml”或“ -o json”并删除不必要的字段
  • 主要区别是“ --export”有望删除特定于群集的设置(例如,k8s服务的群集服务IP)。但是发现这方面是不一致的

4

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

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

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

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


0
kubectl -n <namespace> get <resource type> <resource Name> -o yaml 

使用上面的命令,可以以YAML格式导出Kubernetes中定义的任何资源。


0

如果需要查看和编辑文件,请使用:

kubectl edit service servicename


0
  1. 您可以使用此命令获取资源的yaml文件

    kubectl -n <namespace> get <resource type> <resource Name> -o yaml

  2. 为了将秘密带入您的吊舱,

用这样的东西

env
- valueFrom
    secretKeyRef:
      name: secret_name
      key: key_name

要么

envFrom
- secretRef:
    name: secret_name

 

0

我知道答案太老了,但希望有人会发现它有用。

我们可以尝试使用以下命令从所有名称空间获取一种导出-

kubectl get <kind> --all-namespaces --export -o yaml

0

与@Janos Lenart的答案只有微小的不同!

kubectl get deploy deploymentname -o yaml > outputFile.yaml 会做

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.