名称空间
文章目录
一、名字空间
- 在Kubernetes中,名称空间(Namepsace)提供一种机制,将同一集群中的资源划分为相互隔离的组。同一名称空间内的资源名称要唯一,但跨名称空间时没有这个要求。名称空间作用域仅针对带有名称空间的对象(例如Deployment、Service等),这种作用域对集群范围的对象(例如StorageClass、Node、PersistentVolume等)不适用。
二、何时使用多个名称空间
- 名称空间适用于存在很多跨多个团队或项目的用户的场景。对于只有几到几十个用户的集群,根据不需要创建或考虑名称空间。当需要名称空间提供的功能时,请开始使用它们。
- 名称空间为名称提供了一个范围。资源的名称需要在名称空间内时唯一的,但不能跨名称空间。名称空间不能相互嵌套,每个Kubernetes资源只能在一个名称空间中。
bash
# 说明
对于生产集群,请考虑不要使用default名称空间,而是创建其他名称空间来使用
三、初始名称空间
- Kubernetes启动时会创建四个初始名称空间
bash
# 第一种查看名称空间的方式
[root@master ~]# kubectl get namespace
NAME STATUS AGE
default Active 22d
kube-flannel Active 22d
kube-node-lease Active 22d
kube-public Active 22d
kube-system Active 22d
bash
# 第二种查看名称空间的方式
[root@master ~]# kubectl get ns
NAME STATUS AGE
default Active 22d
kube-flannel Active 22d
kube-node-lease Active 22d
kube-public Active 22d
kube-system Active 22d
3.1、default
- Kubernetes包含这个名称空间,以便于你无需创建新的名称空间按即可开始使用新集群。
3.2、kube-node-lease
- 该名称空间包含用于与各个节点关联的Lease(租约)对象。节点租约允许kubelet发送心跳,由此控制面能够检测到节点故障。
3.3、kube-public
- 所有的客户端(包括未经身份验证的客户端)都可以读取该名称空间。该名称空间主要预留为集群使用,以便某些资源需要在整个集群中可见可读。该名称空间的公有属性只是一种约定而非要求。
3.4、kube-system
- 该名称空间用于/kubernetes系统创建的对象。
bash
# 说明:避免使用前缀kube-创建名称空间,因为它是为kubernetes系统名称空间保留的。
四、通过名称空间共享集群
4.1、查看名称空间
- 列出集群中现有的名称空间
bash
# 查看名称空间第一种办法-1
[root@master ~]# kubectl get namespace
NAME STATUS AGE
default Active 23d
kube-flannel Active 23d
kube-node-lease Active 23d
kube-public Active 23d
kube-system Active 23d
ash
# 查看名称名称空间第二种办法-2
[root@master ~]# kubectl get ns
NAME STATUS AGE
default Active 23d
kube-flannel Active 23d
kube-node-lease Active 23d
kube-public Active 23d
kube-system Active 23d
4.2、获取名称空间详细信息
bash
# 获取所有名称空间详细信息
[root@master ~]# kubectl describe ns
bash
# 获取指定名称空间详细信息
[root@master ~]# kubectl describe ns default
Name: default
Labels: kubernetes.io/metadata.name=default
Annotations: <none>
Status: Active
No resource quota.
No LimitRange resource.
4.3、名称空间的两种状态
- 名称空间可以处于下列两个阶段的其中一个:
bash
Active:名称空间正在被使用中
Terminating:名称空间正在被删除,且不能被用于新对对象使用
4.4、创建名称空间
bash
说明:避免使用前缀kube-创建名称空间,因为它是为Kubernetes系统名称空间保留的。
- 新家一个名为
my-namespace.yaml
的YAML文件,并写入下列内容
bash
# 创建一个名为nginx-name的名称空间
[root@master ~]# cat my-namespace.yaml
apiVersion: "v1"
kind: Namespace # 这个资源清单类型,
metadata:
name: nginx-name # 名称空间的名字
- 然后运行加载上面的资源清单
bash
[root@master ~]# kubectl apply -f my-namespace.yaml
namespace/nginx-name created
- 或者你可以使用下面的命令直接以命令行的方式创建一个名称空间,这种方式通常是没有人用的(特点快捷)
bash
# 以下创建了一个名为nginx-01的名称空间
[root@master ~]# kubectl create namespace nginx-01
namespace/nginx-01 created
4.5、删除名称空间
- 方式1:命令行直接删除
bash
[root@master ~]# kubectl delete namespace nginx-01
namespace "nginx-01" deleted
- 方式2:如果名称空间是通过资源清单创建的,可以使用如下命令进行删除
bash
[root@master ~]# kubectl delete -f my-namespace.yaml
namespace "nginx-name" deleted
五、使用Kubernetes名称空间细分你的集群
5.1、default名称空间简介
-
默认情况下,Kubernetes集群会在配置集群时实例化一个default名称空间,用以存放集群所有使用的默认Pod、Service和Deployment集合(默认代表创建的资源没有指定名称空间,那么就会在默认的名称空间下创建也就是default名称空间)
-
假设你有一个新的集群,你可以通过执行以下操作看到所有名称空间
bash
[root@master ~]# kubectl get namespace
NAME STATUS AGE
default Active 23d
kube-flannel Active 23d
kube-node-lease Active 23d
kube-public Active 23d
kube-system Active 23d
5.2、创建新的名称空间
- 在本次练习中,我们将创建两个额外的Kubernetes名称空间来保存我们的内容。
- 在某组织使用共享的Kubernetes集群进行开发和生产的环境中:
bash
# 开发团队系统在集群中维护一个名称空间,以便他们可以查看用于构建和运行其应用程序的Pod、Service和Deployment列表。在这个空间里,Kubernetes资源被自由地加入或移除,对谁能够或不能修改资源的限制被放宽了,以实现敏捷开发。
# 运维团队系统在集群中维护一个空间,以便他们可以强制实施一些严格的规程,对谁可以或不可以操作运行生产站点的Pod、Service和Deployment集合进行控制
- 该组织可以遵循的一种模式是将Kubernetes集群划分为两个名称空间:
development
和production
。让我们创建两个新的名称空间来保存我们的工作。
bash
# 创建development名称空间
[root@master ~]# cat ns-development.yaml
apiVersion: "v1"
kind: Namespace
metadata:
name: development
# 加载资源清单
[root@master ~]# kubectl apply -f ns-development.yaml
namespace/development created
bash
# 创建production名称空间
[root@master ~]# cat ns-production.yaml
apiVersion: "v1"
kind: Namespace
metadata:
name: production
# 加载资源清单
[root@master ~]# kubectl apply -f ns-production.yaml
namespace/production created
- 为了保证一些正常,列出集群中所有的名称空间(--show-labels显示名称空间的标签)
bash
[root@master ~]# kubectl get namespace --show-labels
NAME STATUS AGE LABELS
default Active 23d kubernetes.io/metadata.name=default
development Active 2m4s kubernetes.io/metadata.name=development
kube-flannel Active 23d k8s-app=flannel,kubernetes.io/metadata.name=kube-flannel,pod-security.kubernetes.io/enforce=privileged
kube-node-lease Active 23d kubernetes.io/metadata.name=kube-node-lease
kube-public Active 23d kubernetes.io/metadata.name=kube-public
kube-system Active 23d kubernetes.io/metadata.name=kube-system
production Active 43s kubernetes.io/metadata.name=production
5.3、在每个名称空间中创建Pod
- Kubernetes名称空间为集群中的Pod、Service和Deployment提供了作用域。与一个名称空间交互的用户不会看到另一个空间内的内容。为了演示这一点,让我们在
development
名称空间中启动一个简单的Deployment和Pod。(重点是理解名称空间的作用)
bash
# 以下创建了一个名为snowflak的Deployment其中使用的镜像是nginx,在development名称空间中创建,这个Deployment会有两个Pod副本去运行
[root@master ~]# kubectl create deployment snowflak --image=nginx -n development --replicas=2
- 我们创建了一个副本个数为2的Deployment,运行名为
snowflake
的Pod,其中包含了一个负载提供主机名的基本容器。
bash
[root@master ~]# kubectl get deployment -n development
NAME READY UP-TO-DATE AVAILABLE AGE
snowflak 2/2 2 2 4m40s
- 在
development
名称空间中,查看标签带有app=snowflak
的Pod
bash
[root@master ~]# kubectl get pod -n development -l app=snowflak
NAME READY STATUS RESTARTS AGE
snowflak-55b5794bf7-gxwv2 1/1 Running 0 6m48s
snowflak-55b5794bf7-xdx9n 1/1 Running 0 6m48s
-
看起来还不错,开发人员能够做他们想做的事情,而且他们不必担心影响到
production
名称空间下面的内容 -
让我们切换到
production
名称空间,展示一下一个名称空间中的资源是如果对另外一个名称空间隐藏的。名称空间production
应该是空的,下面的命令应该会返回大概意思是:在此名称空间中没有查看到任何资源。
bash
[root@master ~]# kubectl get deployment -n production
No resources found in production namespace.
[root@master ~]# kubectl get pod -n production
No resources found in production namespace.
- 生产环境下一般以养牛的方式运行负载,所以让我们创建一些Cattle Pod
bash
# 使用如下命令创建的Deployment自会默认创建一个Pod
[root@master ~]# kubectl create deployment cattle --image=nginx -n production
[root@master ~]# kubectl get pod -n production
NAME READY STATUS RESTARTS AGE
cattle-858896d655-bcwfp 1/1 Running 0 21s
# 使用如下命令将会把cattle这个Deployment的副本增加到5个
[root@master ~]# kubectl scale deployment cattle --replicas=5 -n production
bash
[root@master ~]# kubectl get deployment -n production
NAME READY UP-TO-DATE AVAILABLE AGE
cattle 5/5 5 5 3m11s
bash
[root@master ~]# kubectl get pod -l app=cattle -n production
NAME READY STATUS RESTARTS AGE
cattle-858896d655-6lxgx 1/1 Running 0 106s
cattle-858896d655-b65t5 1/1 Running 0 106s
cattle-858896d655-bcwfp 1/1 Running 0 3m48s
cattle-858896d655-grtzp 1/1 Running 0 106s
cattle-858896d655-wxgsd 1/1 Running 0 106s
- 此时,应该很清除地展示了用户在一个名称空间中创建的资源对另一个名称空间是隐藏的