重学k8s: 06.Kubernetes资源对象之Namespace
2021-09-10
前面一节介绍了使用Kubernetes API就是查询和操纵Kubernetes API中的资源对象。本节将学习第一个资源对象Namespace。 很多公司可能都会维护一个规模很大的K8S集群,可能有几百乃至成千上万台机器,这个K8S集群同时要为公司内部的不同部门、不同的业务提供服务,为了隔离区分各部门各业务对集群的使用,需要有一个"虚拟集群"的概念,即namespace。 k8s支持多个虚拟集群,它们依赖于同一个物理集群,这些虚拟集群就是namespace。
k8s的namespace适用于跨多个部门、多个团队、多个业务的用户场景。有了namespace的概念后,k8s API管理的资源对象就可以分成两类:
- 一类是集群范围的资源对象(不在namespace内的资源),例如Node, Namespace
- 另一类是Namespace范围内的资源对象,例如Pod。这类资源对象在namespace内的名称是唯一的,且每个资源只能在一个名字空间中。
可以看出namespace为k8s资源对象提供了一个界限,同一个namespace内的资源名称唯一,不同namespace内的资源可以重名。另外当前namespace不支持嵌套结构,即一个namespace下不能包含子namespace。
查看namespace #
使用下面的命令查看k8s集群的namespace:
1kubectl get namespace
2
3NAME STATUS AGE
4default Active 1d
5kube-node-lease Active 1d
6kube-system Active 1d
7kube-public Active 1d
可以看出当前一个刚部署初始化的k8s集群创建了4个namespace:
- default: 没有指明使用其它namespace的对象所使用的默认namespace
- kube-system: k8s系统创建对象所使用的namespace
- kube-public: 这个namespace是自动创建的,所有用户(包括未经过身份验证的用户)都可以读取它
- kube-node-lease 此amespace用于与各个Node节点相关的租期Lease对象(此对象的设计使得集群规模很大时节点心跳检测性能得到提升)
前面提到了k8s的API资源分为集群范围内的资源和namespace内的资源,可以使用kubectl api-resources
命令查看:
1# 位于namespace中的资源
2kubectl api-resources --namespaced=true
3bindings v1 true Binding
4configmaps cm v1 true ConfigMap
5endpoints ep v1 true Endpoints
6events ev v1 true Event
7limitranges limits v1 true LimitRange
8persistentvolumeclaims pvc v1 true PersistentVolumeClaim
9pods po v1 true Pod
10podtemplates v1 true PodTemplate
11replicationcontrollers rc v1 true ReplicationController
12resourcequotas quota v1 true ResourceQuota
13secrets v1 true Secret
14serviceaccounts sa v1 true ServiceAccount
15services svc v1 true Service
16controllerrevisions apps/v1 true ControllerRevision
17daemonsets ds apps/v1 true DaemonSet
18deployments deploy apps/v1 true Deployment
19replicasets rs apps/v1 true ReplicaSet
20statefulsets sts apps/v1 true StatefulSet
21localsubjectaccessreviews authorization.k8s.io/v1 true LocalSubjectAccessReview
22horizontalpodautoscalers hpa autoscaling/v1 true HorizontalPodAutoscaler
23cronjobs cj batch/v1 true CronJob
24jobs batch/v1 true Job
25leases coordination.k8s.io/v1 true Lease
26networkpolicies crd.projectcalico.org/v1 true NetworkPolicy
27networksets crd.projectcalico.org/v1 true NetworkSet
28endpointslices discovery.k8s.io/v1 true EndpointSlice
29events ev events.k8s.io/v1 true Event
30ingresses ing extensions/v1beta1 true Ingress
31pods metrics.k8s.io/v1beta1 true PodMetrics
32ingresses ing networking.k8s.io/v1 true Ingress
33networkpolicies netpol networking.k8s.io/v1 true NetworkPolicy
34poddisruptionbudgets pdb policy/v1 true PodDisruptionBudget
35rolebindings rbac.authorization.k8s.io/v1 true RoleBinding
36roles rbac.authorization.k8s.io/v1 true Role
37csistoragecapacities storage.k8s.io/v1beta1 true CSIStorageCapacity
38
39# 不在namespace中的资源
40kubectl api-resources --namespaced=false
41
42NAME SHORTNAMES APIVERSION NAMESPACED KIND
43componentstatuses cs v1 false ComponentStatus
44namespaces ns v1 false Namespace
45nodes no v1 false Node
46persistentvolumes pv v1 false PersistentVolume
47mutatingwebhookconfigurations admissionregistration.k8s.io/v1 false MutatingWebhookConfiguration
48validatingwebhookconfigurations admissionregistration.k8s.io/v1 false ValidatingWebhookConfiguration
49customresourcedefinitions crd,crds apiextensions.k8s.io/v1 false CustomResourceDefinition
50apiservices apiregistration.k8s.io/v1 false APIService
51tokenreviews authentication.k8s.io/v1 false TokenReview
52selfsubjectaccessreviews authorization.k8s.io/v1 false SelfSubjectAccessReview
53selfsubjectrulesreviews authorization.k8s.io/v1 false SelfSubjectRulesReview
54subjectaccessreviews authorization.k8s.io/v1 false SubjectAccessReview
55certificatesigningrequests csr certificates.k8s.io/v1 false CertificateSigningRequest
56flowschemas flowcontrol.apiserver.k8s.io/v1beta1 false FlowSchema
57prioritylevelconfigurations flowcontrol.apiserver.k8s.io/v1beta1 false PriorityLevelConfiguration
58nodes metrics.k8s.io/v1beta1 false NodeMetrics
59ingressclasses networking.k8s.io/v1 false IngressClass
60runtimeclasses node.k8s.io/v1 false RuntimeClass
61podsecuritypolicies psp policy/v1beta1 false PodSecurityPolicy
62clusterrolebindings rbac.authorization.k8s.io/v1 false ClusterRoleBinding
63clusterroles rbac.authorization.k8s.io/v1 false ClusterRole
64priorityclasses pc scheduling.k8s.io/v1 false PriorityClass
65csidrivers storage.k8s.io/v1 false CSIDriver
66csinodes storage.k8s.io/v1 false CSINode
67storageclasses sc storage.k8s.io/v1 false StorageClass
68volumeattachments storage.k8s.io/v1 false VolumeAttachment
上面大致给出了集群范围内的资源和namespace内的资源的概览,实际上学习如何使用Kubernetes集群,就是学习这个API资源的使用。
创建和删除namespace #
namespace的创建和删除十分简单:
1# 创建namespace foo
2kubectl create ns foo
3
4# 查看namespace foo
5kubectl describe ns foo
6
7# 删除namespace foo
8kubectl delete ns foo
为namespace设置资源配额(ResourceQuota)和限制范围(LimitRange) #
通过上面的学习,我们已经可以使用namespace隔离不同的业务、不同团队、不同用户对k8s集群的使用,肯定还需进一步限制不同namespace对k8s集群资源的使用。 因此,在创建namespace后,还需要为namespace设置资源配置和限制范围。这就涉及到使用另外两个k8s API资源ResourceQuota和LimitRange。
ResourceQuota用于设置每个namespace的资源消耗总量提供限制。 它可以限制namespace中某种类型的对象的总数目上限,也可以限制命令空间中的 Pod 可以使用的计算资源的总上限。 K8S的集群管理员可以为每个namespace创建一个或多个ResourceQuota对象。当前k8s对namespace支持如下的资源配额:
- 计算资源配额: 对namespace下可被请求的计算资源(cpu, memory等)总量进行限制
- 扩展资源的资源配额: 扩展资源是k8s内置资源之外的资源,例如GPU扩展资源如果资源名称为
nvidia.com/gpu
,则也可以使用ResourceQuota进行限制 - 存储资源配额: 对给定namespace下的存储资源总量进行限制。此外,还可以根据相关的存储类(Storage Class)来限制存储资源的消耗。
- 对象数量配额: 对给定namespace下的某个资源类型的对象数量进行限制。例如一个namespace可以创建的Pod数量。
使用ResourceQuota可以限制某个namespace的资源消耗总量,还不能限制某个容器可以使用的最小和最大资源使用量,某个namespace下的Pod或Container可能会垄断所有可用的资源。 此时就需要使用LimitRange资源了,LimitRange是在namespace内限制资源分配给单个Pod或容器的策略对象。
使用LimitRange可以实现:
- 在一个namespace中实施对每个Pod或Container最小和最大的资源使用量的限制。
- 在一个namespace中实施对每个PersistentVolumeClaim能申请的最小和最大的存储空间大小的限制。
- 在一个namespace中实施对一种资源的申请值和限制值的比值的控制。
- 设置一个namespace中对计算资源的默认申请/限制值,并且自动的在运行时注入到多个Container中。
总结 #
本文介绍了Kubernetes中对资源进行隔离的方案namespace,并介绍了如何给namespace设置资源限制相关内容 关于ResourceQuota和LimitRange具体配置示例可以查看官方文档:
- https://kubernetes.io/zh/docs/concepts/policy/resource-quotas/
- https://kubernetes.io/zh/docs/concepts/policy/limit-range/