一文搞懂Kubernetes 核心概念 - Namespaces

什么是Kubernetes Namespaces?

根据官方文档,Kubernetes支持由同一物理集群支持的多个虚拟集群。这些虚拟集群称为名称空间。

Kubernetes Namespaces 以一种更简单的方式帮助从事不同项目、团队或客户的组织共享一个公共的Kubernetes基础设施

为什么需要Namespaces?

当我们有大量的Kubernetes资源运行在我们的集群上时,Kubernetes命名空间有助于组织它们,并允许您根据项目的性质将它们分组在一起。通过这样做,您可以更好地控制它们,并可以通过使用单元过滤器有效地管理它们。

例如,我们可以为项目或应用程序的不同应用程序生命周期环境(如开发、登台、生产等)创建单独的名称空间。

所有kubernetes资源的名称在一个命名空间内必须是唯一的,而不是跨命名空间。在我们前面讨论的应用程序生命周期环境中,跨名称空间具有相同资源对象名称的特性非常方便。

命名空间的嵌套是不允许的,因为所有的Kubernetes资源只能在一个命名空间中

default Namespace

根据设计,当您提供Kubernetes集群时,它将以默认名称空间启动,以保存集群使用的默认pod、Services和deployment集。此名称空间的对象部分不属于其他名称空间。

List all Namespaces part of a Kubernetes cluster

kotlin 复制代码
root@kube-master:~# kubectl get namespaces

除了默认的名称空间之外,还可以看到上面创建的另外三个名称空间。让我们来了解一下它们是什么。

了解有关默认命名空间的更多信息:
Kubectl description命令可用于显示与名称空间关联的标签和注释,以及已应用于该名称空间的任何配额或资源限制。

perl 复制代码
root@kube-master:~# kubectl describe namespaces default

创建Namespace

与任何其他Kubernetes对象一样,名称空间也可以通过两种方式创建。

  • 使用命令行工具kubectl
  • 使用yaml清单文件

为了从命令行终端创建新的名称空间,可以使用命令kubectl create namespace,方法是将要创建的名称空间名称作为命令的参数提供给该命令。

typescript 复制代码
root@kube-master:~# kubectl create namespace lco-namespace-demo
namespace/lco-namespace-demo created

List the Namespace created

kotlin 复制代码
root@kube-master:~# kubectl get namespaces

Describe the Namespace

perl 复制代码
root@kube-master:~# kubectl describe namespaces lco-namespace-demo

Create Namespace using a yaml manifest file

与任何其他Kubernetes资源一样,名称空间也可以通过应用manifest文件来创建。

vbnet 复制代码
root@kube-master:~# cat lco-namespace-demo.yml
apiVersion: v1
kind: Namespace
metadata:
  name: lco-demo-namespace

apply 文件来创建Namespace

typescript 复制代码
root@kube-master:~# kubectl apply -f lco-namespace-demo.yml
namespace/lco-demo-namespace created

List the Namespace created

kotlin 复制代码
root@kube-master:~# kubectl get namespaces

在新创建的命名空间中启动kubernetes对象

现在我们已经创建了一个名为lco-demo-namespace的命名空间。让我们使用以下命令在该命名空间中启动一个pod。你需要指定要启动对象的命名空间名称。

typescript 复制代码
root@kube-master:~# kubectl run namespace-demo-nginx --image=nginx --namespace=lco-namespace-demo
pod/namespace-demo-nginx created

List the Pod created within that Namespace

sql 复制代码
root@kube-master:~# kubectl get pods --namespace=lco-namespace-demo
NAME                   READY   STATUS    RESTARTS   AGE
namespace-demo-nginx   1/1     Running   0          17s

也可以指定一个过滤器(------namespace=lco- namspace -demo)来查看新创建的对象

如果我们没有明确指定namespace,那么在默认情况下Kubernetes对象将在default明明空间下

通过设置上下文更改默认命名空间

在处理项目时,您希望避免在创建或修改对象时为每个命令提供相同的名称空间。这可以通过更改默认名称空间来实现。

要实现这一点,我们需要更改上下文设置。

在Kubernetes中Context作用是什么?

context是一组访问参数。每个context(上下文)包含一个Kubernetes集群、一个用户和一个命名空间。当前context是kubectl当前默认的集群。所有kubectl命令都针对该集群运行。

要列出当前上下文配置的详细信息,请键入:

sql 复制代码
root@kube-master:~# kubectl config get-contexts
CURRENT   NAME                          CLUSTER      AUTHINFO           NAMESPACE
*         kubernetes-admin@kubernetes   kubernetes   kubernetes-admin

在上文的输出中,表明我们有一个名为Default的上下文正在使用。上下文没有指定名称空间,因此应用默认名称空间

更改该上下文使用的名称空间

perl 复制代码
root@kube-master:~# kubectl config set-context $(kubectl config current-context) --namespace=lco-namespace-demo
Context "kubernetes-admin@kubernetes" modified.

