kubernetes学习4--资源配额管理(租户配额)

C++ Thread多线程的一个小问题 #include <iostream> #include<thread> #include<vector> #include<algorithm> #include<functional> using namespace std; void func() { cout << "from func: "<<this_thread::get_id()<< endl; } int main() { thr.. 阅读详情

kubernetes学习4--资源配额管理(租户配额)

2016年11月11日 18:17:33 夢_殤 阅读数:8493

    上一篇博文学习了Namespace,知道通过Namespace可以对集群中的可用资源进行分配和限制。那这篇就学习下,怎样指定资源配额。

    测试环境,2台node服务器,都是CPU为1,内存为1G。查询方法,可以参考另一篇文章“centOS7下实践查询版本/CPU/内存/硬盘容量等硬件信息”。或者kubectl get nodes查询到所有nodes后,bubectl describe node nodeName可查询到node的详细信息,推荐使用这种方法。

 

1.指定容器配额

    对应指定容器实施配额管理非常简单,只要在Pod或ReplicationController的定义文件中设定resource属性即可为某个容器指定配额。目前容器支持CPU和Memory两类资源的配额限制。

    下面这个RC定义文件中增加资源配额声明。

 

apiVersion: v1
kind: ReplicationController
metadata:
   name: php-controller
   labels: 
     name: php-controller
spec:
  replicas: 1
  selector:
     name: php-test-pod
  template: 
    metadata:
     labels:
       name: php-test-pod
    spec:
      containers:
      - name: php-test
        image: 192.168.174.131:5000/php-base:1.0
        env:
        - name: ENV_TEST_1
          value: env_test_1
        - name: ENV_TEST_2
          value: env_test_2
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 0.5
            memory: 512Mi
[root@localhost k8s]# kubectl create -f php-controller.yaml 
replicationcontroller "php-controller" created
[root@localhost k8s]# kubectl get pods -o wide
NAME                   READY     STATUS    RESTARTS   AGE       NODE
php-controller-qx1wg   1/1       Running   0          47s       192.168.174.130
[root@localhost k8s]# kubectl describe pod php-controller-qx1wg 
Name:           php-controller-qx1wg
Namespace:      default
Node:           192.168.174.130/192.168.174.130
Start Time:     Fri, 11 Nov 2016 17:27:21 +0800
Labels:         name=php-test-pod
Status:         Running
IP:             172.17.42.2
Controllers:    ReplicationController/php-controller
Containers:
  php-test:
    Container ID:       docker://1777abd035e7cc3c8dee9eb27487e76424aff61a26143b0f23fb0c411415ed5b
    Image:              192.168.174.131:5000/php-base:1.0
    Image ID:           docker://sha256:104c7334b9624b054994856318e54b6d1de94c9747ab9f73cf25ae5c240a4de2
    Port:               80/TCP
    QoS Tier:
      memory:   Guaranteed
      cpu:      Guaranteed
    Limits:
      cpu:      500m
      memory:   512Mi
    Requests:
      cpu:              500m
      memory:           512Mi
    State:              Running
      Started:          Fri, 11 Nov 2016 17:27:22 +0800
    Ready:              True
    Restart Count:      0
    Environment Variables:
      ENV_TEST_1:       env_test_1
      ENV_TEST_2:       env_test_2
Conditions:
  Type          Status
  Ready         True 
No volumes.
Events:
  FirstSeen     LastSeen        Count   From                            SubobjectPath                   Type            Reason                  Message
  ---------     --------        -----   ----                            -------------                   --------        ------                  -------
  1m            1m              2       {kubelet 192.168.174.130}                                       Warning         MissingClusterDNS       kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to DNSDefault policy.
  1m            1m              1       {kubelet 192.168.174.130}       spec.containers{php-test}       Normal          Pulled                  Container image "192.168.174.131:5000/php-base:1.0" already present on machine
  1m            1m              1       {kubelet 192.168.174.130}       spec.containers{php-test}       Normal          Created                 Created container with docker id 1777abd035e7
  1m            1m              1       {kubelet 192.168.174.130}       spec.containers{php-test}       Normal          Started                 Started container with docker id 1777abd035e7
  1m            1m              1       {default-scheduler }                                            Normal          Scheduled               Successfully assigned php-controller-qx1wg to 192.168.174.130

  

 

   如果资源配额声明的大小超出了实际物理机的CPU和内存,会怎样呢?是不是无法创建成功?把CPU改为3,memory改为3Gi,测试下。

 

