k8s—pod进阶(资源限制,健康检查)

时人不识凌云木,直待凌云始道高。这篇文章主要讲述k8s—pod进阶(资源限制,健康检查)相关的知识,希望能为你提供帮助。
一、资源限制

  1. ??当定义 Pod 时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是 CPU 和内存大小,以及其他类型的资源??
  2. ??当为 Pod 中的容器指定了 request 资源时,调度器就使用该信息来决定将 Pod 调度到哪个节点上。当还为容器指定了 limit 资源时,kubelet 就会确保运行的容器不会使用超出所设的 limit 资源量。kubelet 还会为容器预留所设的 request 资源量, 供该容器使用??
  3. ??如果 Pod 运行所在的节点具有足够的可用资源,容器可以使用超出所设置的 request 资源量。不过,容器不可以使用超出所设置的 limit 资源量??
  4. ??如果给容器设置了内存的 limit 值,但未设置内存的 request 值,Kubernetes 会自动为其设置与内存 limit 相匹配的 request 值。类似的,如果给容器设置了 CPU 的 limit 值但未设置 CPU 的 request 值,则 Kubernetes 自动为其设置 CPU 的 request 值 并使之与 CPU 的 limit 值匹配??
??官网示例:????https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/???
??request??
  • ??容器使用的最小资源需求, 作为容器调度时资源分配的判断依赖。??
  • ??只有当前节点上可分配的资源量 > = request 时才允许将容器调度到该节点。??
  • ??request参数不限制容器的最大可使用资源??
??limit??
  • ??容器能使用资源的最大值??
  • ??设置为0表示对使用的资源不做限制, 可无限的使用??


??request 和 limit 关系??
??request能保证pod有足够的资源来运行, 而limit则是防止某个pod无限制的使用资源, 导致其他pod崩溃. 两者的关系必须满足:0 < = request < = limit??


??如果limit=0表示不对资源进行限制, 这时可以小于request。??
??目前CPU支持设置request和limit,memory只支持设置request, limit必须强制等于request, 这样确保容器不会因为内存的使用量超过request但是没有超过limit的情况下被意外kill掉。??
1、Pod 和 容器的资源请求和限制
spec.containers[].resources. requests.cpu#定义创建容器时预分配的CPU资源
spec.containers[].resources.requests.memory#定义创建容器时预分配的内存资源
spec.containers[].resources.limits.cpu#定义 cpu 的资源上限
spec.containers[].resources.limits.memory#定义内存的资源上限

2、CPU资源单位
??CPU 资源的 request 和 limit 以??? cpu 为单位???。Kubernetes 中的一个 cpu 相当于1个 vCPU(1个超线程)??
【k8s—pod进阶(资源限制,健康检查)】??Kubernetes 也支持带小数 CPU 的请求。spec.containers[].resources.requests.cpu 为 0.5 的容器能够获得一个 cpu 的一半 CPU 资源(类似于Cgroup对CPU资源的时间分片)表达式 0.1 等价于表达式 100m(毫核),表示每 1000 毫秒内容器可以使用的 CPU 时间总量为 0.1*1000 毫秒??
3、内存资源单位
??内存的 request 和 limit 以???字节为单位???。可以以整数表示,或者以10为底数的指数的单位(E、P、T、G、M、K)来表示, 或者以2为底数的指数的单位(Ei、Pi、Ti、Gi、Mi、Ki)来表示??
??如:1KB=10^3=1000,1MB=10^6=1000000=1000KB,1GB=10^9=1000000000=1000MB??
??   1KiB=2^10=1024,1MiB=2^20=1048576=1024KiB??
4、示例
1.示例1
apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- name: app
image: images.my-company.example/app:v4
env:
- name: mysql_ROOT_PASSWORD
value: "password"
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
- name: log-aggregator
image: images.my-company.example/log-aggregator:v6
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"

??此例子中的 Pod 有两个容器。每个容器的 request 值为 0.25 cpu 和 64MiB 内存,每个容器的 limit 值为 0.5 cpu 和 128MiB 内存。那么可以认为该 Pod 的总的资源 request 为 0.5 cpu 和 128 MiB 内存,总的资源 limit 为 1 cpu 和 256MiB 内存??
2.示例2
vim pod2.yaml
apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- name: web
image: nginx
env:
- name: WEB_ROOT_PASSWORD
value: "password"
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
- name: wp
image: wordpress
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"


kubectl apply -f pod2.yaml
kubectl describe pod frontend

kubectl get pods -o wide
NAMEREADYSTATUSRESTARTSAGEIPNODENOMINATED NODEREADINESS GATES
frontend2/2Running515m10.244.2.4node02< none> < none>

kubectl describe nodes node02#由于当前虚拟机有2个CPU,所以Pod的CPU Limits一共占用了50%
NamespaceNameCPU RequestsCPU LimitsMemory RequestsMemory LimitsAGE
------------------------------------------------------------------
defaultfrontend500m (25%)1 (50%)128Mi (3%)256Mi (6%)16m
kube-systemkube-flannel-ds-amd64-f4pbp100m (5%)100m (5%)50Mi (1%)50Mi (1%)19h
kube-systemkube-proxy-pj4wp0 (0%)0 (0%)0 (0%)0 (0%)19h
Allocated resources:
(Total limits may be over 100 percent, i.e., overcommitted.)
ResourceRequestsLimits
----------------------
cpu600m (30%)1100m (55%)
memory178Mi (

    推荐阅读