022-K8S-资源限制

集群环境

IP Hostname 用途
10.20.1.139 k8s-master01 Master节点
10.20.1.140 k8s-node01 Node节点
10.20.1.141 k8s-node02 Node节点
10.20.1.142 k8s-node03 Node节点

一、资源限制 - 概念

备注:CPU单位换算:100m CPU,100 milliCPU 和 0.1 CPU 都相同;精度不能超过 1m。1000m CPU = 1 CPU。

官方文档

Kubernetes 对资源的限制实际上是通过 cgroup 来控制的,cgroup 是容器的一组用来控制内核如何运行进程的相关属性集合。针对内存、CPU和各种设备都有对应的 cgroup。

默认情况下,Pod 运行没有 CPU 和内存的限额。这意味着系统中的任何 Pod 将能够像执行 Pod 所在节点机器一样,可以消耗足够多的 CPU 和内存。一般会针对某些应用的 Pod 资源进行资源限制,这个资源限制是通过 resources 的 requests【要分配的资源】和 limits【最大使用资源】来实现的。

二、资源限制 - 特性

  • 调度器在调度时并不关注各类资源在当前时刻的实际使用量,而只关心节点上部署的所有 Pod 的资源申请量之和
  • 在容器内看到的始终是节点的内存,而不是容器本身的内存
  • 在容器内看到的始终是节点所有的 CPU 核,而不是仅仅只是容器可用的

三、资源限制 - HPA

1. 资源限制 - 案例解析

资源清单:resource-limited-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: resource-limited-pod
spec:
  containers:
    - name: my-container
      image: nginx:1.29.0
      # 定义容器的资源请求和限制,控制 CPU 和内存的使用
      resources:
        requests: # 定义容器的资源请求,即容器启动时需要的最小资源量
          # 容器启动时需要的最小内存量
          memory: "64Mi"
          # 容器启动时需要的最小CPU量(250毫核, 0.25核心)
          cpu: "250m"
        limits: # 定义容器的资源限制,即容器可以使用的最大资源量
          # 容器可以使用的最大内存量
          memory: "128Mi"
          # 容器可以使用的最大CPU量(500毫核, 0.5核心)
          cpu: "500m"

2. 资源限制 - 案例实操

2.1 部署 metrics.server

Metrics-Server 是集群核心监控数据的聚合器。通俗地说,它存储了集群中各节点的监控数据,并且提供了 API 以供分析和使用。

HPA 需要 Metrics Server 提供 CPU 指标, Pod 的扩缩容也都是基于指标的变化动态进行的。

部署 metrics.server

参考:015-K8S-Prometheus部署及监控告警 第十一段

**Github: ** https://github.com/kubernetes-sigs/metrics-server

metrics.server 部署资源清单:components.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    k8s-app: metrics-server
    rbac.authorization.k8s.io/aggregate-to-admin: "true"
    rbac.authorization.k8s.io/aggregate-to-edit: "true"
    rbac.authorization.k8s.io/aggregate-to-view: "true"
  name: system:aggregated-metrics-reader
rules:
- apiGroups:
  - metrics.k8s.io
  resources:
  - pods
  - nodes
  verbs:
  - get
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    k8s-app: metrics-server
  name: system:metrics-server
rules:
- apiGroups:
  - ""
  resources:
  - nodes/metrics
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - pods
  - nodes
  verbs:
  - get
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server-auth-reader
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: extension-apiserver-authentication-reader
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server:system:auth-delegator
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:auth-delegator
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  name: system:metrics-server
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:metrics-server
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
spec:
  ports:
  - name: https
    port: 443
    protocol: TCP
    targetPort: https
  selector:
    k8s-app: metrics-server
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
spec:
  selector:
    matchLabels:
      k8s-app: metrics-server
  strategy:
    rollingUpdate:
      maxUnavailable: 0
  template:
    metadata:
      labels:
        k8s-app: metrics-server
    spec:
      containers:
      - args:
        - --cert-dir=/tmp
        - --secure-port=10250
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        - --kubelet-insecure-tls  # 跳过 Kubelet TLS 验证
        - --metric-resolution=15s
        image: registry.k8s.io/metrics-server/metrics-server:v0.7.0
        imagePullPolicy: IfNotPresent
        livenessProbe:
          failureThreshold: 3
          httpGet:
            path: /livez
            port: https
            scheme: HTTPS
          periodSeconds: 10
        name: metrics-server
        ports:
        - containerPort: 10250
          name: https
          protocol: TCP
        readinessProbe:
          failureThreshold: 3
          httpGet:
            path: /readyz
            port: https
            scheme: HTTPS
          initialDelaySeconds: 20
          periodSeconds: 10
        resources:
          requests:
            cpu: 100m
            memory: 200Mi
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            drop:
            - ALL
          readOnlyRootFilesystem: true
          runAsNonRoot: true
          runAsUser: 1000
          seccompProfile:
            type: RuntimeDefault
        volumeMounts:
        - mountPath: /tmp
          name: tmp-dir
      nodeSelector:
        kubernetes.io/os: linux
      priorityClassName: system-cluster-critical
      serviceAccountName: metrics-server
      volumes:
      - emptyDir: {}
        name: tmp-dir