[root@localhost k8s]# kubectl get pods -o wide
NAME                   READY     STATUS    RESTARTS   AGE       NODE
php-controller-47ufd   0/1       Pending   0     

  发现Pod的状态是Pendding。kubectl describe看下Pod的信息

 

 

[root@localhost k8s]# kubectl describe pod php-controller-47ufd 
Name:           php-controller-47ufd
Namespace:      default
Node:           /
Labels:         name=php-test-pod
Status:         Pending
IP:
Controllers:    ReplicationController/php-controller
Containers:
  php-test:
    Image:      192.168.174.131:5000/php-base:1.0
    Port:       80/TCP
    QoS Tier:
      cpu:      Guaranteed
      memory:   Guaranteed
    Limits:
      memory:   3Gi
      cpu:      3
    Requests:
      memory:   3Gi
      cpu:      3
    Environment Variables:
      ENV_TEST_1:       env_test_1
      ENV_TEST_2:       env_test_2
No volumes.
Events:
  FirstSeen     LastSeen        Count   From                    SubobjectPath   Type            Reason                  Message
  ---------     --------        -----   ----                    -------------   --------        ------                  -------
  3m            3m              1       {default-scheduler }                    Warning         FailedScheduling        pod (php-controller-47ufd) failed to fit in any node
fit failure on node (192.168.174.131): Node didn't have enough resource: CPU, requested: 3000, used: 0, capacity: 1000
fit failure on node (192.168.174.130): Node didn't have enough resource: CPU, requested: 3000, used: 0, capacity: 1000

  3m    15s     13      {default-scheduler }            Warning FailedScheduling        pod (php-controller-47ufd) failed to fit in any node
fit failure on node (192.168.174.130): Node didn't have enough resource: CPU, requested: 3000, used: 0, capacity: 1000
fit failure on node (192.168.174.131): Node didn't have enough resource: CPU, requested: 3000, used: 0, capacity: 1000


  可以看到Events信息中,显示Pod调度到192.168.174.131这个Node上,发现CPU实际只有1000,但是申请3000,所以这个Node资源不足。接着调度到192.168.174.130这个Node上,发现也是资源不足。所以Pod无法Running,一直Pandding,一直在所有Node上循环检查,直到某个Node上资源足够。

 

2.全局默认配额

   除了可以直接在容器(或RC)的定义文件中指定的容器增加资源配额参数,我们还可以通过创建LimitRange对象来定义一个全局默认配额模版。这个默认配额模版会加载到集群中的每个Pod及容器上,这样就不用我们手工为每个Pod和容器重复设置了。

   LimitRange对象可以同时在Pod和Container两个级别上进行对资源配额的设置。当LimitRange创建生效后,之后创建的Pod都将使用LimitRange设置的资源配额进行约束。

   创建个pod-container-limitRnage.yaml文件

 

apiVersion: v1
kind: LimitRange
metadata:
  name: limit-range-test
spec:
  limits:
  - type: Pod
    max:
      cpu: 1
      memory: 1Gi
    min:
      cpu: 0.5
      memory: 216Mi
  - type: Container
    max:
      cpu: 1
      memory: 1Gi
    min:
      cpu: 0.5
      memory: 216Mi
    default:
      cpu: 0.5
      memory: 512Mi

 

 

