k8s便利コマンド Namespaceを恒久的に変更する方法 


一つの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