前面一节介绍了使用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:
kubectl get namespace
NAME STATUS AGE
default Active 1d
kube-node-lease Active 1d
kube-system Active 1d
kube-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命令查看:
# 位于namespace中的资源
kubectl api-resources --namespaced=true
bindings v1 true Binding
configmaps cm v1 true ConfigMap
endpoints ep v1 true Endpoints
events ev v1 true Event
limitranges limits v1 true LimitRange
persistentvolumeclaims pvc v1 true PersistentVolumeClaim
pods po v1 true Pod
podtemplates v1 true PodTemplate
replicationcontrollers rc v1 true ReplicationController
resourcequotas quota v1 true ResourceQuota
secrets v1 true Secret
serviceaccounts sa v1 true ServiceAccount
services svc v1 true Service
controllerrevisions apps/v1 true ControllerRevision
daemonsets ds apps/v1 true DaemonSet
deployments deploy apps/v1 true Deployment
replicasets rs apps/v1 true ReplicaSet
statefulsets sts apps/v1 true StatefulSet
localsubjectaccessreviews authorization.k8s.io/v1 true LocalSubjectAccessReview
horizontalpodautoscalers hpa autoscaling/v1 true HorizontalPodAutoscaler
cronjobs cj batch/v1 true CronJob
jobs batch/v1 true Job
leases coordination.k8s.io/v1 true Lease
networkpolicies crd.projectcalico.org/v1 true NetworkPolicy
networksets crd.projectcalico.org/v1 true NetworkSet
endpointslices discovery.k8s.io/v1 true EndpointSlice
events ev events.k8s.io/v1 true Event
ingresses ing extensions/v1beta1 true Ingress
pods metrics.k8s.io/v1beta1 true PodMetrics
ingresses ing networking.k8s.io/v1 true Ingress
networkpolicies netpol networking.k8s.io/v1 true NetworkPolicy
poddisruptionbudgets pdb policy/v1 true PodDisruptionBudget
rolebindings rbac.authorization.k8s.io/v1 true RoleBinding
roles rbac.authorization.k8s.io/v1 true Role
csistoragecapacities storage.k8s.io/v1beta1 true CSIStorageCapacity
# 不在namespace中的资源
kubectl api-resources --namespaced=false
NAME SHORTNAMES APIVERSION NAMESPACED KIND
componentstatuses cs v1 false ComponentStatus
namespaces ns v1 false Namespace
nodes no v1 false Node
persistentvolumes pv v1 false PersistentVolume
mutatingwebhookconfigurations admissionregistration.k8s.io/v1 false MutatingWebhookConfiguration
validatingwebhookconfigurations admissionregistration.k8s.io/v1 false ValidatingWebhookConfiguration
customresourcedefinitions crd,crds apiextensions.k8s.io/v1 false CustomResourceDefinition
apiservices apiregistration.k8s.io/v1 false APIService
tokenreviews authentication.k8s.io/v1 false TokenReview
selfsubjectaccessreviews authorization.k8s.io/v1 false SelfSubjectAccessReview
selfsubjectrulesreviews authorization.k8s.io/v1 false SelfSubjectRulesReview
subjectaccessreviews authorization.k8s.io/v1 false SubjectAccessReview
certificatesigningrequests csr certificates.k8s.io/v1 false CertificateSigningRequest
flowschemas flowcontrol.apiserver.k8s.io/v1beta1 false FlowSchema
prioritylevelconfigurations flowcontrol.apiserver.k8s.io/v1beta1 false PriorityLevelConfiguration
nodes metrics.k8s.io/v1beta1 false NodeMetrics
ingressclasses networking.k8s.io/v1 false IngressClass
runtimeclasses node.k8s.io/v1 false RuntimeClass
podsecuritypolicies psp policy/v1beta1 false PodSecurityPolicy
clusterrolebindings rbac.authorization.k8s.io/v1 false ClusterRoleBinding
clusterroles rbac.authorization.k8s.io/v1 false ClusterRole
priorityclasses pc scheduling.k8s.io/v1 false PriorityClass
csidrivers storage.k8s.io/v1 false CSIDriver
csinodes storage.k8s.io/v1 false CSINode
storageclasses sc storage.k8s.io/v1 false StorageClass
volumeattachments storage.k8s.io/v1 false VolumeAttachment上面大致给出了集群范围内的资源和namespace内的资源的概览,实际上学习如何使用Kubernetes集群,就是学习这个API资源的使用。
创建和删除namespace
namespace的创建和删除十分简单:
# 创建namespace foo
kubectl create ns foo
# 查看namespace foo
kubectl describe ns foo
# 删除namespace foo
kubectl 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/