YAML für bereitgestellte Kubernetes-Dienste erhalten?

104

Ich versuche, meine App auf Kubernetes bereitzustellen, die in Google Container Engine ausgeführt werden .

Die App finden Sie unter: https://github.com/Industrial/docker-znc .

Die Docker-Datei ist in ein Bild in der Google Container-Registrierung integriert .

Ich habe die App in Kubernetes über die Schaltfläche + bereitgestellt . Ich habe keine YAML dafür.

Ich habe in Kubernetes ein Geheimnis für die von der App benötigte PEM-Datei eingefügt .

  1. Wie erhalte ich die YAML für die von Kubernetes erstellte Bereitstellung , den Dienst und den Pod , indem ich das Formular ausfülle?
  2. Wie bringe ich das Geheimnis zur Verwendung in meinen Pod ?
Industriell
quelle

Antworten:

154

So erhalten Sie das Yaml für eine Bereitstellung (Dienst, Pod, Geheimnis usw.):

kubectl get deploy deploymentname -o yaml --export
Janos Lenart
quelle
3
Haben Sie eine Idee, wie dies für den gesamten Cluster (alle Bereitstellungen) erfolgen soll? Die Idee ist natürlich, Spiegelumgebungen mit genau den gleichen Diensten zu erstellen.
Sinaesthetic
1
@Sinaesthetic, List-Exporte werden bisher nicht unterstützt und scheinen nicht bald zu kommen. Sie benötigen wahrscheinlich ein Skript, um alle Ressourcen aufzulisten, und durchlaufen dann diese Ressourcen, um Ihre Liste zu erstellen. github.com/kubernetes/kubernetes/issues/…
Mababin
17
Ab Kubernetes 1.14 --exportist veraltet; siehe hier . Sie können get -o yamlohne verwenden --export, obwohl dies Informationen zum aktuellen Objektstatus sowie die deklarative Konfiguration enthält, die zum (Neu-) Konfigurieren des Objekts erforderlich ist.
Josh Kelley
Es muss noch ein aktueller Status aus dem Yaml entfernt werden, der beispielsweise von "-o yaml" generiert wurde spec.clusterIPund metadata.resourceVersionin Betrieb ist.
Tony Lee
15

Wie erhalte ich die YAML für die von Kubernetes erstellte Bereitstellung, den Dienst und den Pod, indem ich das Formular ausfülle?

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

Beantwortung der @Sinaesthetic-Frage:

Haben Sie eine Idee, wie dies für den gesamten Cluster (alle Bereitstellungen) erfolgen soll?

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

Das Problem bei dieser Methode ist, dass der Export den Namespace nicht enthält. Wenn Sie also viele Ressourcen gleichzeitig exportieren möchten, empfehle ich, dies pro Namespace zu tun:

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

Leider unterstützt kubernetes immer noch keinen echten get all- Befehl, sodass Sie die Art der Ressourcen, die Sie exportieren möchten, manuell auflisten müssen. Sie können eine Liste der Ressourcentypen mit abrufen

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

Das gleiche Problem wird auf der Seite mit den GitHub-Problemen von kubernetes behandelt, und der Benutzer "alahijani" hat ein Bash-Skript erstellt, das alle yaml exportiert und in einzelne Dateien und Ordner schreibt.

Da diese Frage bei Google gut ankommt und ich diese Lösung sehr gut fand, vertrete ich sie hier.

Bash-Skript, das Yaml in Unterordner exportiert:

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

Ein anderer Benutzer "acondrat" hat ein Skript erstellt, das keine Verzeichnisse verwendet, was das Erstellen eines kubectl apply -fspäteren Skripts erleichtert .

Bash-Skript, das yaml in den aktuellen Ordner exportiert:

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

Das letzte Skript enthält kein Dienstkonto.

thephper
quelle
5

Syntax zum Herunterladen von Yamls aus Kubernetes

kubectl get [Ressourcentyp] -n [Namespace] [Ressourcenname] -o yaml> [Neuer Dateiname]

Erstellen Sie eine Yaml-Datei aus dem laufenden Pod:

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

Erstellen Sie eine Replikat-Yaml-Datei aus dem laufenden Pod:

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

Erstellen Sie eine Bereitstellungs-Yaml-Datei aus dem laufenden Pod:

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

Die zweite Frage zum Geheimnis stammt aus der k8s-Dokumentation. Weitere Informationen finden Sie unter https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets .

  1. Erstellen Sie ein Geheimnis oder verwenden Sie ein vorhandenes. Mehrere Pods können auf dasselbe Geheimnis verweisen.
  2. Ändern Sie Ihre Pod-Definition, um unter spec.volumes [] ein Volume hinzuzufügen. Benennen Sie das Volume beliebig und haben Sie ein Feld spec.volumes []. Secret.secretName, das dem Namen des geheimen Objekts entspricht.
  3. Fügen Sie jedem Container, der das Geheimnis benötigt, einen spec.containers []. VolumeMounts [] hinzu. Geben Sie spec.containers []. VolumeMounts []. ReadOnly = true und spec.containers []. VolumeMounts []. MountPath in einem nicht verwendeten Verzeichnisnamen an, in dem die Geheimnisse angezeigt werden sollen.
  4. Ändern Sie Ihr Image und / oder Ihre Befehlszeile so, dass das Programm nach Dateien in diesem Verzeichnis sucht. Jeder Schlüssel in der geheimen Datenzuordnung wird unter mountPath zum Dateinamen.

Ich habe dies verwendet und es funktioniert gut.

JamStar
quelle
4
  • Wie oben erwähnt, ist "--export" eine Option, um das Manifest zu erhalten, das den kubeernetes-Objekten entspricht
  • Aber "--export" wird als fehlerhaft angesehen und es gibt einen Vorschlag, es zu verwerfen
  • Derzeit ist es besser, "-o yaml" oder "-o json" auszuführen und die unnötigen Felder zu entfernen
  • Der Hauptunterschied besteht darin, dass "--export" voraussichtlich die clusterspezifischen Einstellungen entfernt (z. B. die IP-Adresse des Clusterdienstes eines k8s-Dienstes). Es wird jedoch festgestellt, dass diesbezüglich inkonsistent ist
pr-pal
quelle
2

Verwenden Sie diesen Befehl, um das Yaml-Format Ihres Dienstes abzurufen

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

Sie können es auch in eine Datei einfügen

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

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

Mit dem obigen Befehl kann jede in Kubernetes definierte Ressource im YAMLFormat exportiert werden.

Nimit Garg
quelle
0

Wenn Sie die Datei anzeigen und bearbeiten müssen, verwenden Sie:

kubectl edit service servicename

Ken M.
quelle
0
  1. Mit diesem Befehl können Sie die Yaml-Dateien der Ressourcen abrufen

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

  2. Um das Geheimnis in Ihre Kapsel zu bekommen,

benutze so etwas

env
- valueFrom
    secretKeyRef:
      name: secret_name
      key: key_name

oder

envFrom
- secretRef:
    name: secret_name

 
Ankur Kothari
quelle
0

Ich weiß, dass es zu alt ist, um zu antworten, aber hoffentlich findet es jemand hilfreich.

Wir können den folgenden Befehl versuchen, um einen Art Export aus allen Namespaces abzurufen -

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