首页 > 其他分享 >k8s资源管理之ResourceQuota、LimitRange和QoS

k8s资源管理之ResourceQuota、LimitRange和QoS

时间:2024-02-29 23:33:58浏览次数:15  
标签:Kubernetes LimitRange 命名 ResourceQuota Pod k8s 资源

ResourceQuota

ResourceQuota 是 Kubernetes 中的一个资源配额对象,用于限制命名空间(Namespace)中资源的使用量。ResourceQuota 可以限制命名空间中的 Pod 数量、特定类型资源对象的数量(如 Services、Deployments 等),以及命名空间内所有 Pod 可以使用的计算资源总量(如 CPU、内存等)。

ResourceQuota 的主要作用是在多用户共享 Kubernetes 集群时,确保每个命名空间中的资源使用量不会超过其配额限制,从而避免资源过度消耗和竞争。这对于管理集群资源、确保公平性和防止资源滥用非常有用。

在创建 ResourceQuota 时,管理员需要指定要限制的资源类型(如 CPU、内存、存储等)以及相应的配额值。当用户在命名空间中创建或更新资源时,Kubernetes 的配额系统会跟踪资源使用情况,并确保不超过 ResourceQuota 中定义的限制。如果请求的资源超过了配额限制,相关的 API 请求将会被拒绝,并返回 403 Forbidden 错误。

ResourceQuota 的应用范围是命名空间级别的,每个命名空间可以有一个或多个 ResourceQuota 对象。需要注意的是,ResourceQuota 只限制命名空间中资源的创建和更新操作,对于已经存在的资源对象,修改 ResourceQuota 的配额值不会影响它们的使用。

此外,ResourceQuota 的启用需要依赖于 Kubernetes API 服务器的启动参数 --enable-admission-plugins 中包含 ResourceQuota。在默认情况下,许多 Kubernetes 发行版都会启用这个插件,以确保 ResourceQuota 的功能可用。

总的来说,ResourceQuota 是 Kubernetes 中实现资源配额管理的重要工具,它可以帮助管理员有效地控制和限制命名空间中的资源使用,确保集群的稳定性和公平性。

apiVersion: v1  
kind: ResourceQuota  
metadata:  
  name: resource-quota-example  
  namespace: my-namespace  
spec:  
  hard:  
    pods: "10"                  # 命名空间中允许的最大 Pod 数量  
    services: "5"               # 命名空间中允许的最大 Service 数量  
    replicationcontrollers: "2" # 命名空间中允许的最大 ReplicationController 数量  
    resourcequotas: "1"         # 命名空间中允许的最大 ResourceQuota 数量  
    secrets: "10"               # 命名空间中允许的最大 Secret 数量  
    persistentvolumeclaims: "4" # 命名空间中允许的最大 PersistentVolumeClaim 数量  
    services.loadbalancers: "1" # 允许的最大 LoadBalancer 类型 Service 数量  
    requests.cpu: "10"          # 命名空间中所有 Pods 可以请求的 CPU 总量  
    requests.memory: "10Gi"     # 命名空间中所有 Pods 可以请求的内存总量  
    limits.cpu: "20"            # 命名空间中所有 Pods 可以使用的 CPU 总量上限  
    limits.memory: "20Gi"       # 命名空间中所有 Pods 可以使用的内存总量上限

LimitRange

LimitRange 是 Kubernetes 中的一个资源限制策略对象,用于在命名空间内限制资源分配(给多个 Pod 或 Container)。通过 LimitRange,管理员可以实施对每个 Pod 或 Container 的最小和最大资源使用量的限制,以及对每种资源的申请值和限制值的比值的控制。此外,LimitRange 还可以设置命名空间中计算资源的默认申请/限制值,这些默认值会自动注入到多个 Container 中。

LimitRange 的主要作用包括:

  1. 限制资源使用:通过定义最小和最大资源限制,确保 Pod 和 Container 在使用计算资源时不会过度消耗,从而避免对集群中的其他工作负载造成干扰。
  2. 资源配额控制:LimitRange 可以用来实施命名空间级别的资源配额控制,确保命名空间内的资源分配符合管理策略。
  3. 自动注入默认值:管理员可以设置默认的资源申请和限制值,这些默认值会在创建 Pod 时自动注入到 Container 的配置中,从而简化了资源配置的过程。
  4. 提升资源利用率:通过合理的资源限制和默认值设置,LimitRange 有助于提高集群中资源的利用率,避免资源浪费。

