kubeconfigを一つのファイルにマージするワンライナー

複数のKubernetesクラスターを扱っていると、kubeconfigファイルが散らばってしまうことはありませんでしょうか？「このクラスターの設定はどのファイルだっけ...」と探し回ったり、KUBECONFIG環境変数で複数のパスを指定するのも面倒ですよね。

本稿では、複数のkubeconfigファイルを1つにマージする安全で確実な方法について解説していきます。

## kubeconfigを一つのファイルにマージするワンライナー

kubeconfigファイルをマージするには、以下のワンライナーを使います：

```bash
KUBECONFIG=kubeconfig.yaml:another-kubeconfig.yaml \
    kubectl config view --flatten > /tmp/kubeconfig \
    && mv /tmp/kubeconfig kubeconfig.yaml
```

## ポイント1: KUBECONFIG環境変数の活用

kubectlコマンドは、`KUBECONFIG`環境変数に複数のファイルパスをコロン（`:`）区切りで指定できます。これを活用すると、一時的に複数のkubeconfigファイルを同時に読み込めます。

```bash
KUBECONFIG=file1.yaml:file2.yaml:file3.yaml kubectl ...
```

この機能を使って、マージしたい全てのファイルをkubectlに認識させます。

## ポイント2: --flattenオプション

`kubectl config view`コマンドに`--flatten`オプションを付けることで、次のような処理が行われます：

- 複数のコンテキスト、クラスター、ユーザー情報を1つのファイルに統合
- 証明書データなどの外部ファイル参照を、実際のデータに展開
- 重複する設定の整理

特に2番目の「外部ファイル参照の展開」は重要です。`--flatten`を使わないと、証明書ファイルへのパスだけが保存され、別環境で使えなくなる可能性があります。

## ポイント3: 一時ファイルを経由する

なぜ直接リダイレクトせず、一時ファイルを経由するのでしょうか？

```bash
# これはダメ！
KUBECONFIG=kubeconfig.yaml:another.yaml kubectl config view --flatten > kubeconfig.yaml
```

上記のように直接リダイレクトすると、シェルがまず`kubeconfig.yaml`を空にしてしまい、kubectlが読み込む前にファイルの内容が失われてしまいます。これを防ぐため、必ず一時ファイルを経由する必要があります。

## 実践例

それでは、実際の使用例を見てみましょう。

### 準備：2つのkubeconfigファイル

まず、`kubeconfig.yaml`（既存のファイル）があるとします：

```yaml
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTi...
    server: https://127.0.0.1:53300
  name: kind-cluster-foo
contexts:
- context:
    cluster: kind-cluster-foo
    user: kind-cluster-foo
  name: kind-cluster-foo
current-context: kind-cluster-foo
kind: Config
preferences: {}
users:
- name: kind-cluster-foo
  user:
    client-certificate-data: LS0tLS1CRUdJTi...
    client-key-data: LS0tLS1CRUdJTi...
```

そして、追加したい`another-kubeconfig.yaml`があるとします：

```yaml
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTi...
    server: https://127.0.0.1:53343
  name: kind-cluster-bar
contexts:
- context:
    cluster: kind-cluster-bar
    user: kind-cluster-bar
  name: kind-cluster-bar
current-context: kind-cluster-bar
kind: Config
preferences: {}
users:
- name: kind-cluster-bar
  user:
    client-certificate-data: LS0tLS1CRUdJTi...
    client-key-data: LS0tLS1CRUdJTi...
```

### 実行手順

1. **バックアップを取る**（重要！）
   ```bash
   cp kubeconfig.yaml kubeconfig.yaml.backup
   ```

2. **マージコマンドを実行**
   ```bash
   KUBECONFIG=kubeconfig.yaml:another-kubeconfig.yaml \
       kubectl config view --flatten > /tmp/kubeconfig \
       && mv /tmp/kubeconfig kubeconfig.yaml
   ```

3. **結果を確認**
   ```bash
   kubectl config get-contexts
   ```

### マージ後の結果

マージが成功すると、`kubeconfig.yaml`は以下のような内容になります：

```yaml
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTi...
    server: https://127.0.0.1:53343
  name: kind-cluster-bar
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTi...
    server: https://127.0.0.1:53300
  name: kind-cluster-foo
contexts:
- context:
    cluster: kind-cluster-bar
    user: kind-cluster-bar
  name: kind-cluster-bar
- context:
    cluster: kind-cluster-foo
    user: kind-cluster-foo
  name: kind-cluster-foo
current-context: kind-cluster-foo
kind: Config
preferences: {}
users:
- name: kind-cluster-bar
  user:
    client-certificate-data: LS0tLS1CRUdJTi...
    client-key-data: LS0tLS1CRUdJTi...
- name: kind-cluster-foo
  user:
    client-certificate-data: LS0tLS1CRUdJTi...
    client-key-data: LS0tLS1CRUdJTi...
```

両方のクラスター設定が1つのファイルに統合されました！

## まとめ

kubeconfigファイルのマージは、`KUBECONFIG`環境変数と`kubectl config view --flatten`を組み合わせることで実行できます。忘れちゃいけないことは、実行前のバックアップです!

複数のKubernetesクラスターを管理する際、この方法を使えばkubeconfigファイルをきれいに整理できます。ぜひ試してみてください！

---

最後までお読みくださりありがとうございました。Kubernetesに関する他のTipsも投稿していますので、よかったらフォローお願いします!