如何在k8s中永久更改Namespace的快捷命令?

在一个k8s集群中,创建多个命名空间可以使开发环境和生产环境共存,而无需创建多个环境,从而减少构建和维护的工作量,节约硬件和云端成本,这非常有用。
然而,每次都要通过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   

请参考以下资料。

「与命名空间共享集群」,<https://kubernetes.io/docs/tasks/administer-cluster/namespaces/>,2018/4/26
「kubectl概述」,<https://kubernetes.io/docs/reference/kubectl/overview/>,2018/4/25