Chcesz otrzymać YAML dla wdrożonych usług Kubernetes?


116

Próbuję wdrożyć moją aplikację na Kubernetes działającej w Google Container Engine .

Aplikację można znaleźć pod adresem : https://github.com/Industrial/docker-znc .

Plik Dockerfile jest wbudowany w obraz w Google Container Registry .

Wdrożyłem aplikację w Kubernetes za pomocą przycisku +. Nie mam do tego YAML.

Mam wstawiony Tajemnicę w Kubernetes dla pliku PEM wymaganych przez aplikację.

  1. Jak mogę uzyskać YAML dla wdrażania , obsługa i Pod stworzony przez Kubernetes poprzez wypełnienie formularza?
  2. Jak wprowadzić Sekret do mojej kapsuły do użytku?

Odpowiedzi:


163

Aby uzyskać yaml do wdrożenia (usługa, pod, klucz tajny itp.):

kubectl get deploy deploymentname -o yaml --export

3
masz pomysł, jak to zrobić dla pełnego klastra (wszystkie wdrożenia)? Pomysł polega oczywiście na tworzeniu środowisk lustrzanych z dokładnie tymi samymi usługami.
Sinaesthetic

1
@Sinaesthetic, Eksport listy nie jest do tej pory obsługiwany i wydaje się, że nie pojawi się wkrótce. Prawdopodobnie będziesz potrzebować skryptu, który wypisze wszystkie zasoby, a następnie przejdzie przez te zasoby, aby zbudować listę. github.com/kubernetes/kubernetes/issues/…
mababin

23
Od wersji Kubernetes 1.14 --exportjest przestarzały; zobacz tutaj . Możesz używać get -o yamlbez --export, chociaż zawiera to informacje o aktualnym stanie obiektu, a także deklaratywną konfigurację potrzebną do (re) konfiguracji obiektu.
Josh Kelley

Nadal trzeba usunąć jakiś bieżący stan z yamla wygenerowanego na przykład przez „-o yaml” spec.clusterIPi jest metadata.resourceVersionw użyciu.
Tony Lee

18

Jak uzyskać YAML dla wdrożenia, usługi i pod utworzonych przez Kubernetes, wypełniając formularz?

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

Odpowiadając na @Sinaesthetic pytanie:

masz pomysł, jak to zrobić dla pełnego klastra (wszystkie wdrożenia)?

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

Problem z tą metodą polega na tym, że eksport nie obejmuje przestrzeni nazw. Więc jeśli chcesz wyeksportować wiele zasobów w tym samym czasie, polecam zrobić to dla każdej przestrzeni nazw:

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

Niestety kubernetes nadal nie obsługuje prawdziwego polecenia pobierz wszystko , więc musisz ręcznie wpisać typy zasobów, które chcesz wyeksportować. Możesz uzyskać listę typów zasobów za pomocą

kubectl api-resources

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

10

Ten sam problem jest omawiany na stronie problemów kubernetes GitHub, a użytkownik „alahijani” utworzył skrypt bash, który eksportuje wszystkie pliki yaml i zapisuje je w pojedynczych plikach i folderach.

Ponieważ to pytanie zajmuje dobre miejsce w Google i ponieważ uznałem to rozwiązanie za bardzo dobre, przedstawiam je tutaj.

Skrypt Bash eksportujący yaml do podfolderów:

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

Inny użytkownik "acondrat" stworzył skrypt, który nie używa katalogów, co ułatwia utworzenie kubectl apply -fpóźniej.

Skrypt Bash eksportujący yaml do bieżącego folderu:

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

Ostatni skrypt nie obejmuje konta usługi.


6

Składnia pobierania yaml z Kubernetes

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

Utwórz plik yaml z uruchomionego poda:

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

Utwórz plik yaml zestawu replik z uruchomionego poda:

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

Utwórz plik yaml wdrożenia z uruchomionego poda:

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

4

drugie pytanie dotyczące sekretu pochodzi z dokumentacji k8s. Zobacz https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets, aby uzyskać więcej informacji.

  1. Utwórz sekret lub użyj istniejącego. Wiele zasobników może odnosić się do tego samego sekretu.
  2. Zmodyfikuj definicję Poda, aby dodać wolumin w obszarze spec.volumes []. Nadaj woluminowi dowolną nazwę i podaj pole spec.volumes []. Secret.secretName równe nazwie tajnego obiektu.
  3. Dodaj spec.containers []. VolumeMounts [] do każdego kontenera wymagającego sekretu. Określ spec.containers []. VolumeMounts []. ReadOnly = true i spec.containers []. VolumeMounts []. MountPath do nieużywanej nazwy katalogu, w którym mają się pojawić sekrety.
  4. Zmodyfikuj swój obraz i / lub wiersz poleceń, tak aby program szukał plików w tym katalogu. Każdy klucz w tajnej mapie danych staje się nazwą pliku w ścieżce montowania.

Użyłem tego i działa dobrze.


4
  • Jak wspomniano powyżej, "--export" to jedna z opcji pobrania manifestu odpowiadającego obiektom kubeernetes
  • Ale „--export” jest uważane za błędne i istnieje propozycja wycofania go
  • Obecnie lepszą opcją jest wykonanie „-o yaml” lub „-o json” i usunięcie niepotrzebnych pól
  • Główną różnicą jest to, że „--export” ma usunąć ustawienia specyficzne dla klastra (np. Adres IP usługi klastra usługi k8s). Ale okazuje się, że jest to niespójne w tym względzie

4

Użyj tego polecenia, aby uzyskać format yaml swojej usługi

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

Możesz również umieścić go w jakimś pliku

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


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

Za pomocą powyższego polecenia każdy zasób zdefiniowany w Kubernetes można wyeksportować w YAMLformacie.


0

Jeśli chcesz wyświetlić i edytować plik, użyj:

kubectl edit service servicename


0
  1. Możesz pobrać pliki yaml zasobów za pomocą tego polecenia

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

  2. Aby dostać sekret do swojej kapsuły,

użyj czegoś takiego

env
- valueFrom
    secretKeyRef:
      name: secret_name
      key: key_name

lub

envFrom
- secretRef:
    name: secret_name

 

0

Wiem, że jest zbyt stara, aby odpowiedzieć, ale miejmy nadzieję, że ktoś uzna to za pomocne.

Możemy spróbować poniższego polecenia, aby pobrać rodzaj eksportu ze wszystkich przestrzeni nazw -

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

0

To tylko niewielka różnica w stosunku do odpowiedzi @Janos Lenart!

kubectl get deploy deploymentname -o yaml > outputFile.yaml zrobi

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.