前面一节介绍了使用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:

1
2
3
4
5
6
7
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命令查看:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# 位于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的创建和删除十分简单:

1
2
3
4
5
6
7
8
# 创建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具体配置示例可以查看官方文档:

参考