kubectl やその他の Kubernetes のツールが環境変数を読んで context/namespace を決定するようにする
#Kubernetes
以下のような設定を zshrc に追加する
code:zsh
if -z "${SESSION_KUBECONFIG}" ; then
export SESSION_KUBECONFIG="$(mktemp -t "kubeconfig.XXXXXX")"
export KUBECONFIG="${SESSION_KUBECONFIG}:${KUBECONFIG:-"${HOME}/.kube/config"}"
fi
function update_session_kubeconfig() {
if -n "${KUBECTL_CONTEXT}" && -n "${KUBECTL_NAMESPACE}" ; then
echo "Configured kubeconfig to ${KUBECTL_CONTEXT} context, ${KUBECTL_NAMESPACE} namespace."
else
echo "Cleaned up kubeconfig."
fi
cat <<EOF >"${SESSION_KUBECONFIG}"
apiVersion: v1
kind: Config
current-context: ${KUBECTL_CONTEXT}
contexts:
- context:
cluster: cluster-name
namespace: ${KUBECTL_NAMESPACE}
user: me
name: context-name
EOF
}
add-zsh-hook precmd update_session_kubeconfig
update_session_kubeconfig
シェルセッションごとに mktemp で一時的な kubeconfig である SESSION_KUBECONFIG を用意してやり、KUBECONFIG 環境変数にセットする
この時、元の kubeconfig も KUBECONFIG 環境変数に残しておくことで SESSION_KUBECONFIG 側にクラスタへの接続先情報(clusters)を複製しなくてもいいようにする
元の KUBECONFIG 環境変数がセットされていない場合はとりあえず ${HOME}/.kube/config を見ておく
SESSION_KUBECONFIG のテンプレートは適当なので接続先に合わせて context を増やす
余談
元々以下のようなエイリアスに近い仕組みを使っていたが、kubectl 以外の Kubernetes 関連の CLI ツールもよく使うようになって困ったので上記の仕組みに移行した
code:zsh
alias kubectl='kubectl --context="${KUBECTL_CONTEXT}" --namespace="${KUBECTL_NAMESPACE}"'