---
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
  labels:
    k8s-app: metrics-server
  name: v1beta1.metrics.k8s.io
spec:
  group: metrics.k8s.io
  groupPriorityMinimum: 100
  insecureSkipTLSVerify: true
  service:
    name: metrics-server
    namespace: kube-system
  version: v1beta1
  versionPriority: 100

执行资源清单

# 执行资源清单,部署 metrics-server
$ kubectl apply -f components.yaml

# 查看 metrics-server 运行状态,确保处于执行中
$ kubectl get pod -n kube-system  -o wide -w | grep metrics-server
metrics-server-56cfc8b678-zvqpz            1/1     Running   2 (56s ago)    2m9s   171.20.85.237   k8s-node01     <none>           <none>

2.2 演示 hpa 自动扩缩容

2.2.1 部署 Deployment

资源清单:hpa-deploy-demo.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hpa-deploy-demo
spec:
  replicas: 1 # 默认副本数量为1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: my-container
          image: nginx:1.29.0
          resources: # 定义容器的资源请求和限制,控制 CPU 和内存的使用
            requests:
              memory: "100Mi"
              cpu: "200m"
            limits:
              memory: "200Mi"
              cpu: "400m"

---

apiVersion: v1
kind: Service
metadata:
  name: hpa-deploy-demo
spec:
  selector:
    app: myapp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

执行资源清单

# 执行资源清单,部署 Deployment 和 Service
$ kubectl delete -f hpa-deploy-demo.yaml 
deployment.apps "hpa-deploy-demo" deleted
service "hpa-deploy-demo" deleted

# 查看Pod,当前仅有一个 Pod 处于运行中,与资源清单中定义Pod副本数一致
$ kubectl get pods
NAME                               READY   STATUS    RESTARTS   AGE
hpa-deploy-demo-5587d8c7c4-k578h   1/1     Running   0          9s

# 查看Service,确定 Service IP
$ kubectl get svc 
NAME              TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
hpa-deploy-demo   ClusterIP   10.109.153.144   <none>        80/TCP    16s

2.2.2 部署 HPA

创建 HPA

# 创建一个或更新一个 HPA 资源,自动根据 CPU 使用率(目标值为 10%)调整 hpa-deploy-demo 这个 Deployment 的 Pod 副本数,副本数范围在 2 到 10 之间
$ kubectl autoscale deployment hpa-deploy-demo --cpu-percent=10 --min=2 --max=10
horizontalpodautoscaler.autoscaling/hpa-deploy-demo autoscaled

# 查看HPA,过一会 Deployment 副本数由 1 变成 2,表示 HPA生效了
$ kubectl get hpa hpa-deploy-demo
NAME              REFERENCE                    TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
hpa-deploy-demo   Deployment/hpa-deploy-demo   0%/10%    2         10        2          3s

测试自动扩缩容

# 多打开几个终端,连续访问 Service,观察 HPA 是否自动根据CPU负载,对 Deployment 进行了扩容
$ while true; do wget -q -O- http://10.109.153.144; done