上述设置表明:

  1)任意Pod内的所有容器的CPU使用都限制在0.5--1,内存使用限制在216Mi--1Gi

  2)任意容器的CPU使用都限制在0.5--1,默认0.5,内存使用限制在216Mi--1Gi,默认512Mi

  

[root@localhost k8s]# kubectl create -f pod-container-limitRange.yaml 
limitrange "limit-range-test" created
[root@localhost k8s]# kubectl get limitrange 
NAME               AGE
limit-range-test   12s
[root@localhost k8s]# kubectl describe limitrange limit-range-test 
Name:           limit-range-test
Namespace:      default
Type            Resource        Min     Max     Default Request Default Limit   Max Limit/Request Ratio
----            --------        ---     ---     --------------- -------------   -----------------------
Pod             memory          216Mi   1Gi     -               -               -
Pod             cpu             500m    1       -               -               -
Container       cpu             500m    1       500m            500m            -
Container       memory          216Mi   1Gi     512Mi           512Mi           -


[root@localhost k8s]# 


  写个Pod或RC,不指定resource,然后查看Pod信息,会看到cpu默认500m,memory=512Mi。

 

  此外,如果我们在Pod或RC定义文件中指定配额参数,则可遵循局部覆盖全局的原则。当然,如果配额超过了全局设定的最大值,那kubectl ceate的时候就会爆粗。在这就不一一演示了。

   LimitRange也是跟Namespace捆绑的,如果定义文件中没指定,则默认是default,kubectl describe limitrange limit-range-test 的时候,也会看到Namespace:default信息。
 

3.多租户配额管理

    多租户在Kubernetes中以Namespace来体现的,这里的多租户可以是多个用户、多个业务系统或者相互隔离的多种作业环境。一个集群中的资源总是有限的,当这个集群被多个租户的应用同时使用时,为了更好的使用这种有限的共有资源,我们需要将资源配额的管理单元提升到租户级别,只需要在不同组合对应的Namespace上加载对应的ResourceQuota配置即可达到目的。

   创建development Namespace

 

[root@localhost k8s]# cat namespace-dev.yaml 
apiVersion: v1
kind: Namespace
metadata:
   name: development
   labels:
     name: development

 

 

   上面创建了development Namespace,describe查看,会发现,它对资源配额没有任何限制。

 

[root@localhost k8s]# kubectl describe namespace development 
Name:   development
Labels: name=development
Status: Active

No resource quota.

No resource limits.

 

 

    现有2台Node服务器,总共cpu 2,memory 2Gi,给development namespce配额cpu 1,memory 1Gi。
    创建dev-resourcequota.yaml,不但可以对CPU,memory做限制,还可以对pods/services/replicationcontrollers/resourcequotas/secrets/configmaps/persistentvolumeclaims/services.nodeports/services.loadbalancers/requests.cpu/requests.memory/limits.cpu/limits.memory/cpu/memory/storage等资源做出限制.注意定义文件中namespace不能漏掉,否则默认是default(文件中如果没指明namespace,则kubectl create -f xxFile --namespace=development也行)

 

apiVersion: v1
kind: ResourceQuota
metadata:
   name: quota-development
   namespace: development
spec:
  hard:
    cpu: 1
    memory: 1Gi
    persistentvolumeclaims: 10
    pods: 50
    replicationcontrollers: 20
    resourcequotas: 1
    secrets: 20
    services: 20

 

 

[root@localhost k8s]# kubectl create -f dev-resourcequota.yaml 
resourcequota "quota-development" created

 

[root@localhost k8s]# kubectl get resourcequotas --namespace=development
NAME                AGE
quota-development   1m


查看使用情况

 

[root@localhost k8s]# kubectl describe resourcequota quota-development --namespace=development
Name:                   quota-development
Namespace:              development
Resource                Used    Hard
--------                ----    ----
cpu                     0       1
memory                  0       1Gi
persistentvolumeclaims  0       10
pods                    0       50
replicationcontrollers  0       20
resourcequotas          1       1
secrets                 0       20
services                0       20


