如何在kubernetes中切换名称空间

P E*_*ram 24 namespaces kubernetes

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

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

kubectl get pods -n <namespace>
Run Code Online (Sandbox Code Playgroud)

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

Die*_*des 69

有几个选项:

  • 仅使用 kubectl 命令切换命名空间:
kubectl config set-context --current --namespace=<namespace>
Run Code Online (Sandbox Code Playgroud)
  • 或者,创建一个定义了命名空间的新上下文:
kubectl config set-context gce-dev --user=cluster-admin --namespace=dev
kubectl config use-context gce-dev
Run Code Online (Sandbox Code Playgroud)
  • 或者,使用插件,如kubectx 和 kubens,下面的命令会将上下文切换到kube-system
$ kubens kube-system 
Run Code Online (Sandbox Code Playgroud)
  • 或者,我喜欢的另一个无需安装第三方工具的简单替代方法是使用 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
Run Code Online (Sandbox Code Playgroud)

  • `kubectl config set-context --current --namespace=""` (8认同)

Pus*_*ots 47

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

kubectl config set-context --current --namespace=my-namespace
Run Code Online (Sandbox Code Playgroud)

来自

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
Run Code Online (Sandbox Code Playgroud)

  • 或者,可以使用“kubectl config view -o jsonpath={.contexts[].context.namespace}”仅获取名称空间,而无需任何其他工具 (4认同)
  • 通过执行以下命令`kubectl config view |来验证当前名称空间是否已更改是一个好习惯。grep命名空间: (3认同)

kva*_*aps 20

我不喜欢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".
Run Code Online (Sandbox Code Playgroud)

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

  • 这一定是迄今为止我最喜欢的答案!虽然有一个相当合理但不幸的是很长的命令可以在不扩展或别名 kubectl 命令的情况下执行此操作,但该解决方案不仅简短且易于使用,而且还很好地演示了如何使用简单且易于理解的子命令正确扩展 kubectl 。我向您致敬,好先生!;-) (2认同)

P E*_*ram 13

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

kubectl config set-context $(kubectl config current-context) --namespace=<namespace>
kubectl config view | grep namespace
kubectl get pods
Run Code Online (Sandbox Code Playgroud)

这就是我测试的方式

# 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
Run Code Online (Sandbox Code Playgroud)

  • 您可能必须使用`kubectl config view --minify | grep namespace:` 获取当前命名空间。 (2认同)

Moh*_*leh 5

您可以使用以下名为kubectx的程序包,该程序包使使用kubectx在群集之间切换变得非常容易

在此处输入图片说明

和使用kubens在名称空间之间切换

在此处输入图片说明


Ben*_*ins 5

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

ksns() { kubectl config set-context --current --namespace="$1" }
Run Code Online (Sandbox Code Playgroud)

然后我打电话 ksns default