# 观察HPA运行状态(随着访问量的增加 Pod 扩容,随着访问量减少 Pod 缩容)
$ kubectl get hpa -w
NAME              REFERENCE                    TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
hpa-deploy-demo   Deployment/hpa-deploy-demo   <unknown>/10%   2         10        0          3s
hpa-deploy-demo   Deployment/hpa-deploy-demo   16%/10%         2         10        2          13s
hpa-deploy-demo   Deployment/hpa-deploy-demo   17%/10%         2         10        4          28s
hpa-deploy-demo   Deployment/hpa-deploy-demo   14%/10%         2         10        4          44s
hpa-deploy-demo   Deployment/hpa-deploy-demo   11%/10%         2         10        4          59s
hpa-deploy-demo   Deployment/hpa-deploy-demo   7%/10%          2         10        4          75s
hpa-deploy-demo   Deployment/hpa-deploy-demo   0%/10%          2         10        4          90s
hpa-deploy-demo   Deployment/hpa-deploy-demo   0%/10%          2         10        4          6m4s
hpa-deploy-demo   Deployment/hpa-deploy-demo   0%/10%          2         10        3          6m20s
hpa-deploy-demo   Deployment/hpa-deploy-demo   0%/10%          2         10        2          6m35s

2.3 HPA资源清单

kubectl autoscale deployment hpa-deploy-demo --cpu-percent=10 --min=2 --max=10

上面的HPA创建命令可以转换成资源清单如下:

horizontal-pod-autoscaler.yaml

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-deploy-demo
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: hpa-deploy-demo # 关联的Deployment名称
  minReplicas: 2 # 最小副本数量
  maxReplicas: 10 # 最大副本数量
  metrics:
    - type: Resource # 指标类型为资源指标
      resource:
        name: cpu # 资源指标名称为CPU
        target:
          type: Utilization # 指标类型为利用率
          averageUtilization: 10 # 目标利用率为10%

2.4 HPA 操作

# 查看 HPA
kubectl get hpa

# 指定 Deployment 查看 HPA,并动态监控
kubectl get hpa hpa-deploy-demo --watch

# 删除指定的 HPA
kubectl delete hpa hpa-deploy-demo

四、服务质量等级(QoS)

1. 什么是 QoS

QoS(Quality of Service)即服务质量等级,是 Kubernetes 中作用于 Pod 的重要配置机制。当 Kubernetes 创建 Pod 时,会根据容器的资源配置自动为其分配相应的 QoS 等级,这直接影响 Pod 的调度优先级和资源回收策略。

2. QoS 等级分类

Kubernetes 中的 QoS 等级分为三种:

2.1 Guaranteed(保证级)- 优先级最高

特征:Pod 中的每个容器都必须同时设置 CPU 和内存的 limitsrequests,且对应的值必须相等。

适用场景:关键业务应用,需要稳定的资源保证。

配置示例

spec:
  containers:
    - name: my-container
      image: nginx:1.29.0
      resources: # 定义容器的资源请求和限制,控制 CPU 和内存的使用
        requests:
          memory: "100Mi"
          cpu: "200m"
        limits:
          memory: "100Mi"
          cpu: "200m"

如果容器的资源 requests 没有显式设置,默认与 limits 相同

2.2 Burstable(突发级)- 优先级中等

特征:Pod 中至少有一个容器设置了内存或 CPU 的 requestslimits,但不满足 Guaranteed 等级的要求。

适用场景:一般业务应用,允许资源使用量在一定范围内波动。

配置示例

spec:
  containers:
    - name: my-container
      image: nginx:1.29.0
      resources: # 定义容器的资源请求和限制,控制 CPU 和内存的使用
        requests:
          memory: "100Mi"
        limits:
          memory: "200Mi"

2.3 BestEffort(尽力而为级)- 优先级最低

特征:Pod 中的所有容器都没有设置任何内存或 CPU 的 limitsrequests

适用场景:非关键应用,对资源要求不高,可以容忍被优先回收。

配置示例

spec:
  containers:
    - name: my-container
      image: nginx:1.29.0
      resources: {}

3. QoS 的作用机制

3.1 调度优先级

  • Guaranteed:最高优先级,优先分配到资源充足的节点
  • Burstable:中等优先级,在满足基本资源需求的前提下调度
  • BestEffort:最低优先级,通常调度到剩余资源较多的节点

3.2 资源回收策略

