はじめに
Kubernetesで複数のクラスタやコンテキストを扱う際、切り替えの手間が煩わしいと感じていたころにfzfを教えてもらいました。
ここでは、fzfを使用して快適なKubernetes環境の管理を実現するzsh設定をまとめます。
環境要件
- zsh
- kubectl
- fzf
セットアップ
1. 必要なツールのインストール
# macOS
brew install kubectl fzf
# Ubuntu
sudo apt-get install kubectl fzf
2. ディレクトリ構造の準備
# .kubeディレクトリの構造
~/.kube/
├── config # デフォルトのconfig(ローカル環境用)
├── config-private # プライベート環境用
├── config-work # 仕事用
└── config-dev # 開発環境用
設定コード
以下のコードを~/.zshrc
に追加します。
# ======================
# Kubernetes Basic Setup
# ======================
# エイリアス定義
alias k='kubectl'
alias k8s-switch='switch-kubeconfig'
alias k8s-ctx='k8s-context'
alias k8s-namespace='k8s-ns'
# kubectl補完設定
[[ /usr/local/bin//kubectl ]] && source <(kubectl completion zsh)
# ======================
# Kubernetes Functions
# ======================
# 環境切り替え機能
function switch-kubeconfig() {
local selected_option=$(echo -e "local\nremote" | fzf \
--height 40% \
--reverse \
--header="🌟 Select Kubernetes Environment 🌟" \
--header-first \
--border rounded \
--prompt="Select › " \
--preview-window="right:60%:wrap" \
--bind 'ctrl-/:change-preview-window(down|hidden|)' \
--color='fg:#d0d0d0,fg+:#d0d0d0,bg:#262626,bg+:#262626' \
--color='info:#87afaf,prompt:#87afaf,pointer:#af87d7' \
--color='marker:#87af87,spinner:#87af87,header:#87afaf')
if [[ -z "$selected_option" ]]; then
return
fi
if [[ "$selected_option" == "local" ]]; then
unset KUBECONFIG
echo "Switched to local configuration"
k8s-status
else
local config_file=$(find ~/.kube -name "config-*" -type f | fzf \
--height 40% \
--reverse \
--preview 'echo "=== Context Info ===\n"; \
KUBECONFIG={} kubectl config get-contexts')
if [[ -n "$config_file" ]]; then
export KUBECONFIG=$config_file
echo "Switched to: $config_file"
k8s-status
fi
fi
}
# ステータス表示機能
function k8s-status() {
echo "╭─────────── Kubernetes Configuration ───────────╮"
if [[ -n "$KUBECONFIG" ]]; then
echo "│ Config: $(basename $KUBECONFIG)"
else
echo "│ Config: Local (~/.kube/config)"
fi
echo "│ Context: $(kubectl config current-context)"
echo "│"
echo "│ Available Contexts:"
kubectl config get-contexts --no-headers | while read line; do
echo "│ • $line"
done
echo "╰───────────────────────────────────────────────╯"
}
# コンテキスト切り替え機能
function k8s-context() {
local context=$(kubectl config get-contexts -o name | fzf \
--height 40% \
--reverse \
--preview 'echo "=== Context Info ===\n"; \
kubectl config get-context {}; \
echo "\n=== Nodes ===\n"; \
KUBECONFIG=~/.kube/config kubectl --context {} get nodes; \
echo "\n=== Namespaces ===\n"; \
KUBECONFIG=~/.kube/config kubectl --context {} get namespaces' \
--preview-window="right:65%:wrap")
if [[ -n "$context" ]]; then
kubectl config use-context $context
echo "Switched to context: $context"
fi
}
# 名前空間切り替え機能
function k8s-ns() {
local current_context=$(kubectl config current-context)
echo "Current context: $current_context"
local namespace=$(kubectl get namespaces -o name | cut -d/ -f2 | fzf \
--height 40% \
--reverse \
--header="🔍 Select Namespace" \
--preview "echo '=== Pods ===\n'; \
kubectl get pods -n {} -o wide; \
echo '\n=== Services ===\n'; \
kubectl get services -n {}; \
echo '\n=== Deployments ===\n'; \
kubectl get deployments -n {}" \
--preview-window="right:70%:wrap")
if [[ -n "$namespace" ]]; then
kubectl config set-context --current --namespace=$namespace
echo "Switched to namespace: $namespace in context: $current_context"
fi
}
# ローカル環境切り替え機能
function k8s-local() {
unset KUBECONFIG
echo "Switched to local kubernetes configuration"
k8s-status
}
機能解説
1. エイリアス一覧
エイリアス | 説明 |
---|---|
k |
kubectl のショートカット |
k8s-switch |
環境切り替え機能 |
k8s-ctx |
コンテキスト切り替え機能 |
k8s-namespace |
名前空間切り替え機能 |
2. kubeconfig切り替え (k8s-switch
)
- ローカル環境とリモート環境の選択が可能
- fzfによるインタラクティブな選択
- プレビュー機能でコンテキスト情報を表示
- カスタマイズされたUI(色、ボーダー、プロンプト)
3. コンテキスト切り替え (k8s-ctx
)
- 現在のkubeconfigに含まれるコンテキストをfzfで選択
- 拡張されたプレビュー表示:
- コンテキスト情報
- ノード一覧
- 名前空間一覧
4. 名前空間切り替え (k8s-namespace
)
- 現在のコンテキストの名前空間をfzfで選択
- 詳細なプレビュー表示:
- Pod一覧(wide形式)
- Service一覧
- Deployment一覧
5. ローカル環境切り替え (k8s-local
)
- ワンコマンドでローカル環境に復帰
-
~/.kube/config
をデフォルトとして使用 - kind/minikubeなどのローカルクラスタへの素早いアクセス
使用例
1. 環境の切り替え
# 環境選択(local/remote)
k8s-switch
# ローカル環境に直接切り替え
k8s-local
2. コンテキストの切り替え
k8s-ctx
# => プレビューで詳細情報を確認しながら選択
3. 名前空間の切り替え
k8s-namespace
# => プレビューでリソース情報を確認しながら選択
カスタマイズ例
1. プレビューウィンドウのサイズ調整
--preview-window="right:70%:wrap" # 右側70%でプレビュー表示
2. キーバインドの追加
--bind 'ctrl-/:change-preview-window(down|hidden|)' # プレビュー表示切り替え
--bind 'ctrl-r:reload(kubectl get namespaces)' # リスト再読み込み
3. 色テーマのカスタマイズ
--color='fg:#d0d0d0,fg+:#d0d0d0,bg:#262626,bg+:#262626' \
--color='info:#87afaf,prompt:#87afaf,pointer:#af87d7' \
--color='marker:#87af87,spinner:#87af87,header:#87afaf'
利点
-
インタラクティブな操作
- 豊富なプレビュー情報
- fzfによる柔軟な検索
-
効率的な環境管理
- 複数環境の簡単な切り替え
- 視覚的な状態確認
-
カスタマイズ性
- 表示のカスタマイズ
- 機能の拡張が容易
注意点
- fzfのインストールが必要
- 適切なkubeconfig管理が重要
- 環境変数
KUBECONFIG
の影響を理解すること
おわりに
この設定により、Kubernetesの複数環境管理が格段に使いやすくなりました。
必要に応じて自分の環境に合わせてカスタマイズしてくださいませ。
ところでfzfはなんて読むの?エフゼフ?