Industrial
Industrial

Reputation: 3411

Get YAML for deployed Kubernetes services?

I am trying to deploy my app to Kubernetes running in Google Container Engine.

The app can be found at: https://github.com/Industrial/docker-znc.

The Dockerfile is built into an image on Google Container Registry.

I have deployed the app in Kubernetes via the + button. I don't have the YAML for this.

I have inserted a Secret in Kubernetes for the PEM file required by the app.

  1. How do I get the YAML for the Deployment, Service and Pod created by Kubernetes by filling in the form?
  2. How do I get the Secret into my Pod for usage?

Upvotes: 297

Views: 476195

Answers (26)

Ali Abbas
Ali Abbas

Reputation: 1

You can get the yaml files of the resources using following commands

Deployment

kubectl -n <namespace> get deployment <deployment Name> -o yaml

Service

kubectl -n <namespace> get service <Service Name> -o yaml

To set the secret into your pod, you have to configure ENVIRONMENT variable from secret in your deployment, you will pod will use that secret

use following kubectl command

kubectl set env --from=secret/<Secret Name> deployment/<Deployment Name>

Upvotes: 0

thiagowfx
thiagowfx

Reputation: 5770

Hacky and not ideal, but easier to remember than kubectl get -o yaml:

EDITOR=cat kubectl edit deploy deploymentname

Caveat: It prints Edit cancelled, no changes made. at the end.

Upvotes: 1

thephper
thephper

Reputation: 2610

The same issue is discussed at kubernetes GitHub issues page and the user "alahijani" made a bash script that exports all yaml and writes them to single files and folders.

Since this question ranks well on Google and since I found that solution very good, I represent it here.

Bash script exporting yaml to sub-folders:

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 $n -o > $n.yaml
done

Another user "acondrat" made a script that do not use directories, which makes it easy to make a kubectl apply -f later.

Bash script exporting yaml to current folder:

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 $n -o yaml > $(dirname $n)_$(basename $n).yaml
done

The last script does not include service account.

Upvotes: 28

Deepak Bajaj
Deepak Bajaj

Reputation: 250

Use the below command :-

kubectl get deploy <NameofYourDeployment> -o yaml

In case you want to save it to a file use below

kubectl get deploy <NameofYourDeployment> -o yaml > deploy.yaml

Upvotes: 1

sachin chaurasiya
sachin chaurasiya

Reputation: 81

To get YAML for current running deployment on kubernetes, you can run this command:

kubectl get deployment <deployment_name> -o yaml

To generate YAML for deployment you can run the imperative command.

kubectl create deployment <deployment_name>--image=<image_name> -o yaml

To generate and export the deployment you can run the imperative command.

 kubectl create deployment <deployment_name>--image=<image_name> --dry-run=client -o yaml > example.yaml

Upvotes: 8

nforced
nforced

Reputation: 371

All services

kubectl get service --all-namespaces -o yaml  > all-service.yaml

All deployments

kubectl get deploy --all-namespaces -o yaml  > all-deployment.yaml

Upvotes: 8

Raghunath Babalsure
Raghunath Babalsure

Reputation: 115

We can get yaml for deployed resources using below command.

kubectl get <resource name> -o yaml

                OR
kubectl get <resource name> <name of pod> -o yaml

example:-

  kubectl get deploy Nginx -o yaml

above commands will give you yaml output.

if you want to store the output into any file you can use below command.

kubectl get pod nginx -o yaml > Nginx-pod.yaml

above command will redirect you output to Nginx-pod.yaml in your courrent directory.

Upvotes: 1

Sapna
Sapna

Reputation: 683

  1. You can store output of deployed kubernetes service by using below command -

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

For deployments -

kubectl get deploy <deployment-name> -n <your-namespace> -o yaml > deploy-output.yaml

For Pod -

kubectl get pod <pod-name> -n <your-namespace> -o yaml > pod-output.yaml
  1. You can get your secret details using below command -

    kubectl get secret -n -o yaml In order to use update your deployment file by using below command -

    kubectl edit deploy -n Under your pod template add below -

  • this will go under pod containers section to mount secret volume to container

      volumeMounts:
      - name: foo
        mountPath: "/etc/foo"
        readOnly: true
    
  • this will go inside your pod template section in deployment

    volumes:
    - name: foo
      secret:
        secretName: mysecret
    

Upvotes: 6

Chen A.
Chen A.

Reputation: 11328

If you need to get 'clean' export, removing the annotations added by Kubernetes, there's an opensource project that does that by piping the output of kubectl get - https://github.com/itaysk/kubectl-neat.

It removes the timestamp metadata, etc.

kubectl get pod mypod -o yaml | kubectl neat

kubectl get pod mypod -oyaml | kubectl neat -o json

Upvotes: 13

Soheil TT
Soheil TT

Reputation: 61

To get all yaml file deployments backup (not a specific deployment):

kubectl get deployments -n <namespace> -o yaml > deployments.yaml

for getting all yaml file services backup (not a specific deployment):