当节点资源不足时,Kubernetes 会按照以下顺序回收 Pod:

  1. 首先回收 BestEffort 级别的 Pod
  2. 其次回收超出 requests 资源使用量的 Burstable 级别 Pod
  3. 最后回收 Guaranteed 级别的 Pod(仅在系统组件需要资源时)

4. 查看 Pod 的 QoS 等级

使用以下命令可以查看 Pod 的 QoS 等级:

kubectl get pod <pod-name> -o yaml | grep qosClass

或者使用 describe 命令:

kubectl describe pod <pod-name> | grep QoS

五、LimitRange

1. 概念

LimitRange 是一种用于限制容器资源使用的配置对象。它允许集群管理员定义资源的最小和最大限制,并确保容器在这些限制范围内使用资源。

通过使用 LimitRange,可以避免容器使用过多或过少的资源,保护集群免受资源耗尽和应用程序崩溃的影响。

默认情况下, Kubernetes 集群上的容器运行使用的计算资源没有限制。 使用 Kubernetes 资源配额, 管理员(也称为 集群操作者)可以在一个指定的命名空间内限制集群资源的使用与创建。 在命名空间中,一个 Pod 最多能够使用命名空间的资源配额所定义的 CPU 和内存用量。 作为集群操作者或命名空间级的管理员,你可能也会担心如何确保一个 Pod 不会垄断命名空间内所有可用的资源。

LimitRange 是限制命名空间内可为每个适用的对象类别 (例如 Pod 或 PersistentVolumeClaim) 指定的资源分配量(限制和请求)的策略对象。

一个 LimitRange(限制范围) 对象提供的限制能够做到:

  • 在一个命名空间中实施对每个 Pod 或 Container 最小和最大的资源使用量的限制。
  • 在一个命名空间中实施对每个 PersistentVolumeClaim 能申请的最小和最大的存储空间大小的限制。
  • 在一个命名空间中实施对一种资源的申请值和限制值的比值的控制。
  • 设置一个命名空间中对计算资源的默认申请/限制值,并且自动的在运行时注入到多个 Container 中。

当某命名空间中有一个 LimitRange 对象时,将在该命名空间中实施 LimitRange 限制。

2. 案例

2.1 创建 LimitRange

资源清单:limit-range.yaml

apiVersion: v1
kind: LimitRange
metadata:
  name: limit-range-demo  # 限制范围的名称
  namespace: default      # 限制范围的命名空间
spec:
  limits:
    - type: Pod        # 限制Pod的资源
      max:                # 定义了 Pod 中所有容器的资源请求(requests)和限制(limits)之和的最大值。
        cpu: "1"          # 该 Pod 使用的 CPU 总和不能超过 1 核。
        memory: "1Gi"     # 该 Pod 使用的内存总和不能超过 1GiB。
      min:                # 定义了 Pod 中所有容器的资源请求(requests)之和的最小值
        cpu: "200m"       # 该 Pod 至少需要请求(requests)200 milliCPU(即 0.2 核)
        memory: "100Mi"   # 该 Pod 至少需要请求(requests)100 Mebibyte 内存
    - type: Container  # 限制Container的资源
      max:                # 定义了单个容器可以设置的资源限制(limits)的最大值。
        cpu: 500m         # 任何容器定义的 limits.cpu 都不能超过 500m(0.5核)
        memory: 1Gi       # 任何容器定义的 limits.memory 都不能超过 500MiB
      min:                # 定义了单个容器可以设置的资源请求(requests)的最小值。
        cpu: 100m         # 任何容器定义的 requests.cpu 都不能低于 100m(0.1 核)
        memory: 100Mi     # 任何容器定义的 requests.memory 都不能低于 100MiB
      defaultRequest:     # 默认请求值,如果一个容器被创建时没有指定 requests.cpu 或 requests.memory,系统会自动为它设置这些默认值
        cpu: 200m
        memory: 500Mi
      default:            # 默认限制值,如果一个容器被创建时没有指定 limits.cpu 或 limits.memory,系统会自动为它设置这些默认值
        cpu: 500m
        memory: 500Mi
      maxLimitRequestRatio: # 定义了容器的最大资源限制与请求的比例。
        cpu: "2"            #  容器的 limits.cpu / requests.cpu 的比值不能大于 2。例如,如果 requests.cpu 是 100m,那么 limits.cpu 最大只能设为 200m
        memory: "4"         # 容器的 limits.memory / requests.memory 的比值不能大于 4。例如,如果 requests.memory 是 100MiB,那么 limits.memory 最大只能设为 400MiB