现在查看我们配置的上下文详细信息:

sql 复制代码
root@kube-master:~# kubectl config get-contexts
CURRENT   NAME                          CLUSTER      AUTHINFO           NAMESPACE
*         kubernetes-admin@kubernetes   kubernetes   kubernetes-admin   lco-namespace-demo

现在,当我们每次在名称空间(lco- namspace -demo)中创建或修改任何Kubernetes对象时,都不需要指定namespace参数

创建另一个pod来查看:

typescript 复制代码
root@kube-master:~# kubectl run namespace-context-demo-nginx --image=nginx
pod/namespace-context-demo-nginx created

验证Pod是否存在:

sql 复制代码
root@kube-master:~# kubectl get pods
NAME                           READY   STATUS    RESTARTS   AGE
namespace-context-demo-nginx   1/1     Running   0          13s
namespace-demo-nginx           1/1     Running   0          3m13s

注意,我们在这里没有指定任何------nampespace过滤器。默认情况下,它显示命名空间lco- namspace -demo的对象部分

验证kubectl describe命令现在默认使用lco- namspace -demo

vbnet 复制代码
root@kube-master:~# kubectl describe pod namespace-context-demo-nginx | grep Namespace
Namespace:    lco-namespace-demo

在Kubernetes名称空间之间切换

只需运行与上面相同的命令,在不同的Kubernetes名称空间之间切换。

perl 复制代码
root@kube-master:~# kubectl config set-context $(kubectl config current-context) --namespace=lco-demo-namespace
Context "kubernetes-admin@kubernetes" modified.

在这里,我们切换到另一个名为lco-demo-namespace的名称空间

验证一下:

sql 复制代码
root@kube-master:~# kubectl config get-contexts
CURRENT   NAME                          CLUSTER      AUTHINFO           NAMESPACE
*         kubernetes-admin@kubernetes   kubernetes   kubernetes-admin   lco-demo-namespace

另一种验证变更的方法:

sql 复制代码
root@kube-master:~# kubectl get sa default -o jsonpath='{.metadata.namespace}'

lco-demo-namespace

每当我们使用kubectl命令对Kubernetes集群进行任何更改时,所有这些更改最终都会配置到kube配置文件中

scss 复制代码
root@kube-master:~# cat ~/.kube/config
...
...
contexts:
- context:
    cluster: kubernetes
    namespace: lco-demo-namespace
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
...
...

重命名Namespace

往往我们不推荐进行namespace rename操作,因为rename namespace在Kubernetes 中不是标准做法。

删除Namespace

一旦我们完成了工作并且觉得不再需要名称空间,可以进行删除操作

但在这里要小心!因为删除名称空间不仅会删除名称空间,还会删除其中部署的所有资源。所以如果你不小心,这是非常危险的。

最好是在我们删除之前列出与名称空间关联的资源,以验证将被删除的对象:

sql 复制代码
root@kube-master:~# kubectl get all --namespace=lco-namespace-demo
NAME                               READY   STATUS    RESTARTS   AGE
pod/namespace-context-demo-nginx   1/1     Running   0          4m11s
pod/namespace-demo-nginx           1/1     Running   0          7m11s

现在,如果确定删除范围,可以运行以下命令删除它:

typescript 复制代码
root@kube-master:~# kubectl delete namespaces lco-namespace-demo
namespace "lco-namespace-demo" deleted

执行之后,所有相关的资源都会被删除:

typescript 复制代码
root@kube-master:~# kubectl get all --namespace=lco-namespace-demo
No resources found in lco-namespace-demo namespace.

然后在验证namespace 是否存在:

kotlin 复制代码
root@kube-master:~# kubectl get namespaces

我们发现 lco-namespace-demo这个命名空间已经不存在了。

相关推荐
追逐时光者38 分钟前
推荐 12 款开源美观、简单易用的 WPF UI 控件库,让 WPF 应用界面焕然一新!
后端·.net
Jagger_39 分钟前
敏捷开发流程-精简版
前端·后端
苏打水com1 小时前
数据库进阶实战:从性能优化到分布式架构的核心突破
数据库·后端
间彧2 小时前
Spring Cloud Gateway与Kong或Nginx等API网关相比有哪些优劣势?
后端
间彧2 小时前
如何基于Spring Cloud Gateway实现灰度发布的具体配置示例?
后端
间彧2 小时前
在实际项目中如何设计一个高可用的Spring Cloud Gateway集群?
后端
间彧3 小时前
如何为Spring Cloud Gateway配置具体的负载均衡策略?
后端
间彧3 小时前
Spring Cloud Gateway详解与应用实战
后端
EnCi Zheng4 小时前
SpringBoot 配置文件完全指南-从入门到精通
java·spring boot·后端
烙印6014 小时前
Spring容器的心脏:深度解析refresh()方法(上)
java·后端·spring