¿Obtener YAML para los servicios de Kubernetes implementados?

104

Estoy intentando implementar mi aplicación en Kubernetes que se ejecuta en Google Container Engine .

La aplicación se puede encontrar en: https://github.com/Industrial/docker-znc .

El Dockerfile está integrado en una imagen en Google Container Registry .

Implementé la aplicación en Kubernetes a través del botón +. No tengo el YAML para esto.

He insertado un secreto en Kubernetes para el archivo PEM requerido por la aplicación.

  1. ¿Cómo obtengo el YAML para la implementación , el servicio y el pod creado por Kubernetes al completar el formulario?
  2. ¿Cómo consigo el Secret en mi Pod para su uso?
Industrial
fuente

Respuestas:

155

Para obtener el yaml para una implementación (servicio, pod, secreto, etc.):

kubectl get deploy deploymentname -o yaml --export
Janos Lenart
fuente
3
¿Alguna idea de cómo hacerlo para el clúster completo (todas las implementaciones)? La idea es, por supuesto, crear entornos espejo con exactamente los mismos servicios.
Sinaesthetic
1
@Sinaesthetic, las exportaciones de listas no son compatibles hasta ahora y no parece que lleguen pronto. Probablemente necesitará un script para enumerar todos los recursos y luego recorrer esos recursos para crear su lista. github.com/kubernetes/kubernetes/issues/…
mababin
17
A partir de Kubernetes 1.14, --exportestá obsoleto; ver aquí . Puede usar get -o yamlsin --export, aunque eso incluye información sobre el estado actual del objeto, así como la configuración declarativa necesaria para (re) configurar el objeto.
Josh Kelley
Todavía es necesario eliminar algún estado actual del yaml generado por "-o yaml", por ejemplo, spec.clusterIPy metadata.resourceVersionen servicio.
Tony Lee
16

¿Cómo obtengo el YAML para la implementación, el servicio y el pod creado por Kubernetes al completar el formulario?

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

Respondiendo a la pregunta @Sinesthetic:

¿Alguna idea de cómo hacerlo para el clúster completo (todas las implementaciones)?

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

El problema con este método es que la exportación no incluye el espacio de nombres. Entonces, si desea exportar muchos recursos al mismo tiempo, le recomiendo hacerlo por espacio de nombres:

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

Desafortunadamente, kubernetes todavía no admite un verdadero comando get all , por lo que debe enumerar manualmente el tipo de recursos que desea exportar. Puede obtener una lista de tipos de recursos con

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

El mismo problema se discute en la página de problemas de kubernetes GitHub y el usuario "alahijani" creó un script bash que exporta todos los archivos yaml y los escribe en archivos y carpetas individuales.

Dado que esta pregunta se clasifica bien en Google y como encontré esa solución muy buena, la represento aquí.

Script Bash exportando yaml a subcarpetas:

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

Otro usuario, "acondrat", hizo un script que no usa directorios, lo que facilita la creación de un kubectl apply -fposterior.

Bash script exportando yaml a la carpeta actual:

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

El último script no incluye la cuenta de servicio.

thephper
fuente
5

Sintaxis para descargar yaml de kubernetes

kubectl get [tipo de recurso] -n [espacio de nombres] [Nombre de recurso] -o yaml> [Nombre de archivo nuevo]

Cree un archivo yaml desde el pod en ejecución:

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

Cree el archivo yaml del conjunto de réplicas desde el pod en ejecución:

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

Cree el archivo yaml de implementación desde el pod en ejecución:

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

para la segunda pregunta sobre el secreto, esto es de la documentación de k8s. consulte https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets para obtener más información.

  1. Crea un secreto o usa uno existente. Varias cápsulas pueden hacer referencia al mismo secreto.
  2. Modifica la definición de tu pod para agregar un volumen por debajo de spec.volumes []. Asigne un nombre al volumen y tenga un campo spec.volumes []. Secret.secretName igual al nombre del objeto secreto.
  3. Agregue un spec.containers []. VolumeMounts [] a cada contenedor que necesite el secreto. Especifique spec.containers []. VolumeMounts []. ReadOnly = true y spec.containers []. VolumeMounts []. MountPath a un nombre de directorio no utilizado donde le gustaría que aparezcan los secretos.
  4. Modifique su imagen y / o línea de comando para que el programa busque archivos en ese directorio. Cada clave en el mapa de datos secretos se convierte en el nombre de archivo debajo de mountPath.

He usado esto y funciona bien.

JamStar
fuente
4
  • Como se mencionó anteriormente, "--export" es una opción para obtener el manifiesto correspondiente a los objetos kubeernetes
  • Pero se considera que "--exportar" tiene errores y hay una propuesta para desaprobarlo
  • Actualmente, la mejor opción es hacer "-o yaml" o "-o json" y eliminar los campos innecesarios
  • La principal diferencia es que se espera que "--export" elimine la configuración específica del clúster (por ejemplo, la IP del servicio de clúster de un servicio k8s). Pero se encuentra que es inconsistente a este respecto.
pr-pal
fuente
2

Utilice este comando para obtener el formato yaml de su servicio

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

Puedes ponerlo en algún archivo también

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

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

Con el comando anterior, cualquier recurso definido en Kubernetes se puede exportar en YAMLformato.

nimit garg
fuente
0

Si necesita ver y editar el archivo, utilice:

kubectl edit service servicename

Ken M
fuente
0
  1. Puede obtener los archivos yaml de los recursos usando este comando

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

  2. Para meter el secreto en tu vaina,

usa algo como esto

env
- valueFrom
    secretKeyRef:
      name: secret_name
      key: key_name

o

envFrom
- secretRef:
    name: secret_name

 
Ankur Kothari
fuente
0

Sé que es demasiado viejo para responder, pero espero que alguien lo encuentre útil.

Podemos probar el siguiente comando para obtener una especie de exportación de todos los espacios de nombres:

kubectl get <kind> --all-namespaces --export -o yaml
Vivek Raveendran
fuente