什么是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
这个命名空间已经不存在了。