如何在 Kubernetes 中切换命名空间

Posted

技术标签:

【中文标题】如何在 Kubernetes 中切换命名空间【英文标题】:How to switch namespace in kubernetes 【发布时间】:2019-08-17 19:30:06 【问题描述】:

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

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

kubectl get pods -n <namespace>

我们需要将命名空间附加到所有命令以列出来自相应命名空间的对象。有没有办法在不明确包含命名空间的情况下设置特定的命名空间并列出对象?

【问题讨论】:

kubectl config set-context --help 可能是您正在寻找的 【参考方案1】:

查看https://krew.sigs.k8s.io/,他们有大量适用于不同用例的插件。

用于安装 https://krew.sigs.k8s.io/docs/user-guide/setup/install/

kubectl krew install kubens

然后在运行以下命令后将为您设置当前上下文

kubens <namespace> 

【讨论】:

【参考方案2】:

有几个选项:

仅使用 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 
或者,另一个我喜欢不安装第三方工具的简单替代方法是使用 bash 别名 (linux)。
$ alias kubens='kubectl config set-context --current --namespace '
$ alias kubectx='kubectl config use-context '

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

【讨论】:

如何取消设置当前命名空间? kubectl config set-context --current --namespace=""【参考方案3】:

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

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

然后我打电话给ksns default

【讨论】:

【参考方案4】:

我不喜欢 kubectxkubens,因为它们在 kubectl 命令中再添加一个用于 bash-complection 的字母。

所以我只写了一个小小的 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

【讨论】:

到目前为止,这一定是我最喜欢的答案!虽然有一个非常合理但不幸的是很长的命令可以在不扩展或别名 kubectl 命令的情况下执行此操作,但该解决方案不仅简短易用,而且还 - 非常好 - 演示了如何使用简单易懂的子命令正确扩展 kubectl .我向您致敬,好先生! ;-)【参考方案5】:

解决方案

npm install -g k8ss

k8ss switch --namespace=your_namespace
kubectl get pods

TLDR;按要求解释

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

完整的用法是

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

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

高级用法

如果您需要在不同的集群之间切换,那么您需要将多个配置文件放在您的主目录中。在这种情况下,您可以前往package README 了解更多信息。

【讨论】:

【参考方案6】:

我喜欢我的回答简短、中肯并参考官方文档:

回答

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

【讨论】:

执行以下命令kubectl config view | grep namespace: 来验证当前命名空间是否已更改是一个很好的做法【参考方案7】:

您可以使用以下名为 kubectx 的包,它可以非常轻松地使用 kubectx

在集群之间切换

并使用 kubens

在命名空间之间切换

【讨论】:

【参考方案8】:

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

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

【讨论】:

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

以上是关于如何在 Kubernetes 中切换命名空间的主要内容,如果未能解决你的问题,请参考以下文章

如何从默认 kops 命令更改 kubernetes 上下文中的默认命名空间?

如何在一个 Kubernetes 集群中的命名空间之间隔离 Keycloak Infinispan,以防止 KC pod 相互发现和同步

如何使用命名空间管理Kubernetes资源?

Kubernetes 设置命令行的命名空间

限制 Kubernetes 服务帐户访问特定命名空间

从普罗米修斯抓取中排除 Kubernetes 命名空间