目录

1、创建一个pod的工作流程:

2、Pod中影响调度的主要属性

调度图

资源限制:

写资源限制需要注意的问题:


1、创建一个pod的工作流程:


    Kubernetes基于list-watch机制的控制器架构,实现组件间交互的解耦。 其他组件监控自己负责的资源,当这些资源发生变化时,kubeapiserver会通知这些组件,这个过程类似于发布与订阅。


流程图




kubernetes pod名 生成逻辑 kubernetes 创建pod_Pod


当用户用kubectl创建容器时,是kubectl向apiserver发送一个创建pod的请求,


apiserver会将数据放入etcd存储。scheduler收到未绑定pod资源,通过自身调度算法选择一个合适的node进行绑定,然后响应给apiserver。


kubelet收到分配到自己节点上pod,调用docker api创建容器,然后将容器状态响应给apiserver



controller-manager是负责控制deployment的,而上面例子是直接创建pod,所以不涉及这个组件


2、Pod中影响调度的主要属性



kubernetes pod名 生成逻辑 kubernetes 创建pod_运维开发_02


调度图



kubernetes pod名 生成逻辑 kubernetes 创建pod_kubernetes_03


资源限制:


在默认不加资源限制的前提下,一个pod可以使用宿主机的全部资源,这也意味着,当某个pod有一段时间所需资源飙升时,可能会拖垮宿主机,就此情况,k8s在cpu与内存方面对pod做了可限制



kubernetes pod名 生成逻辑 kubernetes 创建pod_容器_04


容器资源限制(CPU单位:可以写m也可以写浮点数,例如0.5=500m,1=1000m): 


• resources.limits.cpu 


• resources.limits.memory 


容器使用的最小资源需求,作为容器调度时资 源分配的依据: 


• resources.requests.cpu 


• resources.requests.memory



例如以下yaml,即是给一个nginx设置了最大1cpu1Gi最小0.7cpu700Mi,在一般设置中,最小在哪用资源应该是最大占用资源的百分之七十即可

apiVersion: v1
   
kind: Pod
   
metadata:
   
  creationTimestamp: null
   
  labels:
   
    run: pod2
   
  name: pod-limits
   
spec:
   
  containers:
   
  - image: nginx
   
    name: web
   
    resources:
   
      limits:
   
        cpu: 1
   
        memory: 1Gi
   
      requests:
   
        cpu: 0.7
   
        memory: 700Mi


写资源限制需要注意的问题:


      当你写的最大资源使用量大于你宿主机实际资源大小的时候。依旧可以创建成功,但限制无效,没有意义。即limits建议不能超出宿主机配置,否则没意义了,至少要低于宿主机配置的20%


     requests必须小于或等于limits,否则不可被创建成功



       k8s会根据requests的值去查找能满足该值的node进行调度,如果不满足,pod处于未分配创建。即当你最小资源限制大于现有各节点的资源,则pod会处于pending状态,pod无法被分配运行



       requests决定了一个节点分配的pod数量,所以不要设置太大,否则会造成node资源浪费,即跑的pod少,实际负载很低