kubernetes获取绝对资源单位

ybzsozfc  于 2022-11-02  发布在  Kubernetes
关注(0)|答案(2)|浏览(155)

K8的资源限制是否可以用 * 绝对单位 * 来表示?默认情况下,我们会得到一个人类可读的单位(如Mi,Gi,内存)和m表示CPU:

$ kubectl get pod ndbmysqld-1 -o yaml | grep -A 6 " resources:" | grep "limits:" -A 2
      limits:
        cpu: 500m
        memory: 512Mi
--
      limits:
        cpu: 100m
        memory: 256Mi

但我的Pod有所有不同的单位,看到这一个:

limits:
        cpu: "1"
        memory: 214748364800m

注:214748364800米显然是200米...
有没有办法让所有单位对齐?
谢谢你!

eqqqjvef

eqqqjvef1#

  • 对于CPU,允许部分请求。信息如下
    您可以将memory**表示为*纯整数或定点数
    CPU的含义

CPU资源的限制和请求以CPU单位衡量。一个CPU(以Kubernetes为单位)相当于云提供商的1个vCPU/Core和裸机英特尔处理器上的1个超线程。
允许分数请求。一个容器的spec.containers[].resources.requests.cpu为0. 5时,其CPU保证为请求1 CPU的容器的一半。表达式0. 1等价于表达式100 m,可以读作“一百毫”。有些人说“一百毫”,这被理解为同一个意思。一个带有小数点的请求,如0.1,被API转换为100 m,不允许精度小于1 m。因此,100 m的形式可能是首选。
CPU总是作为绝对量而不是相对量来请求; 0.1是单核、双核或48核计算机上相同数量的CPU。
“记忆的意义"
内存的限制和要求是以字节为单位。您可以将memory表示为一般整数,或使用下列其中一个尾码来表示为定点数:E、P、T、G、M、K。您也可以使用相等的2次方:Ei、Pi、Ti、Gi、Mi、Ki。例如,以下表示大致相同的值:

128974848, 129e6, 129M, 123Mi
gpfsuwkq

gpfsuwkq2#

有两种方法:使用numfmt。你可以用它来重新格式化数值列,如果你从kubectl中取出tsv数据,这真的很方便。这是我推荐的。

kubectl get pods -o json |jq -r '.items[]|.metadata as $m|.spec.containers[].resources[]|[$m.name, .memory]|@tsv' \
|numfmt --field=2 --from=auto

或者,您可以在普通的jq中近似它(如果您没有numfmt,或者您需要在jq中使用它以获得不同格式的输出):

kubectl get pods -o json \
|jq -r 'def units: .|capture("(?<n>[0-9]+)(?<u>[A-Za-z]?)")|. as $v|($v.n|tonumber)*(if $v.u=="" then 1 else pow(10;3*("m_KMGTPE"|index($v.u)-1)) end); 
.items[].spec.containers[].resources[].memory|units'

突出显示我在其中定义的函数:

def units: 
 .|capture("(?<n>[0-9]+)(?<u>[A-Za-z]?)")
  |. as $v
  |($v.n|tonumber)*(
    if $v.u=="" then 1 
    else pow(10;3*("m_KMGTPE"|index($v.u)-1)) 
    end)

它的作用是捕获数字部分和后缀的第一个字符为'n'和'u',然后返回'n'乘以10^3*(“m_KMGTPE”中后缀的索引减1)。例如,对于'm',索引为0,因此它乘以10^-3,对于1,索引为2,因此它乘以10^3,依此类推。

相关问题