LimitRange 的使用在 Kubernetes 1.10 版本及之后的版本中默认启用,并且在许多 Kubernetes 发行版中也是默认启用的。

以下是一个 LimitRange 的 YAML 示例:

apiVersion: v1  
kind: LimitRange  
metadata:  
  name: limitrange-example  
  namespace: my-namespace  
spec:  
  limits:  
  - type: Pod  
    max:  
      cpu: "2"  
      memory: "2Gi"  
    min:  
      cpu: "500m"  
      memory: "64Mi"  
    default:  
      cpu: "1"  
      memory: "512Mi"  
  - type: Container  
    max:  
      cpu: "1"  
      memory: "1Gi"  
    min:  
      cpu: "200m"  
      memory: "32Mi"  
    defaultRequest:  
      cpu: "500m"  
      memory: "256Mi"

在这个示例中,我们定义了一个名为 limitrange-example 的 LimitRange 对象,它位于 my-namespace 命名空间中。spec.limits 字段下定义了两个限制规则,一个针对整个 Pod,另一个针对单个 Container。每个规则都包含了最大、最小和默认的资源限制值。

要创建这个 LimitRange 对象,同样可以使用 kubectl 命令:

bash复制代码

kubectl create -f limitrange.yaml

其中,limitrange.yaml 是包含上述 YAML 定义的文件名。

请注意,LimitRange 的名称必须是合法的 DNS 子域名,并且其限制规则应当根据实际需求和集群的硬件配置来合理设置。

QoS

QoS(Quality of Service,服务质量)是Kubernetes中用于管理Pod资源分配和调度的一个重要概念。在Kubernetes中,每个Pod都会被分配一个QoS等级,这个等级决定了Pod的调度优先级和驱逐优先级,以及Pod在不同节点上的资源分配策略。

Kubernetes定义了三种QoS等级:

  1. BestEffort:这是最低级别的QoS,适用于那些不需要保证资源使用的Pod。在这种QoS等级下,Pod中的容器没有指定CPU和内存的requests和limits,因此它们可以使用任何可用的资源,但也可能因为资源不足而被系统驱逐。BestEffort Pod通常用于一些非关键的任务,如系统服务或日志收集器。

    apiVersion: v1  
    kind: Pod  
    metadata:  
      name: best-effort-pod  
    spec:  
      containers:  
      - name: best-effort-container  
        image: nginx
    
  2. Burstable:这种QoS等级适用于那些需要一定量的CPU和内存资源,但也可能需要超过这些资源的Pod。Burstable Pod被分配了一定的CPU和内存资源,但当系统中其他Pod消耗了更多的资源时,它们的资源可用性可能会受到影响。容器能够使用超过所分配的资源量(称为“突发资源”),但实际可用资源量取决于其他Pod和系统资源占用情况。

    apiVersion: v1  
    kind: Pod  
    metadata:  
      name: burstable-pod  
    spec:  
      containers:  
      - name: burstable-container  
        image: nginx  
        resources:  
          requests:  
            cpu: 100m  
            memory: 100Mi
    
  3. Guaranteed:这是最高级别的QoS,适用于那些需要保证资源使用的Pod。在这种QoS等级下,Pod里的每个容器都必须有内存/CPU限制和请求,而且值必须相等。Kubernetes会严格限制这些Pod的资源使用,确保它们始终有足够的资源来运行,并且不会被其他Pod或系统资源竞争所影响。

    apiVersion: v1  
    kind: Pod  
    metadata:  
      name: guaranteed-pod  
    spec:  
      containers:  
      - name: guaranteed-container  
        image: nginx  
        resources:  
          requests:  
            cpu: 500m  
            memory: 500Mi  
          limits:  
            cpu: 500m  
            memory: 500Mi
    

Pod的QoS等级是根据容器的资源要求和系统中其他Pod的资源使用情况来判断的。容器的资源要求可以通过在容器定义中指定相应的request和limit来定义。Kubernetes会根据这些要求来计算Pod的QoS等级,并据此进行资源分配和调度决策。