还可查看这时namespace的信息

 

 

[root@localhost k8s]# kubectl describe namespace development 
Name:   development
Labels: name=development
Status: Active

Resource Quotas
 Name:                  quota-development
 Resource               Used    Hard
 --------               ---     ---
 cpu                    0       1
 memory                 0       1Gi
 persistentvolumeclaims 0       10
 pods                   0       50
 replicationcontrollers 0       20
 resourcequotas         1       1
 secrets                0       20
 services               0       20

No resource limits.


看到Resource Quoata已经做出了限制,至于resource limit,只要按照上面的全局默认配额操作就行了(定义文件中要指明namespace,文件中如果没指明namespace,则kubectl create -f xxFile --namespace=development也行)

 

Resource limits限制的是Pod和container的cpu/memory,而resource quota是对namespace的限制,也就是说所有的Pod/container的总额不能超过quota的限制。

 

  创建完ResourceQuota之后,对于所有需要创建的Pod都必须指定具体的资源配额设置,否则,创建Pod会失败。

 

apiVersion: v1
kind: Pod
metadata:
   name: php-test
   labels: 
     name: php-test
   namespace: development
spec:
  containers:
  - name: php-test
    image: 192.168.174.131:5000/php-base:1.0
    env:
    - name: ENV_TEST_1
      value: env_test_1
    - name: ENV_TEST_2
      value: env_test_2
    ports:
    - containerPort: 80
      hostPort: 80

 

[root@localhost k8s]# kubectl create -f php-pod.yaml 
Error from server: error when creating "php-pod.yaml": pods "php-test" is forbidden: Failed quota: quota-development: must specify cpu,limits.cpu,limits.memory,memory
[root@localhost k8s]# 

 

 

 

 

 1710  kubectl create namespace development
 1711  kubectl create -f dev-resourcequota.yaml
 1712  kubectl describe namespaces development
 1713  ll
 1714  vim pod-container-limitRnage.yaml
 1718  kubectl create -f pod-container-limitRange.yaml
 1719  ll
 1721  kubectl get limitrange
 1722  kubectl describe limitrange limit-range-dev
 1723  ll
 1724  vim  pod-container-limitRnage.yaml 
 1725  kubectl describe limitrange limit-range-dev -n development
 1726   kubectl describe namespace development


 


   

[RTT] RT-Thread Hard Fault 死机问题定位方法 RT-Thread操作系统中Hard Fault是比较常见的死机问题,造成这个问题的原因多种多样,但排查方式大同小异。本文以执行空函数死机和操作不可写内存死机两种情况为例,和大家分享下这类问题的排查定位方法。 阅读详情

相关推荐

关于RT-Thread中优先级翻转问题的简记

最近在学习RT-Thread的相关知识,记录一下心得。 优先级翻转 是指当一个高优先级线程试图通过信号量机制访问共享资源时,如果该信号量已被低优先级线程持有,而这个低优先级线程在运行过程中可能又被其他一些中等优先级的线程抢占,从而造成高优先级线程被许多具有较低优先级的线程阻塞,实时性得到难以保证。 一句话来讲:高优先级线程等待资源的过程中,被其他较低优先级的线程抢占了,造成了低优先级线程“抢占”高优先级线程的现象。 引入互斥量 互斥量能够防止线程优先级翻转,方式如下: 通过使用互斥量,低优先级的C会和

weixin_45590051的博客 1160

K8S集群中Node节点资源不足导致Pod无法运行的故障排查思路

1:针对不知道怎么面试,面试没有信心的小伙伴,我们会给你一个offer保障。2:我们会监督你15-20天内把面试体系技术点掌握至少7成,这样足够你去找到满意的工作了。3:我们是面向面试学习指导,不会带你们去写代码,会把项目真实开发的迭代过程和技术细节如何实现业务功能都详细教清楚,你能在面试中流畅表达清楚就行了,项目经验你不用担心(技术老师提供的真实项目经验肯定拿的出手),自己学和别人带着系统学,效率完全不一样。详情请点击这里offer突击训练营,给你一个offer的保障,求职跳槽的看过来!

