簡體   English   中英

為已部署的 Kube.netes 服務獲取 YAML?

[英]Get YAML for deployed Kubernetes services?

我正在嘗試將我的應用程序部署到在Google Container Engine中運行的Kube.netes

該應用程序位於: https://github.com/Industrial/docker-znc

Dockerfile內置於Google Container Registry上的映像中。

我已經通過 + 按鈕在Kube.netes中部署了該應用程序。 我沒有這個 YAML。

我在Kube.netes中為應用程序所需的 PEM 文件插入了一個Secret

  1. Kube.netes創建的DeploymentServicePod如何填表獲取YAML?
  2. 如何將Secret放入我的Pod中以供使用?

獲取部署的 yaml(服務、pod、秘密等):

kubectl get deploy deploymentname -o yaml

如何通過填寫表單獲取 Kubernetes 創建的 Deployment、Service 和 Pod 的 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仍然不支持真正的get all命令,因此您需要手動列出要導出的資源類型。 您可以獲得資源類型列表

kubectl api-resources

在 kubernetes GitHub 問題頁面上討論了相同的問題,用戶“alahijani”制作了一個 bash 腳本,用於導出所有 yaml 並將它們寫入單個文件和文件夾。

由於這個問題在谷歌上排名很好,而且我發現這個解決方案非常好,我在這里代表它。

將 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

最后一個腳本不包括服務帳戶。

從 kubernetes 下載 yaml 的語法

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

從正在運行的 pod 創建 yaml 文件:

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

從正在運行的 pod 創建副本集 yaml 文件:

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

從正在運行的 pod 創建部署 yaml 文件:

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

現在--export已被棄用,要以“原始”格式從資源中獲取輸出(剛剛清理,沒有關於當前對象狀態的任何信息(在這種情況下是不必要的元數據)),您可以使用yq v4.x執行以下操作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)' -

關於秘密的第二個問題,這是來自 k8s 文檔。 有關更多信息,請參閱https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets

  1. 創建一個秘密或使用現有的秘密。 多個 Pod 可以引用相同的秘密。
  2. 修改您的 Pod 定義以在 spec.volumes[] 下添加一個卷。 將卷命名為任意名稱,並有一個 spec.volumes[].secret.secretName 字段等於秘密對象的名稱。
  3. 向需要密鑰的每個容器添加一個 spec.containers[].volumeMounts[]。 將 spec.containers[].volumeMounts[].readOnly = true 和 spec.containers[].volumeMounts[].mountPath 指定為未使用的目錄名稱,您希望在其中顯示機密。
  4. 修改您的圖像和/或命令行,以便程序在該目錄中查找文件。 秘密數據映射中的每個鍵都成為 mountPath 下的文件名。

我用過這個,效果很好。

  • 如上所述,“--export”是獲取與 kubeernetes 對象對應的清單的一種選擇
  • 但是“--export”被認為是有問題的,並且有建議棄用它
  • 目前更好的選擇是執行“-o yaml”或“-o json”並刪除不必要的字段
  • 主要區別在於“--export”預計會刪除集群特定的設置(例如 k8s 服務的集群服務 IP)。 但是發現在這方面是不一致的

使用此命令獲取服務的 yaml 格式

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

你也可以把它放在某個文件中

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

也可以使用view-last-applied命令,例如

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

這將返回用於創建服務的所有清單。 您也可以通過 services/resource-name 標簽指定某個 k8 資源。

如果您有讀取權限,我們可以通過命令行從 Kubernetes 集群中獲取與任何類型相關的內容。

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

例如,如果要從命名空間導出部署,請遵循以下命令 -

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

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

要獲取所有 yaml 文件部署備份(不是特定部署):

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

獲取所有 yaml 文件服務備份(不是特定部署):

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

好好享受。

如果您需要“干凈”導出,刪除 Kubernetes 添加的注釋,有一個開源項目可以通過管道輸出kubectl get<\/code> - https:\/\/github.com\/iaysk\/kubectl-neat<\/a>來實現。

它刪除了時間戳元數據等。

kubectl get pod mypod -o yaml | kubectl neat

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

要為 kube.netes 上當前正在運行的部署獲取 YAML,您可以運行以下命令。

kubectl get deployment <deployment_name> -o yaml

要為部署生成 YAML,您可以運行命令式命令。

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

要生成和導出部署,您可以運行命令式命令。

 kubectl create deployment <deployment_name>--image=<image_name> --dry-run=client -o yaml > example.yaml
kubectl -n <namespace> get <resource type> <resource Name> -o yaml 

使用上面的命令,Kubernetes 中定義的任何資源都可以以YAML格式導出。

如果您需要查看和編輯文件,請使用:

kubectl edit service servicename

  1. 您可以使用此命令獲取資源的 yaml 文件

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

  2. 要將秘密放入您的 Pod,

使用這樣的東西

env
- valueFrom
    secretKeyRef:
      name: secret_name
      key: key_name

或者

envFrom
- secretRef:
    name: secret_name

 

與@Janos Lenart 的回答只有細微差別!

kubectl get deploy deploymentname -o yaml > outputFile.yaml就可以了

我正在嘗試將我的應用程序部署到在Google Container Engine中運行的Kubernetes

該應用程序可以在以下網址找到: https : //github.com/Industrial/docker-znc

Dockerfile內置在Google Container Registry的映像中。

我已經通過+按鈕在Kubernetes中部署了該應用程序。 我沒有這個的YAML。

我已在Kubernetes中為應用程序所需的PEM文件插入了一個Secret

  1. 如何通過填寫表格獲取Kubernetes創建的DeploymentServicePod的YAML?
  2. 如何將機密信息放入Pod中以便使用?

以下代碼將一次提取所有 K8s 定義並將它們放在當前文件夾下的各個文件夾中。

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

您可以嘗試使用kube-dump bash 腳本

使用此實用程序,您可以將 Kubernetes 集群資源保存為純 yaml 清單,而無需不必要的元數據。

在此處輸入圖片說明

  1. 您可以使用以下命令存儲已部署的 kubernetes 服務的輸出 -

    kubectl 獲取 svc -n -o yaml > svc-output.yaml

    對於部署 -

    對於 Pod -

    
              
      您可以使用以下命令獲取您的秘密詳細信息 -

      kubectl get secret -n -o yaml 為了使用以下命令更新您的部署文件 -

      kubectl edit deploy -n 在你的 pod 模板下添加 -

      • 這將在 pod 容器部分下將秘密卷安裝到容器

      • 這將進入部署中的 pod 模板部分

我們可以使用以下命令獲取已部署資源的 yaml。

kubectl get <resource name> -o yaml

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

例子:-

  kubectl get deploy Nginx -o yaml

上面的命令會給你 yaml output。

如果您想將 output 存儲到任何文件中,您可以使用以下命令。

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

上面的命令會將您的 output 重定向到您當前目錄中的 Nginx-pod.yaml。

所有服務

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

所有部署

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

我知道回答這個問題太老了,但希望有人會發現它有幫助。

我們可以嘗試以下命令從所有命名空間中獲取一種導出 -

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM