Kubernetes Context管理をfzfで快適に！zsh設定カスタマイズガイド

## はじめに

Kubernetesで複数のクラスタやコンテキストを扱う際、切り替えの手間が煩わしいと感じていたころにfzfを教えてもらいました。
ここでは、fzfを使用して快適なKubernetes環境の管理を実現するzsh設定をまとめます。

## 環境要件

- zsh
- kubectl
- fzf

## セットアップ

### 1. 必要なツールのインストール

```bash
# macOS
brew install kubectl fzf

# Ubuntu
sudo apt-get install kubectl fzf
```

### 2. ディレクトリ構造の準備

```bash
# .kubeディレクトリの構造
~/.kube/
├── config           # デフォルトのconfig（ローカル環境用）
├── config-private   # プライベート環境用
├── config-work     # 仕事用
└── config-dev      # 開発環境用
```

## 設定コード

以下のコードを`~/.zshrc`に追加します。

```bash
# ======================
# 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. 環境の切り替え
```bash
# 環境選択（local/remote）
k8s-switch

# ローカル環境に直接切り替え
k8s-local
```

### 2. コンテキストの切り替え
```bash
k8s-ctx
# => プレビューで詳細情報を確認しながら選択
```

### 3. 名前空間の切り替え
```bash
k8s-namespace
# => プレビューでリソース情報を確認しながら選択
```

## カスタマイズ例

### 1. プレビューウィンドウのサイズ調整
```bash
--preview-window="right:70%:wrap"  # 右側70%でプレビュー表示
```

### 2. キーバインドの追加
```bash
--bind 'ctrl-/:change-preview-window(down|hidden|)' # プレビュー表示切り替え
--bind 'ctrl-r:reload(kubectl get namespaces)' # リスト再読み込み
```

### 3. 色テーマのカスタマイズ
```bash
--color='fg:#d0d0d0,fg+:#d0d0d0,bg:#262626,bg+:#262626' \
--color='info:#87afaf,prompt:#87afaf,pointer:#af87d7' \
--color='marker:#87af87,spinner:#87af87,header:#87afaf'
```

## 利点

1. インタラクティブな操作
   - 豊富なプレビュー情報
   - fzfによる柔軟な検索

2. 効率的な環境管理
   - 複数環境の簡単な切り替え
   - 視覚的な状態確認

3. カスタマイズ性
   - 表示のカスタマイズ
   - 機能の拡張が容易

## 注意点

1. fzfのインストールが必要
2. 適切なkubeconfig管理が重要
3. 環境変数`KUBECONFIG`の影響を理解すること

## おわりに

この設定により、Kubernetesの複数環境管理が格段に使いやすくなりました。
必要に応じて自分の環境に合わせてカスタマイズしてくださいませ。
ところでfzfはなんて読むの？エフゼフ？

## 参考リンク

- [fzf GitHub](https://github.com/junegunn/fzf)
- [Kubernetes Documentation](https://kubernetes.io/docs/reference/kubectl/overview/)
- [zsh Documentation](https://zsh.sourceforge.io/Doc/)