1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Kubernetes コンポーネントの出力

Posted at

はじめに

あるとき、Kubernetesのコンポーネントの情報を見る際に、 pod, deployment, service, role, service account 等の現在デプロイされている情報を取得する際に、いちいち kubectl コマンドを叩いて調べていくのが面倒になり、
現在デプロイされている情報を一気にYAMLファイルで出力したいと思いました。

Kubernetes コンポーネントをすべてYAMLファイルとして出力するシェルスクリプトを作成してみた

#!/bin/bash

# 出力ディレクトリの設定
OUTPUT_DIR="output"
mkdir -p $OUTPUT_DIR

# すべてのリソースタイプを取得
RESOURCE_TYPES=$(kubectl api-resources --output=name)

# すべての名前空間を取得
NAMESPACES=$(kubectl get namespaces -o jsonpath='{.items[*].metadata.name}')

# 各リソースタイプに対してリソースの詳細を取得し、YAMLファイルに出力
for RESOURCE in $RESOURCE_TYPES; do
  # リソースが名前空間に依存するかどうかをチェック
  NAMESPACED=$(kubectl api-resources --output=name --namespaced=true | grep "^${RESOURCE}$")

  if [ -n "$NAMESPACED" ]; then
    # 名前空間に依存するリソースの場合、各名前空間で処理
    for NAMESPACE in $NAMESPACES; do
      # 出力ディレクトリを名前空間とリソースタイプ名に基づいて作成
      RESOURCE_DIR="$OUTPUT_DIR/$NAMESPACE/$RESOURCE"
      mkdir -p $RESOURCE_DIR

      # 名前空間内のリソースのインスタンスを取得
      RESOURCE_INSTANCES=$(kubectl get $RESOURCE -n $NAMESPACE -o name 2>/dev/null)

      # 各リソースインスタンスの詳細をYAMLで保存
      for INSTANCE in $RESOURCE_INSTANCES; do
        # リソース名からファイル名を生成
        FILE_NAME=$(echo $INSTANCE | awk -F '/' '{print $2}')
        
        # YAMLファイルに詳細を保存
        kubectl get $INSTANCE -n $NAMESPACE -o yaml 2>/dev/null > "$RESOURCE_DIR/$FILE_NAME.yaml"
      done

      # ファイルがない場合はディレクトリを削除
      if [ -z "$(ls -A $RESOURCE_DIR)" ]; then
        rmdir $RESOURCE_DIR
      fi
    done
  else
    # 名前空間に依存しないリソースの場合
    RESOURCE_DIR="$OUTPUT_DIR/cluster-wide/$RESOURCE"
    mkdir -p $RESOURCE_DIR

    # クラスタ全体のリソースのインスタンスを取得
    RESOURCE_INSTANCES=$(kubectl get $RESOURCE -o name 2>/dev/null)

    # 各リソースインスタンスの詳細をYAMLで保存
    for INSTANCE in $RESOURCE_INSTANCES; do
      # リソース名からファイル名を生成
      FILE_NAME=$(echo $INSTANCE | awk -F '/' '{print $2}')
      
      # YAMLファイルに詳細を保存
      kubectl get $INSTANCE -o yaml 2>/dev/null > "$RESOURCE_DIR/$FILE_NAME.yaml"
    done

    # ファイルがない場合はディレクトリを削除
    if [ -z "$(ls -A $RESOURCE_DIR)" ]; then
      rmdir $RESOURCE_DIR
    fi
  fi
done

echo "全てのリソースが出力フォルダに保存されました。"

上記の内容を記載したoutput-k8s.shファイルを作成し、以下のコマンドを実行する

chmod +x output-k8s.sh
bash ./output-k8s.sh

出力フォルダの確認

outputフォルダが作成されている
outputフォルダの中身は
Namespace > pod, service, deployment, role, service account等のK8sコンポーネント種類 > 各Pod等のYAMLファイル
という構造になっています。

image.png

まとめ

作成してみたものの、圧倒的に、K9sというCLIツールを使用したほうが、早い気がしました。

K9sのインストール方法や使い方はこちら↓の公式ページを御覧ください

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?