IT枫斗者的博客 3709

加入c++11中的thread后socket出现的问题

突然觉得写博客是个好习惯 踩过的坑都不能忘了。。 1.首先 C++创建多线程的几种方式: C++多线程之_beginthread https://blog.youkuaiyun.com/u013043408/article/details/83830181 C++多线程之CreateThread https://blog.youkuaiyun.com/u013043408/article/details/83830598...

qq_24972693的博客 1032

部署Pod非Running状态,describe查看显示node资源不足

一、node 节点资源不足的几种情况: 1、执行kubectl top node 查看是否真的资源不足。 2、报资源不足有多种情况: 第一种是真的资源不足,第二种可能是Node上没有打Pod的yaml中定义的nodeSelector: 标签所以导致Pod找不到合适的Node就报此错误。 第二种node上是否无Pod Yaml中nodeSelector: 所需标签的确认法: 2.1、对Pod或者Pod的rc执行 kubectl get pod -n $namespace $Pod名 -o ya

大数据 1658

优快云第一期总结之三:Thread的问题

C#是一门支持多线程的语言,因此线程的使用也是比较常见的。由于线程的知识在Win32编程的时候已经说得过多,所以在.Net中很少介绍这部分(可能.Net不觉得这部分是它所特有的)。 那么线程相关的问题大致有如下四类(这篇文章只讨论单线程、单线程与UI线程这两方面的问题)。问题一,线程的基本操作,例如:暂停、继续、停止等;问题二,如何向线程传递参数或者从中得到其返回值;问题三,如

愚翁专栏 4万+

Thread和Runnable分别实现售票系统,以及出现的问题

Thread和Runnable分别实现售票系统 继承Thread类 package com.yuecheng.hspedu.Runnable00; //使用多线程,模拟三个窗口同时售票 public class Runnable06 { public static void main(String[] args) { conductor1 conductor1 = new conductor1(); conductor1 conductor2 = new condu

weixin_50659410的博客 338

K8S:Node didn‘t have enough resource: pods, requested: 1, used: 110, capacity: 110 报错解决

表示该节点最多只能运行 110 个 Pod。当 Pod 数量达到 110 时,就会触发。节点上的 Pod 数量已达到上限。限制了 Pod 数量,即默认最多 110 个。生成的 Job 创建的,时间戳代表执行时间。如果现有节点资源已经饱和,可以添加新节点。文件中的 kubelet 参数,增加。这样可以通过扩展集群来支持更多 Pod。或新节点,可以清理不必要的 Pod。:如果你的节点 CPU 和内存足够,修改为合适的值,例如。,以支持更多 Pod。

x² 919

【未解决的问题】STM32F103移植rt-thread nano版本出现的问题。

技术小白白最近心血来潮研究了一下rt-thread,即嵌入式实时操作系统,于是我去官网下载Nano版本(极简版本)压缩包,按照网上的方法手动移植到我的STM32F103C8T6板子上(移植后结构如下图),进行了一个点灯操作,但是编译时发现报错。意思是头文件rtthread.h中的va_list没有被定义。

lzhlzh111的博客 1454

【K8S】Rancher的安装&使用Rancher搭建K8S集群&Rancher的使用

Rancher的安装&使用Rancher搭建K8S集群&Rancher的使用

zhilianxian2212的博客 1万+

electron-builder打包导致的worker_thread子进程无法执行的问题

https://juejin.im/post/5d4387c86fb9a06b2c32708b https://www.electron.build/configuration/configuration.html#overridable-per-platform-options https://www.electron.build/configuration/contents#extrares...

白起的博客 3605

Ozone 调试 RT-Thread 死机问题的实战技巧

