API对象配额是Kubernetes的一种限制用户或应用程序可以创建、更新或删除的API对象数量的策略。通过为API对象配置配额,用户可以确保集群的稳定性和性能,防止资源滥用和潜在的安全问题。本文将介绍如何在Kubernetes中为API对象配置配额,包括 PersistentVolumeClaim 和 Service。
配额限制了可以在命名空间中创建的特定类型对象的数量。 可以在 ResourceQuota 对象中指定配额。
一、准备
必须拥有一个 Kubernetes 的集群,同时必须配置 kubectl 命令行工具与集群通信。 建议在至少有两个不作为控制平面主机的节点的集群上运行本教程。 如果还没有集群,可以通过 Minikube 构建一个自己的集群,或者可以使用下面的 Kubernetes 练习环境之一:
- Killercoda
- 玩转 Kubernetes
要获知版本信息,请输入 kubectl version.
二、创建命名空间
创建一个命名空间以便本例中创建的资源和集群中的其余部分相隔离。
kubectl create namespace quota-object-example
三、创建ResourceQuota
下面是一个 ResourceQuota 对象的配置文件:
<code class="language-yaml" data-lang="yaml">apiVersion: v1 kind: ResourceQuota metadata: name: object-quota-demo spec: hard: persistentvolumeclaims: "1" services.loadbalancers: "2" services.nodeports: "0"
创建 ResourceQuota:
kubectl apply -f https://k8s.io/examples/admin/resource/quota-objects.yaml --namespace=quota-object-example
查看 ResourceQuota 的详细信息:
kubectl get resourcequota object-quota-demo --namespace=quota-object-example --output=yaml
输出结果表明在 quota-object-example 命名空间中,至多只能有一个 PersistentVolumeClaim, 最多两个 LoadBalancer 类型的服务,不能有 NodePort 类型的服务。
<code class="language-yaml" data-lang="yaml">status: hard: persistentvolumeclaims: "1" services.loadbalancers: "2" services.nodeports: "0" used: persistentvolumeclaims: "0" services.loadbalancers: "0" services.nodeports: "0"
四、创建PersistentVolumeClaim
下面是一个 PersistentVolumeClaim 对象的配置文件:
<code class="language-yaml" data-lang="yaml">apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-quota-demo spec: storageClassName: manual accessModes: - ReadWriteOnce resources: requests: storage: 3Gi
创建 PersistentVolumeClaim:
kubectl apply -f https://k8s.io/examples/admin/resource/quota-objects-pvc.yaml --namespace=quota-object-example
确认已创建完 PersistentVolumeClaim:
kubectl get persistentvolumeclaims --namespace=quota-object-example
输出信息表明 PersistentVolumeClaim 存在并且处于 Pending 状态:
<pre tabindex="0">NAME STATUS
pvc-quota-demo Pending
<h2 id="attempt-to-create-a-second-persistentvolumeclaim">
五、创建第二个PersistentVolumeClaim
下面是第二个 PersistentVolumeClaim 的配置文件:
<code class="language-yaml" data-lang="yaml">apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-quota-demo-2 spec: storageClassName: manual accessModes: - ReadWriteOnce resources: requests: storage: 4Gi
尝试创建第二个 PersistentVolumeClaim:
kubectl apply -f https://k8s.io/examples/admin/resource/quota-objects-pvc-2.yaml --namespace=quota-object-example
输出信息表明第二个 PersistentVolumeClaim 没有创建成功,因为这会超出命名空间的配额。
persistentvolumeclaims "pvc-quota-demo-2" is forbidden:
exceeded quota: object-quota-demo, requested: persistentvolumeclaims=1,
used: persistentvolumeclaims=1, limited: persistentvolumeclaims=1
六、说明
下面这些字符串可被用来标识那些能被配额限制的 API 资源:
- “pods”:Pod
- “services”:Service
- “replicationcontrollers”:ReplicationController
- “resourcequotas”:ResourceQuota
- “secrets”:Secret
- “configmaps”:ConfigMap
- “persistentvolumeclaims”:PersistentVolumeClaim
- “services.nodeports”:NodePort 类型的 Service
- “services.loadbalancers”:LoadBalancer 类型的 Service
七、清理
删除命名空间:
kubectl delete namespace quota-object-example