赞
踩
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可以将定义的功能授予单个命名空间上下文中的具体具体用户或用户组。通过这种方式,命名空间可以使得集群操作者能够将相同的策略映射到组织好的资源集合。
Kubernetes 启动时会创建四个初始名字空间:
default
Kubernetes 包含这个名字空间,以便于你无需创建新的名字空间即可开始使用新集群。
kube-node-lease
该名字空间包含用于与各个节点关联的 Lease(租约)对象。 节点租约允许 kubelet 发送心跳, 由此控制面能够检测到节点故障。
kube-public
所有的客户端(包括未经身份验证的客户端)都可以读取该名字空间。 该名字空间主要预留为集群使用,以便某些资源需要在整个集群中可见可读。 该名字空间的公共属性只是一种约定而非要求。
kube-system
该名字空间用于 Kubernetes 系统创建的对象。
[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启动自带的初始命名空间
[root@k8s-master ~]# kubectl describe namespace kube-system
Name: kube-system
Labels: <none>
Annotations: <none>
Status: Active
No resource quota.
No LimitRange resource.
该命令可以看到对命名空间的资源配额对象
[root@k8s-master ~]# kubectl create namespace quota-mem-cpu-example
查看命名空间
[root@k8s-master ~]# kubectl get namespace
[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命名空间里
[root@k8s-master ~]# kubectl delete namespace mem-example
参考官网文档:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/
[root@k8s-master ~]# kubectl create namespace quota-mem-cpu-example
查看命名空间
[root@k8s-master ~]# kubectl get namespace
[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
[root@k8s-master ~]# kubectl apply -f quota-mem-cpu.yaml --namespace=quota-mem-cpu-example
[root@k8s-master ~]# kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml
ResourceQuota 在 quota-mem-cpu-example 命名空间中设置了如下要求:
编辑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
[root@k8s-master ~]# kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml
发现创建pod后,发现已经used对应的cpu和memory了
编辑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 会导致内存请求总量超过内存请求配额。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。