一つのk8sクラスタに、複数のネームスペース(名前空間)を作って、例えば、Development(開発)環境 と Production(本番)環境 を共存できるので、幾つも環境を作らなくても良くなり、構築や維持のオーバーヘッドを減らし、ハードウェアやクラウドのコストを節約できるので、たいへん有用と言えます。
しかし、毎回 kubectl コマンドのオプションとして、ネームスペースを指定したのでは、操作上の間違いを誘発して危険です。 そこで、ネームスペースを恒久的に変更する方法についてのメモです。
kubectlコマンドのコンフィグ
kubectlコマンドの設定ファイルは、$HOME/.kube/config
または、環境変数 $KUBECONFIG
の指す場所にあります。 この中に kubectlコマンドがアクセスするべき、デフォルトのネームスペースが保存されています。 しかし、直接このファイルを変更する事は適切では無いので、コマンドを使って切り替える方法を確認していきます。
ネームスペース、ユーザー、クラスタの組み合わせの環境に名前をつけて、その名前を指定して切り替えられる様になります。
現状を確認
現在のコンフィグを表示するには、kubectl config view
を利用します。 以下の例で、contexts
の cluster:
と user:
の値フィールドを利用するので、メモ帳などにコピペしておきます。
$ kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: REDACTED
server: https://172.42.42.11:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: REDACTED
client-key-data: REDACTED
ネームスペースのリスト
切り替え先として設定するべき、ネームスペースを調べるために、kubectl get ns
でリストします。
$ kubectl get ns
NAME STATUS AGE
default Active 10d
ingress-controller Active 1d
ingress-nginx Active 14h
kube-public Active 10d
kube-system Active 10d
ネームスペースを設定
ネームスペースを含む環境設定に名前を指摘して切り替える様にするため、次のコマンドで、設定名を登録します。ネームスペース名、クラスタ名、ユーザー名は、前述の方法で取得して指定します。 「設定名」は、コンテキスト名であり、自分にとって解りやすい文字列、または、プロジェクトで決めた文字列を利用します。
kubectl config set-context <設定名> --namespace=<ネームスペース名> --cluster=<クラスタ名> --user=<ユーザー名>
具体例を以下に挙げます. ここで設定したコンテキスト名 ingress-nginx
を指定する事で、ネームスペースを恒久的にスイッチできる様になります。
$ kubectl config set-context ingress-nginx --namespace=ingress-nginx --cluster=kubernetes --user=kubernetes-adminContext "ingress-nginx" created.
次のコマンドで登録したコンテキスト名のリストを表示できます。
$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
ingress-nginx kubernetes kubernetes-admin ingress-nginx
* kubernetes-admin@kubernetes kubernetes kubernetes-admin
ネームスペースの切り替え
ネームスペースをスイッチするには、kubectl config use-context <コンテキスト名>
を利用します。 以下に具体例を挙げます。
$ kubectl config use-context ingress-nginx
Switched to context "ingress-nginx".
切り替えた結果の確認です。 CURRENTの欄に、* がついている行が、現在有効な設定です。
$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* ingress-nginx kubernetes kubernetes-admin ingress-nginx
kubernetes-admin@kubernetes kubernetes kubernetes-admin
元に戻す方法
次の様に、元のコンテキスト名を指定する事で、初期状態に戻せます。
$ kubectl config use-context kubernetes-admin@kubernetes
Switched to context "kubernetes-admin@kubernetes".
$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
ingress-nginx kubernetes kubernetes-admin ingress-nginx
* kubernetes-admin@kubernetes kubernetes kubernetes-admin
参考資料
「Share a Cluster with Namespaces」, < https://kubernetes.io/docs/tasks/administer-cluster/namespaces/>, 2018/4/26
「Overview of kubectl」, < https://kubernetes.io/docs/reference/kubectl/overview/ >, 2018/4/25