k8s 【策略】【资源管理】ResourceQuota(2)

简介: k8s 【策略】【资源管理】ResourceQuota(2)

11. 跨命名空间 Pod Affinity Quota

特征状态: Kubernetes v1.24 [stable]

运营商可以使用CrossNamespacePodAffinity配额范围来限制允许哪些命名空间拥有具有跨命名空间的亲和术语的 pod。具体来说,它控制允许设置哪些 pod namespaces或namespaceSelect 亲和性术语中的字段。


可能需要防止用户使用跨命名空间亲和性术语,因为具有反亲和性约束(anti-affinity constraints)的 pod 可能会阻止来自所有其他命名空间的 pod 在故障域中被调度。


使用此范围运算符可以防止某些命名空间(foo-ns在下面的示例中)具有使用跨命名空间 pod 亲和性的 pod,方法是在该命名空间中创建一个CrossNamespaceAffinity范围和硬限制为 0 的资源配额对象:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: disable-cross-namespace-affinity
  namespace: foo-ns
spec:
  hard:
    pods: "0"
  scopeSelector:
    matchExpressions:
    - scopeName: CrossNamespaceAffinity

如果运营商希望默认禁止使用namespaces and namespaceSelector并且只允许特定命名空间使用,他们可以CrossNamespaceAffinity 通过将 kube-apiserver 标志 --admission-control-config-file 设置为以下配置文件的路径来配置为有限资源:

apiVersion: apiserver.config.k8s.io/v1
kind: AdmissionConfiguration
plugins:
- name: "ResourceQuota"
  configuration:
    apiVersion: apiserver.config.k8s.io/v1
    kind: ResourceQuotaConfiguration
    limitedResources:
    - resource: pods
      matchScopes:
      - scopeName: CrossNamespaceAffinity

12. 创建与查看 ResourceQuota

12.1 创建

kubectl create namespace myspace
cat <<EOF > compute-resources.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-resources
spec:
  hard:
    requests.cpu: "1"
    requests.memory: 1Gi
    limits.cpu: "2"
    limits.memory: 2Gi
    requests.nvidia.com/gpu: 4
EOF
kubectl create -f ./compute-resources.yaml --namespace=myspace
cat <<EOF > object-counts.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: object-counts
spec:
  hard:
    configmaps: "10"
    persistentvolumeclaims: "4"
    pods: "4"
    replicationcontrollers: "20"
    secrets: "10"
    services: "10"
    services.loadbalancers: "2"
EOF
kubectl create -f ./object-counts.yaml --namespace=myspace

12.2 查看

$ kubectl get quota --namespace=myspace
NAME                    AGE
compute-resources       30s
object-counts           32s
$  kubectl describe quota compute-resources --namespace=myspace
Name:                    compute-resources
Namespace:               myspace
Resource                 Used  Hard
--------                 ----  ----
limits.cpu               0     2
limits.memory            0     2Gi
requests.cpu             0     1
requests.memory          0     1Gi
requests.nvidia.com/gpu  0     4
$ kubectl describe quota object-counts --namespace=myspace
Name:                   object-counts
Namespace:              myspace
Resource                Used    Hard
--------                ----    ----
configmaps              0       10
persistentvolumeclaims  0       4
pods                    0       4
replicationcontrollers  0       20
secrets                 1       10
services                0       10
services.loadbalancers  0       2

Kubectl 还使用以下语法支持所有标准命名空间资源的对象计数配额count/<resource>.<group>

kubectl create namespace myspace
kubectl create quota test --hard=count/deployments.apps=2,count/replicasets.apps=4,count/pods=3,count/secrets=4 --namespace=myspace
kubectl create deployment nginx --image=nginx --namespace=myspace --replicas=2
$ kubectl describe quota --namespace=myspace
Name:                         test
Namespace:                    myspace
Resource                      Used  Hard
--------                      ----  ----
count/deployments.apps        1     2
count/pods                    2     3
count/replicasets.apps        1     4
count/secrets                 1     4

13. 默认限制优先级消耗

可能希望 pod 具有特定优先级,例如 当且仅当存在匹配的配额对象时,应允许在命名空间中使用“cluster-services”。


通过这种机制,运营商能够将某些高优先级类的使用限制在有限数量的命名空间中,并且默认情况下并非每个命名空间都能够使用这些优先级类。


要强制执行此操作,应使用kube-apiserver flag将路径传递到以下配置文件:--admission-control-config-file

apiVersion: apiserver.config.k8s.io/v1
kind: AdmissionConfiguration
plugins:
- name: "ResourceQuota"
  configuration:
    apiVersion: apiserver.config.k8s.io/v1
    kind: ResourceQuotaConfiguration
    limitedResources:
    - resource: pods
      matchScopes:
      - scopeName: PriorityClass
        operator: In
        values: ["cluster-services"]

然后,在命名空间中创建一个资源配额对象kube-system

apiVersion: v1
kind: ResourceQuota
metadata:
  name: pods-cluster-services