执行资源清单

# 执行资源清单,创建 LimitRange
$ kubectl apply -f limit-range.yaml 
limitrange/limit-range-demo created

# 查看有哪些 LimitRange
$ kubectl get LimitRange
NAME               CREATED AT
limit-range-demo   2025-09-11T12:50:58Z

# 查看详情
$ kubectl describe LimitRange limit-range-demo
Name:       limit-range-demo
Namespace:  default
Type        Resource  Min    Max   Default Request  Default Limit  Max Limit/Request Ratio
----        --------  ---    ---   ---------------  -------------  -----------------------
Pod         cpu       200m   1     -                -              -
Pod         memory    100Mi  1Gi   -                -              -
Container   memory    100Mi  1Gi   500Mi            500Mi          4
Container   cpu       100m   500m  200m             500m           2

2.2 创建 Pod

2.2.1 不符合 LimitRange 要求的 Pod

资源清单:error-limit-deploy.yaml

apiVersion: v1
kind: Pod
metadata:
  name: error-limited-deploy
  namespace: default
spec:
  containers:
    - name: my-container
      image: nginx:1.29.0
      # 最大内存与最小内存的比值不能超过 4,这里超过了,因此资源清单执行失败
      resources:
        requests: # 定义容器的资源请求,即容器启动时需要的最小资源量
          memory: "100Mi"
          cpu: "250m"
        limits: # 定义容器的资源限制,即容器可以使用的最大资源量
          memory: "500Mi"
          cpu: "500m"

执行资源清单

$ kubectl apply -f error-limit-deploy.yaml 
Error from server (Forbidden): error when creating "error-limit-deploy.yaml": pods "error-limited-deploy" is forbidden: memory max limit to request ratio per Container is 4, but provided ratio is 5.000000

最大内存与最小内存的比值不能超过 4,这里是5,超过了,因此 Pod 创建失败。

2.2.2 符合 LimitRange 要求的 Pod

资源清单:right-limit-deploy.yaml

apiVersion: v1
kind: Pod
metadata:
  name: error-limited-deploy
  namespace: default
spec:
  containers:
    - name: my-container
      image: nginx:1.29.0
      # 最大内存与最小内存的比值不能超过 4,这里超过了,因此资源清单执行失败
      resources:
        requests: # 定义容器的资源请求,即容器启动时需要的最小资源量
          memory: "200Mi"
          cpu: "200m"
        limits: # 定义容器的资源限制,即容器可以使用的最大资源量
          memory: "500Mi"
          cpu: "400m"

执行资源清单

$ kubectl apply -f right-limit-deploy.yaml 
pod/error-limited-deploy created

$ kubectl get pods 
NAME                   READY   STATUS    RESTARTS   AGE
error-limited-deploy   1/1     Running   0          94s

六、ResourceQuota

1. 概念

ResourceQuota 是一种用于限制命名空间内资源使用的对象。它允许集群管理员对命名空间中的资源使用进行配额管理,确保不同的团队或项目之间资源的公平分配和有效利用。

使用 ResourceQuota,可以限制命名空间中的CPU、内存和其他资源的总量,防止资源滥用和浪费。

资源配额,通过 ResourceQuota 对象来定义,对每个命名空间的资源消耗总量提供限制。 它可以限制命名空间中某种类型的对象的总数目上限,也可以限制命名空间中的 Pod 可以使用的计算资源的总上限。

资源配额的工作方式如下:

  • 不同的团队可以在不同的命名空间下工作。这可以通过 RBAC 强制执行。
  • 集群管理员可以为每个命名空间创建一个或多个 ResourceQuota 对象。
  • 当用户在命名空间下创建资源(如 Pod、Service 等)时,Kubernetes 的配额系统会跟踪集群的资源使用情况, 以确保使用的资源用量不超过 ResourceQuota 中定义的硬性资源限额。
  • 如果资源创建或者更新请求违反了配额约束,那么该请求会报错(HTTP 403 FORBIDDEN), 并在消息中给出有可能违反的约束。
  • 如果命名空间下的计算资源 (如 cpu 和 memory)的配额被启用, 则用户必须为这些资源设定请求值(request)和约束值(limit),否则配额系统将拒绝 Pod 的创建。 提示: 可使用 LimitRanger 准入控制器来为没有设置计算资源需求的 Pod 设置默认值。