本文详细介绍了使用Ozone调试RT-Thread死机问题的实战技巧,包括核心思路、环境搭建、死机现场分析方法论以及RT-Thread特定问题排查。通过Ozone的Attach功能,开发者可以高效定位死机原因,无需复位芯片,支持事后调试,并提供了寄存器监控、内存检查等实用方法。文章还涵盖了高级调试技巧和典型问题解决方案,帮助开发者快速解决RT-Thread死机问题。

w7x8y9z的博客 195

C++11 - thread多线程编程,线程互斥和同步通信,死锁问题分析解决

c++11 thread线程库使用,线程互斥,互斥锁,死锁问题分析定位

大秦坑王的专栏 2万+

解决电脑蓝屏问题:SYSTEM_THREAD_EXCEPTION_NOT_HANDLED,回到系统还原点

解决电脑蓝屏问题:SYSTEM_THREAD_EXCEPTION_NOT_HANDLED

qq_21952195的博客 1万+

Java Thread问题汇总

如果是非线程安全,多个线程对统一个对象中的实例变量进行并发的访问时发生。产生的后果就是出现脏读。 非线程安全问题存在与实例变量中。如果是方法内部的私有变量,则不存在非线程安全问题。因为方法内部的变量是私有的。 线程的start和run方法的区别? public static void main(String[] args) { Thread t = new Thread(){ ...

清风博客 952

Thread Dump分析Oracle SOA的JDBC连接池资源抢夺问题

问题描述   有一个很特殊的case,使用Agile PLM 9.3产品每隔2~3天,用户无法登录,而已经登录的用户无法继续执行任何操作,用户界面hang住。检查opmn日志,没有有用的信息,错误太杂乱不明确。检查Oracle Database,CPU, Memory,连接都没有任何问题。重新启动SOA,问题临时不会出现,但2~3天后,问题继续。     Oracle环境 Midd

ZigzagSoft.net 1601

【ARMv8M Cortex-M33 系列 7 -- RA4M2 移植 RT-Thread 问题总结】

由于没有打印信息也不知道是什么原因导致 hardfault, 此外由于很久没有调试Cortex-M系列的core了,也不知道去查看哪些寄存器来分析错误原因?经过几天的调试,成功将rt-thead 移植到 RA4M2(Cortex-M33 核)上,thread 和 shell 命令已经都成功支持。

CodingCos的博客 1284

RT-Thread studio i2c 驱动TCA62724(RGBLED驱动)芯片问题记录

RT-Thread studio i2c 驱动TCA62724(RGBLED驱动)芯片问题记录 配置完i2c后根据芯片手册可成功亮灯,但是每次的写入读出时间要很长(3-5s),后来发现是i2c的延时问题,官方给定的是1us的延时,这里需要根据自己的芯片改动 stm32f427vi delay_us =100,亲测可用 这款芯片网上资料较少,根据手册可以写,下面是驱动代码 struct rt_i2c_msg msg; rt_uint8_t readbuf[2]; rt_uint8_t yellow_bu

weixin_45786595的博客 1044

银河麒麟V10离线安装VLC播放器:依赖处理与3.0.9.2版本实操指南

在国产化操作系统日益普及的背景下,软件安装方式成为政企内网用户关注的重点。离线安装作为一种不依赖公网源的部署手段,常用于解决内网环境下的软件获取问题。其核心在于理解Linux包管理机制,如dpkg与apt对依赖关系的处理逻辑。掌握这一原理,不仅能应对多媒体软件的部署,也能提升系统维护效率。VLC作为跨平台多媒体播放器,凭借强大的解码能力与协议支持,广泛应用于本地视频播放、RTSP拉流及监控大屏等场景。本文从离线安装的通用概念出发,结合银河麒麟V10桌面版的实际环境,详细梳理了VLC 3.0.9.2离线包的获

weixin_32247165的博客 375
上一篇: Docker中的Cgroup Driver:Cgroupfs 与 Systemd
下一篇: k8s-configmap
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值