0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

0
Posted at

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

実践例

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

準備:2つのkubeconfigファイル

まず、kubeconfig.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があるとします:

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. バックアップを取る(重要!)

    cp kubeconfig.yaml kubeconfig.yaml.backup
    
  2. マージコマンドを実行

    KUBECONFIG=kubeconfig.yaml:another-kubeconfig.yaml \
        kubectl config view --flatten > /tmp/kubeconfig \
        && mv /tmp/kubeconfig kubeconfig.yaml
    
  3. 結果を確認

    kubectl config get-contexts
    

マージ後の結果

マージが成功すると、kubeconfig.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も投稿していますので、よかったらフォローお願いします!

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?