Namespace 是 Kubernetes 中用于实现资源隔离与逻辑分组的核心机制,它将物理集群划分为多个虚拟集群,便于多团队、多项目或多环境共享同一集群资源。
一、namespace概念
在Kubernetes中,Namespace可以看作是一个虚拟的集群,它将物理集群划分为多个逻辑部分。每个Namespace都有自己的资源集合,这些资源是相互隔离的,互不干扰。Kubernetes提供了默认的几个Namespace,如kube-system和default等。用户可以根据需要创建新的Namespace。
二、namespace用途
1.资源隔离
通过使用Namespace,可以将不同的用户、租户、环境或项目创建的资源隔离在不同的Namespace中。这样,每个用户只能访问自己的Namespace中的资源,而无法访问其他Namespace的资源。例如还可以将开发(dev)、测试(test)、生产(prod)环境可分别部署到独立 Namespace。
2.分类管理
使用Namespace可以将集群中的对象(如Pod、Service、deployment、ConfigMap等)按照业务或项目进行分类和管理。例如,可以将Web应用部署在名为“web”的Namespace中,将数据库应用部署在名为“database”的Namespace中。
3.资源配额
通过为每个Namespace设置资源配额,可以限制该Namespace中资源的消耗量。例如,可以为每个项目分配一定的CPU和内存资源配额,确保资源的合理使用。
4.团队或项目隔离
将Namespace映射到团队或项目上,可以更好地组织和管理集群中的资源。每个团队或项目可以使用自己的Namespace进行开发和部署,互不干扰。
三、namespace优势
1.提高资源利用率
通过将不同的应用或项目部署在不同的Namespace中,可以避免资源的浪费和冲突,提高资源的利用率。
2.简化管理
使用Namespace可以将集群中的资源进行分类和管理,使得管理更加简单和方便。
3.提高安全性
通过隔离不同用户或团队的资源,可以增强系统的安全性,避免未经授权的访问和操作。
4.可扩展性
随着业务的发展和扩大,使用Namespace可以方便地扩展集群规模,提高系统的可扩展性。
四、默认namespace及用途
Kubernetes 初始化时自动创建以下系统 Namespace:
[root@master-1 ~]# kubectl get ns
NAME STATUS AGE
default Active 79d
kube-node-lease Active 79d
kube-public Active 79d
kube-system Active 79d
-
default:用户未指定时资源的默认归属位置。
-
kube-node-lease:维护节点心跳状态(v1.13+引入)。该名字空间包含用于与各个节点关联的 Lease(租约)对象。 节点租约允许 kubelet 发送心跳, 由此控制面能够检测到节点故障。
-
kube-public:存储公共资源(如集群信息),所有用户(包括未认证用户)可读。
-
kube-system:存放 Kubernetes 系统组件(如 CoreDNS、kube-proxy)。
五、常用命令操作
1.查看命名空间
#以下三种命令等效 --show-labels显示标签信息
[root@master-1 ~]# kubectl get ns
[root@master-1 ~]# kubectl get namespace
[root@master-1 ~]# kubectl get namespaces --show-labels#查看命名空间详细信息
[root@master-1 ~]# kubectl describe ns kube-system
Name: kube-system
Labels: kubernetes.io/metadata.name=kube-system
Annotations: <none>
Status: ActiveNo resource quota.No LimitRange resource.
可以看到有k8s自带的命名空间,也有自建的命名空间
2.创建命名空间
#方式一:响应式创建
[root@master-1 ~]# kubectl create namespace liux
namespace/liux created
[root@master-1 ~]# kubectl describe ns liux
Name: liux
Labels: kubernetes.io/metadata.name=liux
Annotations: <none>
Status: ActiveNo resource quota.No LimitRange resource.#方式二:声明式创建
[root@master-1 ~]# cat ns.yaml
apiVersion: v1
kind: Namespace
metadata:labels:kubernetes.io/metadata.name: liuxname: liux
[root@master-1 ~]# kubectl apply -f ns.yaml
3.切换默认命名空间
#切换之后默认命名空间就是liux了
[root@master-1 ~]# kubectl config set-context --current --namespace=liux
Context "kubernetes" modified.
[root@master-1 ~]# kubectl get pods
No resources found in liux namespace.
4.删除命名空间
一旦删除了某个名称空间,则该名称空间下的所有资源都会被删除。
[root@master-1 ~]# kubectl delete ns liux
六、资源配额管理以及案例
限制 Namespace 的资源总量,防止资源滥用。
1.创建命名空间
[root@master-1 ~]# kubectl create ns dev
2.为命名空间设置资源限制
-
在该命名空间中的每个 Pod 的所有容器都必须要有内存请求和限制,以及 CPU 请求和限制。
-
在该命名空间中所有 Pod 的内存请求总和不能超过 1 GiB。
-
在该命名空间中所有 Pod 的内存限制总和不能超过 2 GiB。
-
在该命名空间中所有 Pod 的 CPU 请求总和不能超过 1 cpu。
-
在该命名空间中所有 Pod 的 CPU 限制总和不能超过 2 cpu。
-
在该命名空间中所有 Pod不超过10个pod。
[root@master-1 ~]# cat quota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:name: mem-cpu-quotanamespace: dev # 作用于 dev 命名空间
spec:hard:pods: "10" # 最多 10 个 Podrequests.cpu: "1" # CPU 请求总量 ≤ 1 核requests.memory: 1Gi # 内存请求总量 ≤ 1GiBlimits.cpu: "2" # CPU 限额总量 ≤ 2 核limits.memory: 2Gi # 内存限额总量 ≤ 2GiB[root@master-1 ~]# kubectl apply -f quota.yaml
resourcequota/mem-cpu-quota created
[root@master-1 ~]# kubectl get ResourceQuota -n dev
NAME AGE REQUEST LIMIT
mem-cpu-quota 17s pods: 0/10, requests.cpu: 0/1, requests.memory: 0/1Gi limits.cpu: 0/2, limits.memory: 0/2Gi
[root@master-1 ~]# kubectl get ResourceQuota -n dev -o yaml
3.创建第一个pod并指定资源限制
[root@master-1 ~]# cat quota-nginx.yaml
apiVersion: v1
kind: Pod
metadata:name: quota-nginxnamespace: dev #指定命名空间
spec:containers:- name: nginximage: nginx:latestimagePullPolicy: IfNotPresentresources:limits:memory: "800Mi"cpu: "800m"requests: memory: "600Mi"cpu: "400m"[root@master-1 ~]# kubectl apply -f quota-nginx.yaml
pod/quota-nginx created
4.查看dev命名空间资源使用情况
[root@master-1 ~]# kubectl get ResourceQuota -n dev
NAME AGE REQUEST LIMIT
mem-cpu-quota 88m pods: 1/10, requests.cpu: 400m/1, requests.memory: 600Mi/1Gi limits.cpu: 800m/2, limits.memory: 800Mi/2Gi
[root@master-1 ~]# kubectl get ResourceQuota -n dev -o yaml
查看到该空间下的资源已经使用了一部分了
5.创建第二个pod
发现pod创建失败,requested: requests.memory=600Mi, used: requests.memory=600Mi, limited: requests.memory=1Gi,requests请求的内存 600+600>1G了,超出限制了。
[root@master-1 ~]# cat quota-nginx.yaml
apiVersion: v1
kind: Pod
metadata:name: quota-nginx-2namespace: dev #指定命名空间
spec:containers:- name: nginximage: nginx:latestimagePullPolicy: IfNotPresentresources:limits:memory: "800Mi"cpu: "800m"requests:memory: "600Mi"cpu: "400m"[root@master-1 ~]# kubectl apply -f quota-nginx.yaml
Error from server (Forbidden): error when creating "quota-nginx.yaml": pods "quota-nginx-2"is forbidden: exceeded quota: mem-cpu-quota, requested: requests.memory=600Mi, used: requests.memory=600Mi, limited: requests.memory=1Gi
现在我们将第二个pod的requests的memory改在限制范围内,发现可以创建成功的。
[root@master-1 ~]# cat quota-nginx.yaml
apiVersion: v1
kind: Pod
metadata:name: quota-nginx-2namespace: dev #指定命名空间
spec:containers:- name: nginximage: nginx:latestimagePullPolicy: IfNotPresentresources:limits:memory: "800Mi"cpu: "800m"requests:memory: "300Mi"cpu: "400m"[root@master-1 ~]# kubectl apply -f quota-nginx.yaml
pod/quota-nginx-2 created
[root@master-1 ~]# kubectl get ResourceQuota -n dev
NAME AGE REQUEST LIMIT
mem-cpu-quota 116m pods: 2/10, requests.cpu: 800m/1, requests.memory: 900Mi/1Gi limits.cpu: 1600m/2, limits.memory: 1600Mi/2Gi
6.创建第三个pod不加资源限制
发现不加资源限制创建pod也会失败,该命名空间强制了创建pod必须添加资源限制,否则会创建失败。
七、总结
综上所述,Kubernetes中的Namespace是一种强大的资源管理和隔离机制。通过合理使用Namespace,可以更好地组织和管理集群中的资源,提高系统的安全性、可靠性和可扩展性。在实际应用中,根据业务需求和团队组织结构,合理选择和使用Namespace,可以实现更高效、灵活和安全的容器编排和管理。