デプロイされたKubernetesサービスのYAMLを取得しますか?


116

Google ContainerEngineで実行されているKubernetesにアプリをデプロイしようとしています。

アプリはhttps://github.com/Industrial/docker-zncにあります

Dockerfileは、上の画像に組み込まれているGoogleのコンテナレジストリ

+ボタンを使用してアプリをKubernetesにデプロイしました。このためのYAMLはありません。

アプリに必要なPEMファイルのシークレットKubernetesに挿入しました。

  1. フォームに入力して、Kubernetesによって作成されたデプロイサービスポッドのYAMLを取得するにはどうすればよいですか?
  2. シークレットポッドに入れて使用するにはどうすればよいですか?

回答:


163

デプロイ用のyaml(サービス、ポッド、シークレットなど)を取得するには:

kubectl get deploy deploymentname -o yaml --export

3
完全なクラスター(すべてのデプロイメント)に対してそれを行う方法はありますか?もちろん、まったく同じサービスでミラー環境を作成するというアイデアです。
Sinaesthetic 2018

1
@ Sinaesthetic、リストのエクスポートは現在サポートされておらず、まもなく提供される予定はないようです。おそらく、すべてのリソースを一覧表示し、それらのリソースを循環してリストを作成するためのスクリプトが必要になります。github.com/kubernetes/kubernetes/issues/...
mababin

21
Kubernetes 1.14以降、--export非推奨になりました。ここを参照してくださいget -o yamlなし--exportで使用できますが、これには、現在のオブジェクトの状態に関する情報と、オブジェクトを(再)構成するために必要な宣言型の構成が含まれます。
JoshKelley19年

それでも、たとえば、「-o YAML」によって生成されたYAMLからいくつかの現在の状態を削除する必要があり、spec.clusterIPおよびmetadata.resourceVersionサービスインチ
トニー・リー

18

フォームに入力して、Kubernetesによって作成されたデプロイ、サービス、ポッドの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

10

同じ問題がkubernetesGitHubの問題ページで説明されており、ユーザー「alahijani」がすべてのyamlをエクスポートして単一のファイルとフォルダーに書き込むbashスクリプトを作成しました。

この質問はGoogleでよくランク付けされており、その解決策が非常に優れていることがわかったので、ここで説明します。

yamlをサブフォルダーにエクスポートするBashスクリプト:

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後で簡単に作成できます。

yamlを現在のフォルダーにエクスポートするBashスクリプト:

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]

実行中のポッドからyamlファイルを作成します。

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

実行中のポッドからレプリカセットyamlファイルを作成します。

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

実行中のポッドからデプロイyamlファイルを作成します。

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

4

シークレットに関する2番目の質問については、これはk8sのドキュメントからのものです。詳細については、https://kubernetes.io/docs/concepts/configuration/secret/#using-secretsを参照してください

  1. シークレットを作成するか、既存のシークレットを使用します。複数のポッドが同じシークレットを参照できます。
  2. ポッド定義を変更して、spec.volumes []の下にボリュームを追加します。ボリュームに任意の名前を付け、spec.volumes []。secret.secretNameフィールドをシークレットオブジェクトの名前と同じにします。
  3. シークレットが必要な各コンテナーにspec.containers []。volumeMounts []を追加します。spec.containers []。volumeMounts []。readOnly = trueおよびspec.containers []。volumeMounts []。mountPathを、シークレットを表示する未使用のディレクトリ名に指定します。
  4. プログラムがそのディレクトリ内のファイルを検索するように、イメージやコマンドラインを変更します。シークレットデータマップの各キーは、mountPathの下のファイル名になります。

私はこれを使用しました、そしてそれはうまく働きます。


4
  • 上記のように、「-export」は、kubeernetesオブジェクトに対応するマニフェストを取得するための1つのオプションです。
  • しかし、「-export」はバグがあると見なされており、非推奨にする提案があります。
  • 現在、より良いオプションは、「-oyaml」または「-ojson」を実行して不要なフィールドを削除することです。
  • 主な違いは、「-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 

上記のコマンドを使用すると、Kubernetesで定義されているすべてのリソースをYAMLフォーマットでエクスポートできます。


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 しましょう

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.