はじめに
あるとき、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ファイル
という構造になっています。
まとめ
作成してみたものの、圧倒的に、というCLIツールを使用したほうが、早い気がしました。
K9sのインストール方法や使い方はこちら↓の公式ページを御覧ください