spec:
  scopeSelector:
    matchExpressions:
      - operator : In
        scopeName: PriorityClass
        values: ["cluster-services"]

创建

kubectl apply -f https://k8s.io/examples/policy/priority-class-resourcequota.yaml -n kube

在这种情况下,如果出现以下情况,将允许创建 pod:


priorityClassName未指定Pod 。

Pod 的priorityClassName值被指定为cluster-services.

PodpriorityClassName设置为cluster-services,将在kube-system命名空间中创建,并且已通过资源配额检查。

如果将 Pod 创建请求priorityClassName设置为cluster-services 并且将在kube-system

14. 实例

14.1 pod 请求或限制 cpu、mem 超出资源配置

  1. 创建 ResourceQuota 文件quota-mem-cpu.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: mem-cpu-demo
spec:
  hard:
    requests.cpu: "1"
    requests.memory: 1Gi
    limits.cpu: "2"
    limits.memory: 2Gi
kubectl create namespace quota-mem-cpu-example
kubectl apply -f https://k8s.io/examples/admin/resource/quota-mem-cpu.yaml --namespace=quota-mem-cpu-example
kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml
  1. 创建 pod 文件quota-mem-cpu-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: quota-mem-cpu-demo
spec:
  containers:
  - name: quota-mem-cpu-demo-ctr
    image: nginx
    resources:
      limits:
        memory: "800Mi"
        cpu: "800m"
      requests:
        memory: "600Mi"
        cpu: "400m"
kubectl apply -f https://k8s.io/examples/admin/resource/quota-mem-cpu-pod.yaml --namespace=quota-mem-cpu-example
kubectl get pod quota-mem-cpu-demo --namespace=quota-mem-cpu-example
kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml

输出显示配额以及已使用了多少配额。您可以看到Pod的内存和CPU请求以及限制没有超过配额。

status:
  hard:
    limits.cpu: "2"
    limits.memory: 2Gi
    requests.cpu: "1"
    requests.memory: 1Gi
  used:
    limits.cpu: 800m
    limits.memory: 800Mi
    requests.cpu: 400m
    requests.memory: 600Mi

注意,已用内存请求和此新内存请求的总和超过了内存请求配额。600 MiB + 700 MiB> 1 GiB。

尝试创建Pod:

kubectl apply -f https://k8s.io/examples/admin/resource/quota-mem-cpu-pod-2.yaml --namespace=quota-mem-cpu-example

没有创建第二个Pod。输出显示创建第二个Pod将导致内存请求总数超过内存请求配额。

Error from server (Forbidden): error when creating "examples/admin/resource/quota-mem-cpu-pod-2.yaml":
pods "quota-mem-cpu-demo-2" is forbidden: exceeded quota: mem-cpu-demo,
requested: requests.memory=700Mi,used: requests.memory=600Mi, limited: requests.memory=1Gi

参考:

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
存储 缓存 资源调度
深入理解 K8S 资源管理和调度|青训营笔记
本篇文章首先讲解K8S的整体架构,介绍各个模块的功能,在此基础上梳理K8S使用各个组件完成项目部署时涉及的资源管理和调度方式
176 0
深入理解 K8S 资源管理和调度|青训营笔记
|
Kubernetes 网络性能优化 Perl
k8s【资源管理】3--LimitRange为命名空间配置 CPU 最小和最大约束
k8s【资源管理】3--LimitRange为命名空间配置 CPU 最小和最大约束
|
Kubernetes 网络性能优化 Perl
k8s【资源管理(resources)】4--LimitRange为配置命名空间内存最小和最大约束
k8s【资源管理(resources)】4--LimitRange为配置命名空间内存最小和最大约束
|
Kubernetes 网络性能优化 容器
k8s 【资源管理】2--LimitRange为命名空间配置默认的内存请求和限制
k8s 【资源管理】2--LimitRange为命名空间配置默认的内存请求和限制
|
存储 Kubernetes 网络协议
k8s 【策略】【资源管理】ResourceQuota(1)
k8s 【策略】【资源管理】ResourceQuota(1)
k8s 【策略】【资源管理】ResourceQuota(1)
|
Kubernetes 应用服务中间件 nginx
|
Kubernetes 网络协议 关系型数据库
基于operator sdk轻松编写一个k8s自定义资源管理应用
operator 是一种 kubernetes 的扩展形式,可以帮助用户以 Kubernetes 的声明式 API 风格自定义来管理应用及服务,operator已经成为分布式应用在k8s集群部署的事实标准了,在云原生时代系统想迁移到k8s集群上编写operator应用是必不可少的能力,这里介绍用 CoreOS 的 operator framework 工具如何快速构建一个 operator 应用。
6875 0
|
存储 分布式计算 资源调度
spark on k8s的动态资源分配和external shuffle Service以及任务的队列资源管理
spark on k8s的动态资源分配和external shuffle Service以及任务的队列资源管理
737 0
|
10月前
|
存储 程序员 编译器
【Effective C++详细总结】第三章 资源管理
【Effective C++详细总结】第三章 资源管理
231 0

热门文章

最新文章