标签:Kubernetes,LimitRange,命名,ResourceQuota,Pod,k8s,资源
From: https://www.cnblogs.com/ydswin/p/18045899

相关文章

  • K8S-Pod 进阶
    Pod进阶资源限制当定义Pod时可以选择性地为每个容器设定所需要的资源数量。最常见的可设定资源是CPU和内存大小,以及其他类型的资源。当为Pod中的容器指定了request资源时,代表容器运行所需的最小资源量,调度器就使用该信息来决定将Pod调度到哪个节点上。当还为容器......
  • k8s使用
     查看节点[root@k8s-masterdata]#kubectlgetpodNAMEREADYSTATUSRESTARTSAGEhelloworld-deployment-cddb745bf-5cvdm0/1ImagePullBackOff033mjava-68cd4b9d4b-l4zc7......
  • 在K8S中,ingress该如何使用?
    在Kubernetes(K8s)中,Ingress是一种API对象,它提供了对外部请求进入集群内部服务的一种统一入口和路由机制。Ingress控制器是一个运行在集群中的守护进程,它监听Ingress对象的变化并配置相应的负载均衡器或代理服务,以便根据定义的规则转发HTTP(S)请求到后端的Service。以下是使用......
  • 在K8S中,如果pod处于不健康状态怎么排查?
    在Kubernetes(K8s)中,Pod处于不健康状态可能由多种原因导致。为了排查这个问题,你需要采取一系列步骤来确定问题的根源。下面是一个详细的排查过程:检查Pod的状态:使用kubectlgetpods命令来查看Pod的当前状态。不健康的Pod可能处于CrashLoopBackOff、Error、Pending或Unknown等状......
  • 在K8S中,CNI有什么作用?
    在Kubernetes(简称K8s)中,ContainerNetworkInterface(CNI)起着至关重要的作用,它主要解决了容器网络配置及通信的问题,确保了Pod间的网络连通性及其与外部世界的通信。CNI的具体作用包括但不限于以下几个方面:网络配置自动化:当Kubernetes创建或销毁Pod时,CNI插件会自动为Pod中的每个......
  • 在K8S中,nodePort的externalTrafficPolicy字段有什么作用?
    在Kubernetes(K8s)中,externalTrafficPolicy字段是Service对象的一个属性,它主要应用于NodePort和LoadBalancer类型的服务,用于控制外部流量进入集群后如何路由到后端的Pods。externalTrafficPolicy可以设置为两种值:Cluster(默认值)和Local。Cluster:当externalTraf......
  • 在K8S中,nodePort默认端口范围是多少? 为什么是这个端口范围?
    在Kubernetes(K8s)中,NodePort服务类型的默认端口范围通常是30000-32767。这个范围是Kubernetes项目早期设定的标准,并且被广泛接受为默认配置。选择这个端口范围的原因有以下几点:避免冲突:低于30000的端口往往被系统保留给一些知名的网络服务和应用程序使用。设置较高......
  • k8s标签的增删改查和选择器
    在Kubernetes(K8s)中,标签(Label)是与资源对象相关联的键值对,用于实现多维度的资源分组管理功能。下面是关于Kubernetes标签的增删改查操作的简要说明:查询标签(查)要查看资源对象的标签,可以使用kubectlget命令并加上--show-labels选项。例如,要查看所有节点的标签,可以运行:......
  • k8s是如何保障滚动升级时下线的pod不被访问
    Kubernetes(k8s)通过一系列机制保障在滚动升级时,下线的Pod不再被访问。以下是一些主要的保障措施:Service抽象:在Kubernetes中,Pod通常不是直接暴露给外部访问的,而是通过Service来抽象和暴露。Service提供一个稳定的网络端点,无论背后的Pod如何变化,Service的IP和端......
  • 记一次酣畅淋漓的 K8s Ingress 排错过程(302,404,503,...)
    故事开始第1关:【流量重定向到/】第2关:【应用返回302,重定向到/,引入503错误】第3关:【静态资源访问遇到503问题】第4关:【静态资源访问遇到403问题】第5关:【WebSocketclosewithstatuscode1006】最后效果故事开始如果你配置过Ingress,那你一定遇到过......