📕作者简介: 过去日记,致力于Java、GoLang,Rust等多种编程语言,热爱技术,喜欢游戏的博主。
📘相关专栏Rust初阶教程、go语言基础系列、spring教程等,大家有兴趣的可以看一看
📙Java并发编程系列,设计模式系列、go web开发框架 系列正在发展中,喜欢Java,GoLang,Rust,的朋友们可以关注一下哦!
文章目录
- 使用名称空间共享集群
- 查看名称空间
- 创建名称空间
- 删除名称空间
- 使用名称空间切分集群
- 理解 default 名称空间
- 创建新的名称空间
- 在每个名称空间中创建 Pod
- 为什么需要名称空间
使用名称空间共享集群
查看名称空间
查看集群中的名称空间列表:
kubectl get namespaces
Kubernetes 安装成功后,默认有初始化了三个名称空间:
- default 默认名称空间,如果 Kubernetes 对象中不定义 metadata.namespace 字段,该对象将放在此名称空间下
- kube-system Kubernetes系统创建的对象放在此名称空间下
- kube-public 此名称空间自动在安装集群是自动创建,并且所有用户都是可以读取的(即使是那些未登录的用户)。主要是为集群预留的,例如,某些情况下,某些Kubernetes对象应该被所有集群用户看到。
查看名称空间的概要信息:
kubectl describe namespaces
- Resource quota 汇总了名称空间中使用的资源总量,并指定了集群管理员定义该名称空间最多可以使用的资源量
- Limit range 定义了名称空间中某种具体的资源类型的最大、最小值
名称空间可能有两种状态(phase):
- Active 名称空间正在使用中
- Termining 名称空间正在被删除,不能再向其中创建新的对象
创建名称空间
使用 kubectl 有两种方式可以创建名称空间
通过 yaml 文件,创建文件 my-namespace.yaml 内容如下:
apiVersion: v1
kind: Namespace
metadata:
name: <名称空间的名字>
执行命令
kubectl create -f ./my-namespace.yaml
直接使用命令创建名称空间:
kubectl create namespace <名称空间的名字>
删除名称空间
执行如下命令可删除名称空间:
kubectl delete namespaces <名称空间的名字>
此删除操作是异步的,您可能会观察到名称空间停留会在 Terminating 状态停留一段时间。
使用名称空间切分集群
理解 default 名称空间
默认情况下,安装Kubernetes集群时,会初始化一个 default 名称空间,用来将承载那些未指定名称空间的 Pod、Service、Deployment等对象
创建新的名称空间
在此练习中,我们将创建两个 Kubernetes 名称空间。
假设企业使用同一个集群作为开发环境和生产环境(注意:通常开发环境和生产环境是物理隔绝的):
- 开发团队期望有一个集群中的空间,以便他们可以查看查看和使用他们创建的 Pod、Service、Deployment等。在此空间中,Kubernetes对象被创建又被删除,为了适应敏捷开发的过程,团队中的许多人都可以在此空间内做他们想做的事情。
- 运维团队也期望有一个集群中的空间,在这里,将有严格的流程控制谁可以操作 Pod、Service、Deployment等对象,因为这些对象都直接服务于生产环境。
此时,该企业可以将一个Kubernetes集群切分成两个名称空间:development 和 production。创建名称空间的 yaml 文件如下所示:
apiVersion: v1
kind: Namespace
metadata:
name: development
labels:
name: development
执行命令以创建 development 名称空间:
kubectl create -f https://kuboard.cn/statics/learning/namespace/dev.yaml
执行命令以创建 production 名称空间:
kubectl create -f https://kuboard.cn/statics/learning/namespace/prod.yaml
执行命令查看已创建的名称空间
kubectl get namespaces --show-labels
在每个名称空间中创建 Pod
Kubernetes名称空间为集群中的 Pod、Service、Deployment 提供了一个作用域。可以限定使用某个名称空间的用户不能看到另外一个名称空间中的内容。我们可以在 development 名称空间中创建一个简单的 Deployment 和 Pod 来演示这个特性。
首先,执行命令以检查当前的 kubectl 上下文
kubectl config view
执行命令
kubectl config current-context
接下来,为 kubectl 定义一个上下文,以便在不同的名称空间中工作。cluster 和 user 字段的取值从前面的 current context 复制过来:
kubectl config set-context dev --namespace=development --cluster=lithe-cocoa-92103_kubernetes --user=lithe-cocoa-92103_kubernetes
kubectl config set-context prod --namespace=production --cluster=lithe-cocoa-92103_kubernetes --user=lithe-cocoa-92103_kubernetes
切换到 development 名称空间:
kubectl config use-context dev
创建一个 nginx
kubectl run snowflake --image=nginx:1.7.9 --replicas=2
刚刚创建的 Deployment 副本数为 2,运行了一个 nginx 容器。
kubectl get deployment
执行命令
kubectl get pods -l run=snowflake
此时,开发人员可以做任何他想要做的操作,所有操作都限定在名称空间 development 里,而无需担心影响到 production 名称空间中的内容。
切换到 production 名称空间:
kubectl config use-context prod
production 名称空间应该是空的,下面两个命令将返回的结果都应该为空:
kubectl get deployment
kubectl get pods
此时,我们在 production 名称空间运行另一个 deployment:
kubectl run cattle --image=nginx:1.7.9 --replicas=5
kubectl get deployment
执行命令
kubectl get pods -l run=cattle
为什么需要名称空间
一个Kubernetes集群应该可以满足多组用户的不同需要。Kubernetes名称空间可以使不同的项目、团队或客户共享同一个 Kubernetes 集群。实现的方式是,提供:
- 名称 的作用域
- 为不同的名称空间定义不同的授权方式和资源分配策略 Resource Quota 和 resource limit range
每一个用户组都期望独立于其他用户组进行工作。通过名称空间,每个用户组拥有自己的:
- Kubernetes 对象(Pod、Service、Deployment等)
- 授权(谁可以在该名称空间中执行操作)
- 资源分配(该用户组或名称空间可以使用集群中的多少计算资源)
可能的使用情况有:
- 集群管理员通过一个Kubernetes集群支持多个用户组
- 集群管理员将集群中某个名称空间的权限分配给用户组中的受信任的成员
- 集群管理员可以限定某一个用户组可以消耗的资源数量,以避免其他用户组受到影响
- 集群用户可以使用自己的Kubernetes对象,而不会与集群中的其他用户组相互干扰