手当たり次第に書くんだ

飽きっぽいのは本能

Ubuntu 26.04 kubeconfig の基本設定 – kubectl の context と複数クラスタを管理する

関連する記事

kubeconfig は、kubectl がどの Kubernetes クラスタへ、どの user と context で接続するかを決める設定ファイルです。複数クラスタを扱う管理端末では、context 名とファイルの権限を管理しておかないと、操作対象の取り違えや認証情報の漏えいにつながります。

この記事では、Ubuntu 26.04 の管理端末で kubeconfig を扱う基本として、クラスタごとの kubeconfig を分けて保存し、kubectl config view --merge --flatten で統合し、~/.kube/config として配置する流れをまとめます。

この記事で扱うこと
  • kubeconfig に含まれる情報
  • ~/.kubeconfig の権限
  • cluster / context / user 名の正規化
  • 複数 kubeconfig の merge と flatten
  • context の確認と切り替え
対象 OSUbuntu 26.04 Server
標準配置/home/myadmin/.kube/config
作業ディレクトリ例~/work/k8s/kubeconfig_merge
ディレクトリ権限0700
ファイル権限0600

kubeconfig に含まれる情報

kubeconfig には cluster、user、context、current-context が含まれます。user には token、client certificate、exec 認証設定など、クラスタへ接続するための認証情報が入る場合があります。

kubeconfig は単なる接続先一覧ではありません。認証情報を含むことがあるため、ログ、差分、チャット、チケット、公開リポジトリへ貼り付けないように扱います。

kubectl config view
kubectl config get-contexts
kubectl config current-context

保存先と権限を決める

標準の保存先は ~/.kube/config です。ディレクトリは 0700、ファイルは 0600 を基本にします。

install -d -m 0700 "$HOME/.kube"
touch "$HOME/.kube/config"
chmod 0600 "$HOME/.kube/config"
ls -ld "$HOME/.kube"
ls -l "$HOME/.kube/config"

クラスタごとの kubeconfig を分ける

複数クラスタを扱う場合は、最初から ~/.kube/config に直接追記するより、クラスタごとの kubeconfig を別ファイルに分けて保存してから統合すると管理しやすくなります。

workdir="$HOME/work/k8s/kubeconfig_merge"
cluster_dir="$workdir/clusters"
merged_dir="$workdir/merged"
install -d -m 0775 "$workdir"
install -d -m 0775 "$cluster_dir"
install -d -m 0700 "$merged_dir"
chmod 0600 "$cluster_dir"/*.yaml

名前を正規化する

kubeadm や MicroK8s などから取得した kubeconfig は、context 名が kubernetes-admin@kubernetes のように重複しやすい場合があります。複数クラスタを統合する前に、cluster、context、user をクラスタ名や FQDN に合わせてそろえます。

kubectl --kubeconfig "$cluster_dir/cluster-a.yaml" config rename-cluster kubernetes k8s-cp-g01-n001.example.com
kubectl --kubeconfig "$cluster_dir/cluster-a.yaml" config rename-context kubernetes-admin@kubernetes k8s-cp-g01-n001.example.com
kubectl --kubeconfig "$cluster_dir/cluster-a.yaml" config rename-user kubernetes-admin k8s-cp-g01-n001.example.com
kubectl --kubeconfig "$cluster_dir/cluster-a.yaml" config use-context k8s-cp-g01-n001.example.com
kubectl --kubeconfig "$cluster_dir/cluster-a.yaml" config get-contexts

複数 kubeconfig を merge する

KUBECONFIG に複数ファイルをコロン区切りで指定し、kubectl config view --merge --flatten で統合します。--flatten を付けると、参照情報を1つの kubeconfig にまとめやすくなります。

export KUBECONFIG="$cluster_dir/cluster-a.yaml:$cluster_dir/cluster-b.yaml"
kubectl config view --merge --flatten > "$merged_dir/config"
chmod 0600 "$merged_dir/config"
kubectl --kubeconfig "$merged_dir/config" config get-contexts

~/.kube/config へ配置する

統合した kubeconfig を標準の位置へ配置します。既存ファイルを置き換える前にバックアップを取り、配置後に context を確認します。

cp -a "$HOME/.kube/config" "$HOME/.kube/config.bak"
install -m 0600 "$merged_dir/config" "$HOME/.kube/config"
kubectl config get-contexts
kubectl config current-context

context を切り替える

複数クラスタを扱うときは、実行前に current context を確認します。特に kubectl deletehelm upgrade の前には、namespace と context をセットで確認します。

kubectl config get-contexts
kubectl config use-context k8s-cp-g01-n001.example.com
kubectl config set-context --current --namespace default
kubectl get nodes -o wide

到達不能なクラスタの扱い

一時的に到達不能なクラスタがある場合でも、既存の kubeconfig をすぐ削除しない方がよい場面があります。復旧後に再利用する可能性があるため、どのクラスタが取得できなかったのかを分けて記録します。

kubectl --context k8s-cp-g01-n001.example.com get nodes
kubectl --context k8s-cp-g02-n001.example.com get nodes
kubectl config get-contexts

差分共有に注意する

kubeconfig は認証情報を含むため、構成管理ツールの --diff や CI ログに内容が出ないように注意します。必要な場合は、認証情報をマスクするか、差分出力を抑制します。

  • ~/.kube0700 にする
  • ~/.kube/config0600 にする
  • cluster / context / user 名をクラスタごとに一意にする
  • kubectl config view --merge --flatten で統合する
  • 作業前に current context と namespace を確認する
  • kubeconfig の差分や本文を不用意に共有しない

まとめ

Ubuntu 26.04 の管理端末で kubeconfig を扱う場合、重要なのは kubectl が動くことだけではありません。複数クラスタの context 名を一意にし、権限を絞り、認証情報を含むファイルとして慎重に扱う必要があります。

クラスタごとの kubeconfig を分けて保存し、KUBECONFIGkubectl config view --merge --flatten で統合してから ~/.kube/config へ配置すると、管理端末で複数クラスタを扱いやすくなります。

関連する記事
Ubuntu 26.04 kubeconfig の基本設定 – kubectl の context と複数クラスタを管理する

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る