一文搞懂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这个命名空间已经不存在了。

相关推荐
新知图书42 分钟前
Rust编程与项目实战-模块std::thread(之一)
开发语言·后端·rust
盛夏绽放1 小时前
Node.js 和 Socket.IO 实现实时通信
前端·后端·websocket·node.js
Ares-Wang1 小时前
Asp.net Core Hosted Service(托管服务) Timer (定时任务)
后端·asp.net
Rverdoser2 小时前
RabbitMQ的基本概念和入门
开发语言·后端·ruby
Tech Synapse3 小时前
Java根据前端返回的字段名进行查询数据的方法
java·开发语言·后端
.生产的驴3 小时前
SpringCloud OpenFeign用户转发在请求头中添加用户信息 微服务内部调用
spring boot·后端·spring·spring cloud·微服务·架构
微信-since811924 小时前
[ruby on rails] 安装docker
后端·docker·ruby on rails
代码吐槽菌5 小时前
基于SSM的毕业论文管理系统【附源码】
java·开发语言·数据库·后端·ssm
豌豆花下猫6 小时前
Python 潮流周刊#78:async/await 是糟糕的设计(摘要)
后端·python·ai
YMWM_6 小时前
第一章 Go语言简介
开发语言·后端·golang