如何在kubernetes中切换名称空间


83

说,我有两个名称空间k8s-app1和k8s-app2

我可以使用以下命令列出来自特定名称空间的所有Pod

kubectl get pods -n <namespace>

我们需要在所有命令后附加名称空间,以列出各个名称空间中的对象。有没有一种方法可以设置特定的名称空间并列出对象,而无需显式地包括名称空间?


嗨, kubectl config set-context --help您可能正在寻找
Suresh Vishnoi,

Answers:


142

我喜欢简短的回答,而且要提到官方文档:

kubectl config set-context --current --namespace=my-namespace

来自

https://kubernetes.io/docs/reference/kubectl/cheatsheet/

# permanently save the namespace for all subsequent kubectl commands in that context.
kubectl config set-context --current --namespace=ggckad-s2

6
优良作法是通过执行以下命令来验证当前名称空间是否已更改kubectl config view | grep namespace:
tet

41

您可以使用kubectl命令:

仅切换名称空间:

kubectl config set-context --current --namespace=<namespace>

使用定义的名称空间创建新的上下文:

kubectl config set-context gce-dev --user=cluster-admin --namespace=dev
kubectl config use-context gce-dev

或使用插件,例如kubectx和kubens,以下命令会将上下文切换为kube-system

$ kubens kube-system

我更喜欢的另一个简单选择是,您不想安装第三方工具,就是使用别名。

$ alias kubens='kubectl config set-context --current --namespace '
$ alias kubectx='kubectl config use-context '

$ kubens kube-system    //Switch to a different namespace
$ kubectx docker        //Switch to separate context

如何取消设置当前名称空间?
斯蒂芬

1
kubectl config set-context --current --namespace=""
迭戈·门德斯

24

我可以使用以下步骤切换名称空间

kubectl config set-context $(kubectl config current-context) --namespace=<namespace>
kubectl config view | grep namespace
kubectl get pods

这就是我测试的方式

# Create namespaces k8s-app1, k8s-app2 and k8s-app3
master $ kubectl create ns k8s-app1
namespace/k8s-app1 created
master $ kubectl create ns k8s-app2
namespace/k8s-app2 created
master $ kubectl create ns k8s-app3
namespace/k8s-app3 created

# Create Service Account app1-sa in k8s-app1
# Service Account app2-sa in k8s-app2
# Service Account app3-sa in k8s-app3
master $ kubectl create sa app1-sa -n k8s-app1
serviceaccount/app1-sa created
master $ kubectl create sa app2-sa -n k8s-app2
serviceaccount/app2-sa created
master $ kubectl create sa app3-sa -n k8s-app3
serviceaccount/app3-sa created

# Switch namespace
master $ kubectl config set-context $(kubectl config current-context) --namespace=k8s-app1
Context "kubernetes-admin@kubernetes" modified.
master $ kubectl config view | grep namespace
    namespace: k8s-app1
master $ kubectl get sa
NAME      SECRETS   AGE
app1-sa   1         1m
default   1         6m
master $
master $ kubectl config set-context $(kubectl config current-context) --namespace=k8s-app2
Context "kubernetes-admin@kubernetes" modified.
master $ kubectl get sa
NAME      SECRETS   AGE
app2-sa   1         2m
default   1         7m
master $
master $ kubectl config set-context $(kubectl config current-context) --namespace=k8s-app3
Context "kubernetes-admin@kubernetes" modified.
master $ kubectl get sa
NAME      SECRETS   AGE
app3-sa   1         2m
default   1         7m

1
您可能必须使用kubectl config view --minify | grep namespace:获取当前名称空间。
dabest1


11

我不喜欢kubectxkubens,因为它们在kubectl命令中又添加了一个用于bash压缩的字母。

所以我只写了一个很小的kubectl-use插件:

# kubectl use prod
Switched to context "prod".

# kubectl use default
Switched to namespace "default".

# kubectl use stage kube-system
Switched to context "stage".
Switched to namespace "kube-system".

如果您对此感兴趣,请查看https://github.com/kvaps/kubectl-use


1
到目前为止,这必须是我最喜欢的答案!尽管有一个相当合理但不幸的长命令无需扩展或别名化kubectl命令即可执行此操作,但此解决方案不仅简短易用,而且还很好地演示了如何使用简单易懂的子命令正确扩展kubectl 。我给你戴顶帽子,好先生!;-)
Saustrup

2

我在.zshrc中创建了一个函数

ksns() { kubectl config set-context --current --namespace="$1" }

然后我打电话 ksns default


-2

一个办法

npm install -g k8ss

k8ss switch --namespace=your_namespace
kubectl get pods

TLDR;要求说明

有一个名为的npm软件包k8ss代表K8S Switching between clusters and namespaces

完整用法是

k8ss switch --cluster=your_new_cluster --namespace=your_new_namespace

与您的情况一样,您只需要切换名称空间,因此您可以使用该命令而无需进行任何配置(因为您已经在中放置了一个配置文件~/.kube/config)。

高级用法

如果需要在不同的群集之间切换,则需要在主目录中放置多个配置文件。在这种情况下,您可以转到README软件包以了解更多信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.