简而言之,ResourceQuota 配额就是用来设置一个命名空间最多能创建多少个对象,比如能创建多少svc,能创建多少pod/deploy。

2. 案例

2.1 创建 ResourceQuota

资源清单: resource-quota.yaml

apiVersion: v1
kind: ResourceQuota
metadata:
  name: my-resource-quota
  namespace: test-quota
spec:
  hard: # 强制性的资源上限
    requests.cpu: "20"            # 该命名空间中所有 Pod 的 spec.containers[].resources.requests.cpu 之和不能超过 20 个 CPU 核心
    requests.memory: 100Gi        # 该命名空间中所有 Pod 的 spec.containers[].resources.requests.memory 之和不能超过 100 Gibibyte
    limits.cpu: "40"              # 该命名空间中所有 Pod 的 spec.containers[].resources.limits.cpu 之和不能超过 40 个 CPU 核心
    limits.memory: 200Gi          # 该命名空间中所有 Pod 的 spec.containers[].resources.limits.memory 之和不能超过 200 Gibibyte
    pods: "1"                     # 在该命名空间中最多只能创建 1 个 Pod
    configmaps: "10"              # 最多只能创建 10 个 ConfigMap
    persistentvolumeclaims: "4"   # 最多只能创建 4 个 PersistentVolumeClaim (PVC)
    replicationcontrollers: "20"  # 最多只能创建 20 个 ReplicationController(一种老的 Pod 控制器)
    secrets: "10"                 # 最多只能创建 10 个 Secret
    services: "10"                # 最多只能创建 10 个 Service
    services.loadbalancers: "2"   # 在所有的 Service 中,类型为 LoadBalancer 的不能超过 2 个

执行资源清单

# 创建名称空间
$ kubectl create ns test-quota
namespace/test-quota created

# 执行资源清单,创建 ResourceQuota
$ kubectl apply -f resource-quota.yaml 
resourcequota/my-resource-quota created

# 查看 quota 配置详情
$ kubectl describe ResourceQuota -n test-quota
Name:                   my-resource-quota
Namespace:              test-quota
Resource                Used  Hard
--------                ----  ----
configmaps              1     10
limits.cpu              0     40
limits.memory           0     200Gi
persistentvolumeclaims  0     4
pods                    0     1
replicationcontrollers  0     20
requests.cpu            0     20
requests.memory         0     100Gi
secrets                 0     10
services                0     10
services.loadbalancers  0     2

2.2 创建 Pod

资源清单:test-deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-deploy
  namespace: test-quota
spec:
  replicas: 1 # 默认副本数量为1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: my-container
          image: nginx:1.29.0
          resources: # 定义容器的资源请求和限制,控制 CPU 和内存的使用
            requests:
              memory: "100Mi"
              cpu: "200m"
            limits:
              memory: "200Mi"
              cpu: "400m"

执行资源清单

# 执行资源清单创建 Pod
$ kubectl apply -f test-deploy.yaml 
deployment.apps/test-deploy created

# 查看Pod,当前只有一个
$ kubectl get pods -n test-quota
NAME                           READY   STATUS    RESTARTS   AGE
test-deploy-5587d8c7c4-mptk4   1/1     Running   0          12s

# 给 Pod 扩容,由于在 ResourceQuota 中限制只能有1个 Pod,因此扩容会失败
$ kubectl scale deployment test-deploy --replicas=3 -n test-quota
deployment.apps/test-deploy scaled

# 监控pod,发现一直只有一个副本
$ kubectl get pods -n test-quota -w
NAME                           READY   STATUS    RESTARTS   AGE
test-deploy-5587d8c7c4-mptk4   1/1     Running   0          79s

参考链接

https://jimmysong.io/book/kubernetes-handbook/cluster/qos/

https://www.cnblogs.com/renshengdezheli/p/17528247.html

https://www.cnblogs.com/zhanglianghhh/p/14259632.html

https://juejin.cn/post/6974203884369608734


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 george_95@126.com