複数の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...
実行手順
-
バックアップを取る(重要!)
cp kubeconfig.yaml kubeconfig.yaml.backup -
マージコマンドを実行
KUBECONFIG=kubeconfig.yaml:another-kubeconfig.yaml \ kubectl config view --flatten > /tmp/kubeconfig \ && mv /tmp/kubeconfig kubeconfig.yaml -
結果を確認
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も投稿していますので、よかったらフォローお願いします!