kubectl get services -n <namespace> -o yaml > services.yaml

enjoy it.

Upvotes: 4

Vivek Raveendran
Vivek Raveendran

Reputation: 1185

We can get the contents associated with any kind from a Kubernetes cluster through the command line if you have the read access.

kubectl get <kind> <kindname> -n <namespace> -o <yaml or json>

For example, if you want to export a deployment from a namespace follow the below command -

kubectl get deploy mydeploy -n mynamespace -o yaml > mydeploy.yaml

kubectl get deploy mydeploy -n mynamespace -o json > mydeploy.json

Upvotes: 4

Janos Lenart
Janos Lenart

Reputation: 27170

To get the yaml for a deployment (service, pod, secret, etc):

kubectl get deploy deploymentname -o yaml

Upvotes: 419

WoozyMasta
WoozyMasta

Reputation: 31

You can try use kube-dump bash script

With this utility, you can save Kubernetes cluster resources as a pure yaml manifest without unnecessary metadata.

enter image description here

Upvotes: 1

Franco Milanese
Franco Milanese

Reputation: 428

Also its possible to use the view-last-applied command e.g.

kubectl apply view-last-applied services --all > services.yaml

which will return all the manifests applied to create services. Also you can specify a certain k8 resource by services/resource-name label.

Upvotes: 12

Juan Medina
Juan Medina

Reputation: 142

The following code will extract all your K8s definitions at once and place them on individual folders below the current folder.

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

Upvotes: 7

Grant
Grant

Reputation: 859

Now that --export is deprecated, to get the output from your resources in the 'original' format (just cleaned up, without any information about the current object state (unnecessary metadata in this circumstance)) you can do the following using 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)' -

Upvotes: 24

Soumya Ranjan Rout
Soumya Ranjan Rout

Reputation: 413

Syntax for downloading yaml's from kubernetes

kubectl get [resource type] -n [namespace] [resource Name] -o yaml > [New file name]

Create yaml file from running pod:

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

Create replicaset yaml file from running pod:

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

Create deployement yaml file from running pod:

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

Upvotes: 15

Arun
Arun

Reputation: 1763

Is only minor difference from @Janos Lenart's answer!

kubectl get deploy deploymentname -o yaml > outputFile.yaml will do

Upvotes: 0

Vivek Raveendran
Vivek Raveendran

Reputation: 1185

I know it is too old to answer, but hopefully, someone will find it helpful.

We can try below command to fetch a kind export from all namespace -

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

Upvotes: -1

Sachin Arote
Sachin Arote

Reputation: 1027

Use this command to get yaml format of your service

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

You can put it in some file also

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

Upvotes: 7

Ankur Kothari
Ankur Kothari

Reputation: 908

  1. You can get the yaml files of the resources using this command

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

  2. To get the secret into your pod,

use something like this

env
- valueFrom
    secretKeyRef:
      name: secret_name
      key: key_name

or

envFrom
- secretRef:
    name: secret_name

 

Upvotes: 0

Ken M
Ken M

Reputation: 335

If you need to view and edit the file use:

kubectl edit service servicename

Upvotes: 1

nimit garg
nimit garg

Reputation: 31

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

With the command above, any resource defined in Kubernetes can be exported in YAML format.

Upvotes: 1

pr-pal
pr-pal

Reputation: 3558

  • Like mentioned above "--export" is one option to get the manifest corresponding to the kubeernetes objects
  • But "--export" is considered to be buggy and there is a proposal to deprecate it
  • Currently the better option is to do "-o yaml" or "-o json" and remove the unnecessary fields
  • The main difference is "--export" is expected to remove the cluster specific settings (e.g. cluster service IP of a k8s service). But it is found to be inconsistent in this regard

Upvotes: 5

victortv
victortv

Reputation: 8962

How do I get the YAML for the Deployment, Service and Pod created by Kubernetes by filling in the form?

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

Answering @Sinaesthetic question:

any idea how to do it for the full cluster (all deployments)?

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

The problem with this method is that export doesn't include the namespace. So if you want to export many resources at the same time, I recommend doing it per namespace:

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

Unfortunately kubernetes still doesn't support a true get all command, so you need to list manually the type of resources you want to export. You can get a list of resource types with

kubectl api-resources

Upvotes: 48

JamStar
JamStar

Reputation: 371

for the 2nd question regarding the secret, this is from the k8s documentation. see https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets for more info.

  1. Create a secret or use an existing one. Multiple pods can reference the same secret.
  2. Modify your Pod definition to add a volume under spec.volumes[]. Name the volume anything, and have a spec.volumes[].secret.secretName field equal to the name of the secret object.
  3. Add a spec.containers[].volumeMounts[] to each container that needs the secret. Specify spec.containers[].volumeMounts[].readOnly = true and spec.containers[].volumeMounts[].mountPath to an unused directory name where you would like the secrets to appear.
  4. Modify your image and/or command line so that the program looks for files in that directory. Each key in the secret data map becomes the filename under mountPath.

I have used this and it works fine.

Upvotes: 5

Related Questions