k8s学习笔记(四):命名空间(namespace)详解
文章目录
命名空间
Kubernetes中的Namespace是一种用于在集群内部组织和隔离资源的机制。一个Namespace可以看作是一个虚拟的集群,它将物理集群划分为多个逻辑部分,每个部分都有自己的一组资源(如Pod、Service、ConfigMap等)。
Namespace 适合用于隔离不同用户创建的资源
用于给集群中的任何对象组进行分类、筛选和管理。每一个添加到Kubernetes集群的工作负载必须放在一个命名空间中。
不同的业务(web、数据库、消息中间)可以部署在不同的命名空间,实现业务的隔离,并且可以对其进行资源配额,限制cpu、内存等资源的使用
命名空间的重要性
命名空间为集群中的对象名称赋予作用域。虽然在命名空间中名称必须是唯一的,但是相同的名称可以在不同的命名空间中使用。这对于某些场景来说可能帮助很大。例如,如果使用命名空间来划分应用程序生命周期环境(如开发、staging、生产),则可以在每个环境中维护利用同样的名称维护相同对象的副本。
命名空间还可以让用户轻松地将策略应用到集群的具体部分。你可以通过定义ResourceQuota对象来控制资源的使用,该对象在每个命名空间的基础上设置了使用资源的限制。类似地,当在集群上使用支持网络策略的CNI(容器网络接口)时,比如Calico或Canal(calico用于策略,flannel用于网络)。你可以将NetworkPolicy应用到命名空间,其中的规则定义了pod之间如何彼此通信。不同的命名空间可以有不同的策略。
使用命名空间最大的好处之一是能够利用Kubernetes RBAC(基于角色的访问控制)。RBAC允许您在单个名称下开发角色,这样将权限或功能列表分组。ClusterRole对象用于定义集群规模的使用模式,而角色对象类型(Role object type)应用于具体的命名空间,从而提供更好的控制和粒度。在角色创建后,RoleBinding可以将定义的功能授予单个命名空间上下文中的具体具体用户或用户组。通过这种方式,命名空间可以使得集群操作者能够将相同的策略映射到组织好的资源集合。
命名空间的使用场景
- 将命名空间映射到团队或项目上
通过给团队提供专门的命名空间,你可以用RBAC策略委托某些功能来实现自我管理和自动化,给团队和项目设置资源配额也非常有用。有了这种方式,你可以根据组织的业务需求和优先级合理地访问资源 - 使用命名空间对生命周期环境进行分区
命名空间非常适合在集群中划分开发、staging以及生产环境。通常情况下我们会被建议将生产工作负载部署到一个完全独立的集群中,来确保最大程度的隔离。 - 使用命名空间隔离不同的使用者
根据使用者对工作负载进行分段。比如,如果你的集群为多个客户提供基础设施,那么按命名空间进行分段就能够实现管理每个客户,同时跟踪账单的去向。
初始命名空间
Kubernetes 启动时会创建四个初始名字空间:
-
default
Kubernetes 包含这个名字空间,以便于你无需创建新的名字空间即可开始使用新集群。
-
kube-node-lease
该名字空间包含用于与各个节点关联的 Lease(租约)对象。 节点租约允许 kubelet 发送心跳, 由此控制面能够检测到节点故障。
-
kube-public
所有的客户端(包括未经身份验证的客户端)都可以读取该名字空间。 该名字空间主要预留为集群使用,以便某些资源需要在整个集群中可见可读。 该名字空间的公共属性只是一种约定而非要求。
-
kube-system
该名字空间用于 Kubernetes 系统创建的对象。
常用命令操作
1.查看所有命名空间
[root@k8s-master ~]# kubectl get namespace
NAME STATUS AGE
default Active 7d6h
kube-node-lease Active 7d6h
kube-public Active 7d6h
kube-system Active 7d6h
quota-mem-cpu-example Active 47h
可以看到四个k8s启动自带的初始命名空间
2.查看命名空间的详细信息
[root@k8s-master ~]# kubectl describe namespace kube-system
Name: kube-system
Labels: <none>
Annotations: <none>
Status: Active
No resource quota.
No LimitRange resource.
该命令可以看到对命名空间的资源配额对象
3.创建命名空间
[root@k8s-master ~]# kubectl create namespace quota-mem-cpu-example
查看命名空间
[root@k8s-master ~]# kubectl get namespace
4.查看某个命名空间下的pod
[root@k8s-master ~]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-6949477b58-m954m 1/1 Running 15 7d3h
calico-node-c55c9 1/1 Running 11 7d3h
calico-node-cxnbg 1/1 Running 9 7d3h
calico-node-pm4jp 1/1 Running 10 7d3h
coredns-7f89b7bc75-hl2tf 1/1 Running 9 7d6h
coredns-7f89b7bc75-wkf68 1/1 Running 10 7d6h
etcd-k8s-master 1/1 Running 11 7d6h
kube-apiserver-k8s-master 1/1 Running 14 7d6h
kube-controller-manager-k8s-master 1/1 Running 14 7d6h
kube-proxy-55krt 1/1 Running 11 7d6h
kube-proxy-5zjxj 1/1 Running 9 7d3h
kube-proxy-dnvgg 1/1 Running 10 7d3h
kube-scheduler-k8s-master 1/1 Running 11 7d6h
metrics-server-769f6c8464-wqwdd 1/1 Running 2 26h
注意:如果不指定-n 命名空间,会默认查看default命名空间里的pod,创建pod的时候不指定命名空间,只会将pod创建在default命名空间里
5.删除命名空间
[root@k8s-master ~]# kubectl delete namespace mem-example
官网案例:创建命名空间,配置内存和CPU配额,并创建pod使用该命名空间
参考官网文档:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/
1.创建命名空间
[root@k8s-master ~]# kubectl create namespace quota-mem-cpu-example
查看命名空间
[root@k8s-master ~]# kubectl get namespace
2.创建资源配额对象,对这个资源对象进行赋值
[root@k8s-master ~]# vim quota-mem-cpu.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-demo
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
- apiversion,声明apiserver的版本为v1
- kind,对象,创建资源配额对象
- metadata,版本数据,指定名称
- hard,硬件限制
- requests.cpu: “1”,申请一个cpu
- limits.cpu: “2”,最大可以使用2个cpu
3.将命名空间和资源配额对象进行绑定
[root@k8s-master ~]# kubectl apply -f quota-mem-cpu.yaml --namespace=quota-mem-cpu-example
4.查看命名空间对应的资源配额对象信息,以yaml文件的形式输出
[root@k8s-master ~]# kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml
ResourceQuota 在 quota-mem-cpu-example 命名空间中设置了如下要求:
- 在该命名空间中的每个 Pod 的所有容器都必须要有内存请求和限制,以及 CPU 请求和限制。
- 在该命名空间中所有 Pod 的内存请求总和不能超过 1 GiB。
- 在该命名空间中所有 Pod 的内存限制总和不能超过 2 GiB。
- 在该命名空间中所有 Pod 的 CPU 请求总和不能超过 1 cpu。
- 在该命名空间中所有 Pod 的 CPU 限制总和不能超过 2 cpu。
5.创建pod
编辑yaml文件
[root@k8s-master ~]# vim quota-mem-cpu-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: quota-mem-cpu-demo
spec:
containers:
- name: quota-mem-cpu-demo-ctr
image: nginx
resources:
limits:
memory: "800Mi"
cpu: "800m"
requests:
memory: "600Mi"
cpu: "400m"
创建pod
[root@k8s-master ~]# kubectl apply -f quota-mem-cpu-pod.yaml --namespace=quota-mem-cpu-example
查看创建在指定命名空间的pod
[root@k8s-master ~]# kubectl get pod --namespace=quota-mem-cpu-example
NAME READY STATUS RESTARTS AGE
quota-mem-cpu-demo 1/1 Running 0 70s
6.创建pod后,再次查看资源配额对象
[root@k8s-master ~]# kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml
发现创建pod后,发现已经used对应的cpu和memory了
7.尝试创建第二个pod
编辑yaml文件
[root@k8s-master ~]# vim quota-mem-cpu-pod-2.yaml
apiVersion: v1
kind: Pod
metadata:
name: quota-mem-cpu-demo-2
spec:
containers:
- name: quota-mem-cpu-demo-2-ctr
image: redis
resources:
limits:
memory: "1Gi"
cpu: "800m"
requests:
memory: "700Mi"
cpu: "400m"
创建pod
[root@k8s-master ~]# kubectl apply -f quota-mem-cpu-pod-2.yaml --namespace=quota-mem-cpu-example
Error from server (Forbidden): error when creating "quota-mem-cpu-pod-2.yaml": pods "quota-mem-cpu-demo-2" is forbidden: exceeded quota: mem-cpu-demo, requested: requests.memory=700Mi, used: requests.memory=600Mi, limited: requests.memory=1Gi
在清单中,你可以看到 Pod 的内存请求为 700 MiB。 请注意新的内存请求与已经使用的内存请求之和超过了内存请求的配额: 600 MiB + 700 MiB > 1 GiB
第二个 Pod 不能被创建成功。输出结果显示创建第二个 Pod 会导致内存请求总量超过内存请求配额。
更多推荐
所有评论(0)