kubeconfigファイルを使用してクラスターアクセスを組織する
kubeconfigを使用すると、クラスターに、ユーザー、名前空間、認証の仕組みに関する情報を組織できます。kubectl
コマンドラインツールはkubeconfigファイルを使用してクラスターを選択するために必要な情報を見つけ、クラスターのAPIサーバーと通信します。
kubeconfig
という名前を持つファイルが存在するという意味ではありません。デフォルトでは、kubectl
は$HOME/.kube
ディレクトリ内にあるconfig
という名前のファイルを探します。KUBECONFIG
環境変数を設定するか、--kubeconfig
フラグで指定することで、別のkubeconfigファイルを指定することもできます。
kubeconfigファイルの作成と指定に関するステップバイステップの手順を知りたいときは、複数のクラスターへのアクセスを設定するを参照してください。
複数のクラスター、ユーザ、認証の仕組みのサポート
複数のクラスターを持っていて、ユーザーやコンポーネントがさまざまな方法で認証を行う次のような状況を考えてみます。
- 実行中のkubeletが証明書を使用して認証を行う可能性がある。
- ユーザーがトークンを使用して認証を行う可能性がある。
- 管理者が個別のユーザに提供する複数の証明書を持っている可能性がある。
kubeconfigファイルを使用すると、クラスター、ユーザー、名前空間を組織化することができます。また、contextを定義することで、複数のクラスターや名前空間を素早く簡単に切り替えられます。
Context
kubeconfigファイルのcontext要素は、アクセスパラメーターを使いやすい名前でグループ化するために使われます。各contextは3つのパラメータ、cluster、namespace、userを持ちます。デフォルトでは、kubectl
コマンドラインツールはクラスターとの通信にcurrent contextのパラメーターを使用します。
current contextを選択するには、以下のコマンドを使用します。
kubectl config use-context
KUBECONFIG環境変数
KUBECONFIG
環境変数には、kubeconfigファイルのリストを指定できます。LinuxとMacでは、リストはコロン区切りです。Windowsでは、セミコロン区切りです。KUBECONFIG
環境変数は必須ではありません。KUBECONFIG
環境変数が存在しない場合は、kubectl
はデフォルトのkubeconfigファイルである$HOME/.kube/config
を使用します。
KUBECONFIG
環境変数が存在する場合は、kubectl
はKUBECONFIG
環境変数にリストされているファイルをマージした結果を有効な設定として使用します。
kubeconfigファイルのマージ
設定ファイルを確認するには、以下のコマンドを実行します。
kubectl config view
上で説明したように、出力は1つのkubeconfigファイルから作られる場合も、複数のkubeconfigファイルをマージした結果となる場合もあります。
kubectl
がkubeconfigファイルをマージするときに使用するルールを以下に示します。
もし
--kubeconfig
フラグが設定されていた場合、指定したファイルだけが使用されます。マージは行いません。このフラグに指定できるのは1つのファイルだけです。そうでない場合、
KUBECONFIG
環境変数が設定されていた場合には、それをマージするべきファイルのリストとして使用します。KUBECONFIG
環境変数にリストされたファイルのマージは、次のようなルールに従って行われます。- 空のファイルを無視する。
- デシリアライズできない内容のファイルに対してエラーを出す。
- 特定の値やmapのキーを設定する最初のファイルが勝つ。
- 値やmapのキーは決して変更しない。
例: 最初のファイルが指定した
current-context
を保持する。 例: 2つのファイルがred-user
を指定した場合、1つ目のファイルのred-user
だけを使用する。もし2つ目のファイルのred-user
以下に競合しないエントリーがあったとしても、それらは破棄する。
KUBECONFIG
環境変数を設定する例については、KUBECONFIG環境変数を設定するを参照してください。それ以外の場合は、デフォルトのkubeconfigファイル
$HOME/.kube/config
をマージせずに使用します。以下のチェーンで最初に見つかったものをもとにして、使用するcontextを決定する。
--context
コマンドラインフラグが存在すれば、それを使用する。- マージしたkubeconrfigファイルから
current-context
を使用する。
この時点では、空のcontextも許容されます。
クラスターとユーザーを決定する。この時点では、contextである場合もそうでない場合もあります。以下のチェーンで最初に見つかったものをもとにして、クラスターとユーザーを決定します。この手順はユーザーとクラスターについてそれぞれ1回ずつ、合わせて2回実行されます。
- もし存在すれば、コマンドラインフラグ
--user
または--cluster
を使用する。 - もしcontextが空でなければ、contextからユーザーまたはクラスターを取得する。
この時点では、ユーザーとクラスターは空である可能性があります。
- もし存在すれば、コマンドラインフラグ
使用する実際のクラスター情報を決定する。この時点では、クラスター情報は存在しない可能性があります。以下のチェーンで最初に見つかったものをもとにして、クラスター情報の各パーツをそれぞれを構築します。
- もし存在すれば、
--server
、--certificate-authority
、--insecure-skip-tls-verify
コマンドラインフラグを使用する。 - もしマージしたkubeconfigファイルにクラスター情報の属性が存在すれば、それを使用する。
- もしサーバーの場所が存在しなければ、マージは失敗する。
- もし存在すれば、
使用する実際のユーザー情報を決定する。クラスター情報の場合と同じルールを使用して、ユーザー情報を構築します。ただし、ユーザーごとに許可される認証方法は1つだけです。
- もし存在すれば、
--client-certificate
、--client-key
、--username
、--password
、--token
コマンドラインフラグを使用する。 - マージしたkubeconfigファイルの
user
フィールドを使用する。 - もし2つの競合する方法が存在する場合、マージは失敗する。
- もし存在すれば、
もし何らかの情報がまだ不足していれば、デフォルトの値を使用し、認証情報については場合によってはプロンプトを表示する。
ファイルリファレンス
kubeconfigファイル内のファイルとパスのリファレンスは、kubeconfigファイルの位置からの相対パスで指定します。コマンドライン上のファイルのリファレンスは、現在のワーキングディレクトリからの相対パスです。$HOME/.kube/config
内では、相対パスは相対のまま、絶対パスは絶対のまま保存されます。
プロキシー
kubeconfigファイルでproxy-url
を使用すると、以下のようにクラスターごとにプロキシーを使用するようにkubectl
を設定することができます。
apiVersion: v1
kind: Config
clusters:
- cluster:
proxy-url: http://proxy.example.org:3128
server: https://k8s.example.org/k8s/clusters/c-xxyyzz
name: development
users:
- name: developer
contexts:
- context:
name: development