精华内容
下载资源
问答
  • Kubernetes Pod

    2018-02-23 13:38:05
    Kubernetes PodPod是一个Kubernetes抽象,表示一组一个或多个应用程序容器(如Docker或rkt)以及这些容器的一些共享资源。这些资源包括:共享存储,作为卷网络,作为唯一的集群IP地址有关如何运行每个容器的信息,...

    Kubernetes Pod

    Pod是一个Kubernetes抽象,表示一组一个或多个应用程序容器(如Docker或rkt)以及这些容器的一些共享资源。这些资源包括:

    • 共享存储,作为卷
    • 网络,作为唯一的集群IP地址
    • 有关如何运行每个容器的信息,例如容器映像版本或要使用的特定端

    Pod用于模拟特定于应用程序的“逻辑主机”,并可以包含相对紧密耦合的不同应用程序容器。例如,一个Pod可能包含带有Node.js应用程序的容器,也包含一个不同的容器,用于提供由Node.js Web服务器发布的数据。Pod中的容器共享一个IP地址和端口空间,总是共址和共同调度,并在同一个节点上的共享上下文中运行。

    Pod是Kubernetes平台上的最小单元。当我们在Kubernetes上创建一个部署时,这个部署创建了带有容器的Pod(而不是直接创建容器)。每个Pod与其调度的节点绑定,并保持到终止(根据重新启动策略)或删除。如果发生节点故障,则在群集中的其它可用节点上调度相同的pod

    节点

    Pod总是在节点上运行。节点是Kubernetes中的工作器,可能是虚拟机或物理机,具体取决于群集。每个节点由主管理。一个节点可以有多个容器,而Kubernetes主站自动处理在集群中节点上的容器的调度。主站的自动调度考虑到每​​个节点上的可用资源。

    每个Kubernetes节点至少运行:

    • Kubelet,负责Kubernetes Master和Node之间的通信的过程; 它管理在机器上运行的Pod和容器。

    • 容器runtime,(如docker,rkt),负责从注册表中拉取镜像,解包容器并运行应用程序。

      Kubernetes服务概述

      Kubernetes 是凡人。豆荚实际上有一个生命周期。当工作者节点死亡时,运行在节点上的Pod也丢失。然后,ReplicationController可能会通过创建新的Pod来动态地将群集驱动回所需的状态,以保持应用程序的运行。作为另一个例子,考虑具有3个副本的图像处理后端。那些副本是可以替换的。前端系统不应该关心后端副本,或者即使Pod丢失并重新创建。也就是说,Kubernetes集群中的每个Pod都具有唯一的IP地址,即使是同一个节点上的Pod也是如此,因此需要一种自动协调Pod之间的更改的方法,以便您的应用程序继续运行。

      Kubernetes中的服务是一个抽象,它定义了Pod的逻辑集合以及访问它们的策略。服务启用依赖Pod之间的松散耦合。使用YAML (首选)或JSON 定义服务,就像所有Kubernetes对象一样。服务所针对的Pod集通常由LabelSelector来确定(请参阅下面为什么您可能需要Service而不包含selector在规范中)。

      虽然每个Pod都有一个唯一的IP地址,但是这些IP不会在没有服务的情况下暴露在群集之外。服务允许您的应用程序接收流量。通过type在ServiceSpec中指定一个服务可以以不同的方式暴露:

      • ClusterIP(默认) - 将服务公开在群集中的内部IP上。这种类型使服务只能从群集内访问。
      • NodePort - 使用NAT在集群中每个选定节点的同一端口上公开服务。使群集外部的服务可以使用:。ClusterIP的超集。
      • LoadBalancer - 在当前云中创建一个外部负载均衡器(如果支持),并为服务分配一个固定的外部IP。NodePort的Superset。
      • ExternalName - 使用任意名称(externalName在规范中指定)通过返回具有名称的CNAME记录公开该服务。没有使用代理。此类型需要v1.7或更高版本kube-dns

      服务和标签

      服务通过一组Pod来路由流量。服务是允许吊舱在Kubernetes中死亡和复制而不影响应用程序的抽象。在相关的Pod(例如应用程序中的前端和后端组件)之间的发现和路由由Kubernetes Services处理。

      服务使用标签和选择器来匹配一组Pod,这是一个允许对Kubernetes中的对象进行逻辑操作的分组原语。标签是连接到对象的键/值对,可用于多种方式:

      • 指定用于开发,测试和生产的对象
      • 嵌入版本标签
      • 使用标签分类对象 标签可以在创建时或之后附加到对象。可以随时修改。
    展开全文
  • Kubernetes pod调度及精准调度策略

    万次阅读 2020-07-14 12:58:26
    其中topologyKey字段的值可以为: kubernetes.io/hostname failure-domain.beta.kebernetes.io/zone failure-domain.beta.kubernetes.io/region 参照pod,下面的案例以此pod为参照: 名字为pod-flag,带有标签 ...

    deployment或rc自动调度:

    由master的Scheduler经过一系列的算法得出得分最高的节点。

    NodeSelector定向调度

    apiVersion: v1
    kind: ReplicationController 
    metadata:
      name: redis-master
      labels:	
        name: redis-master 
    spec:
      replicas: 1
      selector:
        name: redis-master
      template:
        metadata:
          labels:
            name: redis-master
        spec:
          containers:
          - name: master
            image: kubeguide/redis-master
            ports:
            - containerPort: 6379
          nodeSelector:				#定向到拥有标签zone=north的节点,可以指定多个标签
            zone: north
    
    

    NodeAffinity: node亲和性调度( pod与node之间的暧昧关系)

    apiVersion: v1
    kind: Pod
    metadata:
      name: with-node-affinity
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution: #必须满足以下的要求(和nodeselect很像)
            nodeSelectorTerms:  #如果有多个,那么有一个满足就可以被调度(面向多个node)
            - matchExpressions:   #如果有多个,则一个节点需要满足所有要求才能被调度(对单个node的所有要求)
              - key: beta.kubernetes.io/arch
                operator: In   #其他参数还有In、NotIn、Exists、DoesNotExist、Gt、Lt(其中NotIn、DoesNotExist可以实现排斥的功能)
                values:
                - amd64
          preferredDuringSchedulingIgnoredDuringExecution:  #优先选择以下的要求 不强求,多个规则可以设置权重
          - weight: 1
            preference:
              matchExpressions:
              - key: disk-type
                operator: In
                values:
                - ssd
      containers:
     - name: with-node-affinity
        image: gcr.io/google_containers/pause:2.0
    

    IgnoredDuringExecution的意思是:如果一个pod所在的节点在pod运行期间标签发生了变更,不再符合该pod的节点亲和性需求,则系统将忽略Node上label的变化,该pod能继续在该节点上运行。

    注意事项:

    • 如果nodeselect和NodeAffinity同时定义,那么必须两个条件同时得到满足,pod才会运行在指定的node上。
    • 如果NodeAffinity指定了多个nodeSelectorTerms,那么其中一个能够匹配成功即可。
    • 如果在nodeSelectorTerms中有多个matchExpressions,则一个节点必须满足所有matchExpressions才能运行该pod。

    PodAffinity:Pod亲和与互斥调度策略(pod与pod之间的暧昧关系)

    条件设置也是使用requiredDuringSchedulingIgnoredDuringExecution和preferredDuringSchedulingIgnoredDuringExecution

    • 判断亲和与互斥的依据是某个命名空间下的pod标签。
    • PodAffinity定义的位置是PodSpace的affinity字段下的podAffinity子字段中。Pod间的互斥性则被定义于同一层次的PodAntiAffinity子字段中。

    其中topologyKey字段的值可以为:
    kubernetes.io/hostname
    failure-domain.beta.kebernetes.io/zone
    failure-domain.beta.kubernetes.io/region

    参照pod,下面的案例以此pod为参照:
    名字为pod-flag,带有标签 security=S1、app=nginx

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-flag
      labels:
        security: "S1"
        app: "nginx"
    spec:
      containers:
      - name: nginx
        image: nginx
    

    亲和性调度案例:创建后,该pod就会和参照pod运行在同一个节点上。

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-affinity
    spec:
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:#亲和性
          - labelSelector:
              matchExpressions:	#如果有多个,需要所有条件全部满足,才能调度到某个node上
              - key: security	#与拥有标签security=S1的pod在同一个节点
                operator: In	#其他参数还有In、NotIn、Exists、DoesNotExist、Gt、Lt(其中NotIn、DoesNotExist可以实现排斥的功能)
                values:
                - S1
            #namespaces:	#指定亲和性对象是哪个namespace下的,如果不指定就是所有namespace下的。
            topologyKey: kubernetes.io/hostname	#对node的label选择
      containers:
      - name: with-pod-affinity
        image: gcr.io/google_containers/pause:2.0
    

    pod的互斥调度案例:创建之后的新Pod与security=S1的pod为同一个zone,但是不与app=nginx的pod为同一个Node。

    apiVersion: v1
    kind: Pod
    metadata:
      name: anti-affinity
    spec:
      affinity:
        podAffinity:	#亲和性
          requiredDuringSchedulingIgnoredDuringExecution:	#硬亲和性 。   也可以使用preferredDuringSchedulingIgnoredDuringExecution软亲和性,尽可能的和满足下面要求的pod调度到同一个节点。
          - labelSelector:
              matchExpressions:
              - key: security
                operator: In
                values:
                - S1
            topologyKey: failure-domain.beta.kubernetes.io/zone
        podAntiAffinity:	#反亲和性
          requiredDuringSchedulingIgnoredDuringExecution: #硬亲和性 。  也可以使用preferredDuringSchedulingIgnoredDuringExecution软亲和性,尽可能的和满足下面要求的pod调度到不同的节点。
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - nginx
            topologyKey: kubernetes.io/hostname
      containers:
     - name: anti-affinity
        image: gcr.io/google_containers/pause:2.0
    

    注意事项:

    • 如果要使用Namespace列表进行限制,Namespace定义的位置与labelSelector、topologyKey同级。
    • 省略Namespace的设置,表示使用affinity/anti-affinity的pod所在的Namespace。如果namespace的值为空,则表示所有namespace。
    • requiredDuringSchedulingIgnoredDuringExecution的matchExpressions全部满足之后,系统才能将pod调度到某个Node上。

    Taints(污点)和Tolerations(容忍)

    场景:独占节点、具有特殊硬件设备的节点(GPU 、SSD)
    污点可以让node拒绝pod的运行,与NodeAffinity相反。

    用法:对node设置污点,然后在pod文件里面配置容忍属性,让pod能够(不是必须)运行在有污点的节点上。

    对节点添加污点:

    $ kubectl taint nodes node1 key=value:NoSchedule
    

    Taint(污点)的键值分别为key、value,效果是:
    NoSchedule - 强制不调度
    PreferNoSchedule - 尽可能不调度

    • NoExecute生效的时候pod如果已经在污点节点上运行,则会被驱逐。
    • 可以对特殊的节点同时添加NoSchedule和PreferNoSchedule

    pod配置文件添加Tolerations(容忍):

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-toleration
    spec:
      tolerations:			#容忍设置
     - key: "key"		#key和effect需要和Taint(污点)的设置一致
        operator: "Equal"	#operator的值为Equal,则value需要和污点标签相等
        value: "value"	
        effect: "NoSchedule" #key和effect需要和Taint(污点)的设置一致
    #NoSchedule的取值还可以设置为PreferNoSchedule,尽可能的避免调度到污点的节点
      containers:
     - name: pod-toleration
        image: gcr.io/google_containers/pause:2.0
    

    容忍的第二种写法:

    tolerations:
     - key: "key"	         #key和effect需要和Taint(污点)的设置一致
      operator: "Exists"    #operator的值为Exists,则无需指定value
      effect: "NoSchedule"	 #key和effect需要和Taint(污点)的设置一致
    

    注意:

    • 空的key配合Exists操作符可以匹配所有的键和值
    • 空的effect匹配所有的effect

    一个node拥有多个污点的时候,k8s调度器会忽略pod配置中容忍的污点,其他不能容忍的就是最终的效果。

    Pod Priority Preemption: Pod优先级调度

    场景:节点因为负载过高导致节点上的pod驱逐(Eviction),那么pod就会抢占(preemption)资源不被驱逐。设置优先级会使优先级高的pod不被驱逐,只会驱逐优先级低的pod,来保全优先级高的pod。

    当节点资源紧张删除低优先级pod的时候,此节点会有一个污点"Taints: node.kubernetes.io/memory-pressure:NoSchedule",过5分钟后会自动删除污点(测试k8s版本v1.14.1)

    首先创建PriorityClass(优先级类别),且PriorityClass不属于任何namespace。

    apiVersion: scheduling.k8s.io/v1beta1
    kind: PriorityClass
    metadata:
      name: high-priority	#优先级类别的名字为high-priority
    value: 1000000		#优先级为1000000,数字越大,优先级越高,十亿以上的为系统保留。
    globalDefault: false
    description: "This priority class should be used for XYZ service pods only."
    

    pod配置文件引用优先级类别:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        env: test
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
      priorityClassName: high-priority	#引用优先级类别名字为high-priority
    

    DaemonSet:在每个Node上都调度一个Pod

    场景案例:

    • 每个node上都要运行一个Ceph存储进程
    • 每个node上都要运行一个日志采集程序,例如Logstach。
    • 每个node上都要运行一个性能监控程序,例如prometheus。

    pod案例:在每个节点都启动一个fluentd容器

    apiVersion: extensions/v1beta1
    kind: DaemonSet
    metadata:
      name: fluentd-cloud-logging
      namespace: kube-system
      labels:
        k8s-app: fluentd-cloud-logging
    spec:
      template:
        metadata:
          namespace: kube-system
          labels:
            k8s-app: fluentd-cloud-logging
        spec:
          containers:
          - name: fluentd-cloud-logging
            image: gcr.io/google_containers/fluentd-elasticsearch:1.17
            resources:
              limits:
                cpu: 100m
                memory: 200Mi
            env:
            - name: FLUENTD_ARGS
              value: -q
            volumeMounts:
            - name: varlog
              mountPath: /var/log
              readOnly: false
            - name: containers
              mountPath: /var/lib/docker/containers
              readOnly: false
          volumes:
          - name: containers
            hostPath:
              path: /var/lib/docker/containers
          - name: varlog
            hostPath:
              path: /var/log
    
    展开全文
  • Kubernetes Pod概述

    2018-08-24 09:21:47
    Kubernetes Pod概述 本文主要介绍Pod,了Kubernetes对象模型中可部署的最小对象。 了解Pod PodKubernetes创建或部署的最小/最简单的基本单位,一个Pod代表集群上正在运行的一个进程。 一个Pod封装一个应用...

    Kubernetes Pod概述

    本文主要介绍Pod,了Kubernetes对象模型中可部署的最小对象。

    了解Pod

    Pod是Kubernetes创建或部署的最小/最简单的基本单位,一个Pod代表集群上正在运行的一个进程。

    一个Pod封装一个应用容器(也可以有多个容器),存储资源、一个独立的网络IP以及管理控制容器运行方式的策略选项。Pod代表部署的一个单位:Kubernetes中单个应用的实例,它可能由单个容器或多个容器共享组成的资源。


    Docker是Kubernetes Pod中最常见的runtime ,Pods也支持其他容器runtimes。


    Kubernetes中的Pod使用可分两种主要方式:

    • Pod中运行一个容器。“one-container-per-Pod”模式是Kubernetes最常见的用法;
      在这种情况下,你可以将Pod视为单个封装的容器,但是Kubernetes是直接管理Pod而不是容器。
    • Pods中运行多个需要一起工作的容器。Pod可以封装紧密耦合的应用,它们需要由多个容器组成,它们之间能够共享资源,这些容器可以形成一个单一的内部service单位→一个容器共享文件,另一个“sidecar”容器来更新这些文件。Pod将这些容器的存储资源作为一个实体来管理。

    关于Pod用法其他信息请参考:

    • The Distributed System Toolkit: Patterns for Composite Containers
    • Container Design Patterns

    每个Pod都是运行应用的单个实例,如果需要水平扩展应用(例如,运行多个实例),则应该使用多个Pods,每个实例一个Pod。在Kubernetes中,这样通常称为Replication。Replication的Pod通常由Controller创建和管理。更多信息,请参考Pods和控制器。

    Pods如何管理多个容器

    Pods的设计可用于支持多进程的协同工作(作为容器),形成一个cohesive的Service单位。Pod中的容器在集群中Node上被自动分配,容器之间可以共享资源、网络和相互依赖关系,并同时被调度使用。

    请注意,在单个Pod中共同管理多个容器是一个相对高级的用法,应该只有在容器紧密耦合的特殊实例中使用此模式。例如,有一个容器被用作WEB服务器,用于共享volume,以及一个单独“sidecar”容器需要从远程获取资源来更新这些文件,如下图所示:
    这里写图片描述

    Pods提供两种共享资源:网络 and 存储。

    网络

    每个Pod被分配一个独立的IP地址,Pod中的每个容器共享网络命名空间,包括IP地址和网络端口。Pod内的容器可以使用localhost相互通信。当Pod中的容器与Pod 外部通信时,他们必须协调如何使用共享网络资源(如端口)。

    存储

    Pod可以指定一组共享存储volumes。Pod中的所有容器都可以访问共享volumes,允许这些容器共享数据。volumes 还用于Pod中的数据持久化,以防其中一个容器需要重新启动而丢失数据。有关Kubernetes如何在Pod中实现共享存储的更多信息,请参考Volumes。

    使用Pod

    你很少会直接在kubernetes中创建单个Pod。因为Pod的生命周期是短暂的,用后即焚的实体。当Pod被创建后(不论是由你直接创建还是被其他Controller),都会被Kuberentes调度到集群的Node上。直到Pod的进程终止、被删掉、因为缺少资源而被驱逐、或者Node故障之前这个Pod都会一直保持在那个Node上。

    注意:重启Pod中的容器跟重启Pod不是一回事。Pod只提供容器的运行环境并保持容器的运行状态,重启容器不会造成Pod重启。
    Pod不会自愈。如果Pod运行的Node故障,或者是调度器本身故障,这个Pod就会被删除。同样的,如果Pod所在Node缺少资源或者Pod处于维护状态,Pod也会被驱逐。Kubernetes使用更高级的称为Controller的抽象层,来管理Pod实例。虽然可以直接使用Pod,但是在Kubernetes中通常是使用Controller来管理Pod的。

    Pod和Controller

    Controller可以创建和管理多个Pod,提供副本管理、滚动升级和集群级别的自愈能力。例如,如果一个Node故障,Controller就能自动将该节点上的Pod调度到其他健康的Node上。

    包含一个或者多个Pod的Controller示例:

    Deployment
    StatefulSet
    DaemonSet
    通常,Controller会用你提供的Pod Template来创建相应的Pod。

    Pod模板

    Pod模板是包含了其他对象(如Replication Controllers,Jobs和 DaemonSets)中的pod定义 。Controllers控制器使用Pod模板来创建实际需要的pod。

    pod模板类似cookie cutters。“一旦饼干被切掉,饼干和刀将没有关系”。随后对模板的后续更改甚至切换到新模板对已创建的pod并没有任何的影响。

    展开全文
  • Kubernetes Pod 驱逐详解

    千次阅读 2019-08-09 17:22:18
    原文链接:Kubernetes Pod 驱逐详解 在 Kubernetes 中,Pod 使用的资源最重要的是 CPU、内存和磁盘 IO,这些资源可以被分为可压缩资源(CPU)和不可压缩资源(内存,磁盘 IO)。可压缩资源不可能导致 Pod 被驱逐...
     

    原文链接:Kubernetes Pod 驱逐详解

    在 Kubernetes 中,Pod 使用的资源最重要的是 CPU、内存和磁盘 IO,这些资源可以被分为可压缩资源(CPU)和不可压缩资源(内存,磁盘 IO)。可压缩资源不可能导致 Pod 被驱逐,因为当 Pod 的 CPU 使用量很多时,系统可以通过重新分配权重来限制 Pod 的 CPU 使用。而对于不可压缩资源来说,如果资源不足,也就无法继续申请资源(内存用完就是用完了),此时 Kubernetes 会从该节点上驱逐一定数量的 Pod,以保证该节点上有充足的资源。

    当不可压缩资源不足时,Kubernetes 是通过 kubelet 来驱逐 Pod 的。kubelet 也不是随机驱逐的,它有自己的一套驱逐机制,每个计算节点的 kubelet 都会通过抓取 cAdvisor 的指标来监控节点的资源使用量,下面我们来具体分析每种情况。

    1. 存储资源不足

    下面是 kubelet 默认的关于节点存储的驱逐触发条件:

    • nodefs.available<10%(容器 volume 使用的文件系统的可用空间,包括文件系统剩余大小和 inode 数量)
    • imagefs.available<15%(容器镜像使用的文件系统的可用空间,包括文件系统剩余大小和 inode 数量)

    imagefs 使用量达到阈值时,kubelet 会尝试删除不使用的镜像来清理磁盘空间。

    nodefs 使用量达到阈值时,kubelet 就会拒绝在该节点上运行新 Pod,并向 API Server 注册一个 DiskPressure condition。然后 kubelet 会尝试删除死亡的 Pod 和容器来回收磁盘空间,如果此时 nodefs 使用量仍然没有低于阈值,kubelet 就会开始驱逐 Pod。从 Kubernetes 1.9 开始,kubelet 驱逐 Pod 的过程中不会参考 Pod 的 QoS,只是根据 Pod 的 nodefs 使用量来进行排名,并选取使用量最多的 Pod 进行驱逐。所以即使 QoS 等级为 Guaranteed 的 Pod 在这个阶段也有可能被驱逐(例如 nodefs 使用量最大)。如果驱逐的是 Daemonset,kubelet 会阻止该 Pod 重启,直到 nodefs 使用量超过阈值。

    如果一个 Pod 中有多个容器,kubelet 会根据 Pod 中所有容器的 nodefs 使用量之和来进行排名。即所有容器的 container_fs_usage_bytes 指标值之和。

    举个栗子,假设某计算节点上运行着一系列已知 QoS 等级和 nodefs 使用量的 Pod:

    Pod Name Pod QoS nodefs usage
    A Best Effort 800M
    B Guaranteed 1.3G
    C Burstable 1.2G
    D Burstable 700M
    E Best Effort 500M
    F Guaranteed 1G

    当 nodefs 的使用量超过阈值时,kubelet 会根据 Pod 的 nodefs 使用量来对 Pod 进行排名,首先驱逐使用量最多的 Pod。排名如下图所示:

    Pod Name Pod QoS nodefs usage
    B Guaranteed 1.3G
    C Burstable 1.2G
    F Guaranteed 1G
    A Best Effort 800M
    D Burstable 700M
    E Best Effort 500M

    可以看到在本例中,QoS 等级为 Guaranteed 的 Pod 最先被驱逐。

    2. 内存资源不足

    下面是 kubelet 默认的关于节点内存资源的驱逐触发条件:

    • memory.available<100Mi

    当内存使用量超过阈值时,kubelet 就会向 API Server 注册一个 MemoryPressure condition,此时 kubelet 不会接受新的 QoS 等级为 Best Effort 的 Pod 在该节点上运行,并按照以下顺序来驱逐 Pod:

    • Pod 的内存使用量是否超过了 request 指定的值
    • 根据 priority 排序,优先级低的 Pod 最先被驱逐
    • 比较它们的内存使用量与 request 指定的值之差。

    按照这个顺序,可以确保 QoS 等级为 Guaranteed 的 Pod 不会在 QoS 等级为 Best Effort 的 Pod 之前被驱逐,但不能保证它不会在 QoS 等级为 Burstable 的 Pod 之前被驱逐。

    如果一个 Pod 中有多个容器,kubelet 会根据 Pod 中所有容器相对于 request 的内存使用量与之和来进行排名。即所有容器的 (container_memory_usage_bytes 指标值与 container_resource_requests_memory_bytes 指标值的差)之和。

    继续举例,假设某计算节点上运行着一系列已知 QoS 等级和内存使用量的 Pod:

    Pod Name Pod QoS Memory requested Memory limits Memory usage
    A Best Effort 0 0 700M
    B Guaranteed 2Gi 2Gi 1.9G
    C Burstable 1Gi 2Gi 1.8G
    D Burstable 1Gi 2Gi 800M
    E Best Effort 0 0 300M
    F Guaranteed 2Gi 2Gi 1G

    当节点的内存使用量超过阈值时,kubelet 会根据 Pod 相对于 request 的内存使用量来对 Pod 进行排名。排名如下所示:

    Pod Name Pod QoS Memory requested Memory limits Memory usage 内存相对使用量
    C Burstable 1Gi 2Gi 1.8G 800M
    A Best Effort 0 0 700M 700M
    E Best Effort 0 0 300M 300M
    B Guaranteed 2Gi 2Gi 1.9G -100M
    D Burstable 1Gi 2Gi 800M -200M
    F Guaranteed 2Gi 2Gi 1G -1G

    可以看到在本例中,可以看到在本例中,QoS 等级为 Guaranteed 的 Pod 在 QoS 等级为 Burstable 的 Pod 之前被驱逐。

    当内存资源不足时,kubelet 在驱逐 Pod 时只会考虑 requests 和 Pod 的内存使用量,不会考虑 limits。

    3. Node OOM (Out Of Memory)

    因为 kubelet 默认每 10 秒抓取一次 cAdvisor 的监控数据,所以有可能在 kubelet 驱逐 Pod 回收内存之前发生内存使用量激增的情况,这时就有可能触发内核 OOM killer。这时删除容器的权利就由kubelet 转交到内核 OOM killer 手里,但 kubelet 仍然会起到一定的决定作用,它会根据 Pod 的 QoS 来设置其 oom_score_adj 值:

    QoS oomscoreadj
    Guaranteed -998
    Burstable min(max(2, 1000 - (1000 * memoryRequestBytes) / machineMemoryCapacityBytes), 999)
    pod-infra-container -998
    kubelet, docker daemon, systemd service -999

    如果该节点在 kubelet 通过驱逐 Pod 回收内存之前触发了 OOM 事件,OOM killer 就会采取行动来降低系统的压力,它会根据下面的公式来计算 oom_score 的值:

    容器使用的内存占系统内存的百分比 + oomscoreadj = oom_score

    OOM killer 会杀掉 oom_score_adj 值最高的容器,如果有多个容器的 oom_score_adj 值相同,就会杀掉内存使用量最多的容器(其实是因为内存使用量最多的容器的 oom_score 值最高)。关于 OOM 的更多内容请参考:[Kubernetes 内存资源限制实战](https://www.yangcs.net/posts/memory-limit-of-pod-and-oom-killer/)。

    假设某节点运行着 4 个 Pod,且每个 Pod 中只有一个容器。每个 QoS 类型为 Burstable 的 Pod 配置的内存 requests 是 4Gi,节点的内存大小为 30Gi。每个 Pod 的 oom_score_adj 值如下所示:

    Pod Name Pod QoS oomscoreadj
    A Best Effort 1000
    B Guaranteed -998
    C Burstable 867(根据上面的公式计算)
    D Best Effort 1000

    当调用 OOM killer 时,它首先选择 oom_score_adj 值最高的容器(1000),这里有两个容器的 oom_score_adj 值都是 1000,OOM killer 最终会选择内存使用量最多的容器。

    4. 总结

    • 因为 kubelet 默认每 10 秒抓取一次 cAdvisor 的监控数据,所以可能在资源使用量低于阈值时,kubelet 仍然在驱逐 Pod。
    • kubelet 将 Pod 从节点上驱逐之后,Kubernetes 会将该 Pod 重新调度到另一个资源充足的节点上。但有时候 Scheduler 会将该 Pod 重新调度到与之前相同的节点上,比如设置了节点亲和性,或者该 Pod 以 Daemonset 的形式运行。

    现在你应该理解了 kubelet 驱逐 Pod 的原理和过程,如果你在部署应用时设置了恰当的参数,知道了所有的可能性,你就能更好地掌控你的集群。

    展开全文
  • Kubernetes pod的yaml详解

    2021-06-08 14:49:43
    Kubernetes pod的yaml详解以及在安装Kubernetes时遇到的问题记录 #Podyaml书写规范及注释 apiVersion: v1 #版本号 必填 kind: Pod #对象选择 必填 metadata: #元数据 必填 name: string #Pod名称 必填 ...
  • Kubernetes Pod 镜像拉取策略

    千次阅读 2019-10-02 12:34:58
    Kubernetes Pod 镜像拉取策略 官方文档:https://kubernetes.io/docs/concepts/containers/images/ • IfNotPresent:默认值,镜像在宿主机上不存在时才拉取• Always:每次创建 Pod 都会重新拉取一次镜像• Never...
  • kubernetes pod exec接口调用

    千次阅读 2019-06-25 15:03:09
    一般生产环境上由于网络安全策略,大多数端口是不能为集群外部访问的。...所以在做云平台时,集群管理平台(雅称:观云台)需要操作其他集群的资源对象时,必然也得通过ApiServer。kubernetes pod exec接口调用
  • kubernetes pod生命周期管理-postStart和preStop
  • 文章目录在CentOS7上安装NFS server并在Kubernetes Pod中挂载NFS卷资源规划安装NFS server安装NFS client测试NFS在Kubernetes Pod中使用NFS卷示例参考文档 在CentOS7上安装NFS server并在Kubernetes Pod中挂载NFS卷 ...
  • 昨天晚上构思,今天花了一上午的时间翻阅了下kubernetes api reference,画了一个kubernetes pod cheetsheet。从Pod的数据结构和API入手,管中窥豹,可见一斑。通过该图基本可以对kubernetes中这个最基本的object...
  • 要想了解Kubernetes Pod,我们要先知道Kubernetes是什么?我们所熟知的k8s是将8个字母“ubernete”替换为“8”的缩写。 Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩...
  • 我们在撰写Kubernetes pod的yaml文件时,一定都为Kubernetes yaml文件复杂的语法苦恼过。 其实Kubernetes是提供了很好的在线(online)文档的。 命令: kubectl explain pod.spec | grep -i "containers" -...
  • Kubernetes Pod健康检查-livenessProbe和readinessProbe
  • 通过一个试验作为例子来学习一下。 我们创建一个名为fail 的 deployment,让它故意指向一个实际并不存在的 Docker...查看这个Pod的状态,发现状态为 ErrImagePull 或者 ImagePullBackOff: $ kubectl get pods NAME ...
  • Kubernetes Pod Evicted

    2020-05-14 18:33:05
    近日 Kubernetes 测试集群 Pod 状态出现 Evicted 现象 , 但是项目还是能正常提供服务 , 最先的解决办法是手动将 Evicted 状态的 Pod 删除。 # 查看 Evicted 状态的 Pod [ops@dev-gate ~]# kubectl get pods -n ...
  • kubernetes Pod驱逐机制

    千次阅读 2019-07-20 14:57:40
    kubernetes里,pod的驱逐机制分为kubelet驱逐(被动驱逐)和主动驱逐两种。 kubelet驱逐 在node节点的资源紧缺的条件下,kubelet为了保证node节点的稳定性,回触发主动驱逐pod的机制,流程如下 注意:流程图根据...
  • Kubernetes Pod 关闭流程

    千次阅读 2020-05-06 10:23:26
    翻译自官方文档 用户发送delete pod命令,grace period 参数即宽限期(假设...与3同时,kubelet看到pod被标识了deleteTimestamp也就是标识为Terminating,它开始执行关闭pod流程: 如果pod中的一个容器定义了 preS...
  • Kubernetes Pod调度说明 简介 Scheduler 是 Kubernetes 的调度器,主要任务是把定义的Pod分配到集群的节点上,听起来非常简单,但要考虑需要方面的问题: 公平:如何保证每个节点都能被分配到资源 资源...
  • Kubernetes Pod启动

    千次阅读 2018-11-20 23:14:26
    定义pod配置文件pod_nginx.yml,这里以一个nginx为例演示 apiVersion: v1 kind: Pod metadata: name: nginx labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 8....
  • Pod Security Policies(PSP) Pod Security Policies(PSP)是集群级的Pod安全策略,自动为集群内的Pod和Volume设置Security Context。 使用PSP需要API Server开启extensions/v1beta1/podsecuritypolicy,并且...
  • ​简单的 Kubernetes Pod 日志查看工具 Kubetail 传统来说,Kubernetes 环境下的日志都是靠 FluentD + ElasticSearch + Kibana 的组合实现的,这一组合的功能和强大,所以成为一个事实标准来使用,但是在一些...
  • kubernetes pod启动失败

    千次阅读 2018-05-29 08:09:56
    在《kubernetes权威指南》入门的一个例子中,发现pod一直处于ContainerCreating的状态,用kubectl describe pod mysql的时候发现如下报错:Events: FirstSeen LastSeen Count From SubObjectPath Type Reason ...
  • 新装Kubernetes,创建一个新Pod,启动Pod遇到CreatePodSandbox或RunPodSandbox异常。查看日志 # journalctl --since 15:00:00 -u kubelet RunPodSandbox from runtime service failed: rpc error: code = Unknown ...
  • kubernetes Pod驱逐迁移

    千次阅读 2020-07-23 00:35:29
    在使用k8s集群过程中,可能会遇到节点异常或需要节点升级的情况,但又不能影响节点中服务的正常运行,就要涉及到对pod信息迁移和node节点维护。 维护主要分为两部分:pod驱逐、节点维护 node节点维护 查看k8s集群...
  • kubernetes pod 初始化

    2018-03-25 15:28:48
    https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/ 有时候,在容器启动时我们需要做一些预备工作。 举个例子: 现启动了一个nginx pod, 且挂载了 rbd 作为web根目录...
  • 7、Kubernetes Pod 控制器

    万次阅读 2020-02-25 08:12:13
    Kubernetes 中内建了很多 controller(控制器),这些相当于一个状态机,用来控制 Pod 的具体状态和行为 控制器类型 ReplicationController 和 ReplicaSet Deployment DaemonSet StateFulSet Job/CronJob ...
  • Kubernetes Pod 外部访问

    千次阅读 2019-01-11 17:25:22
    从外部访问Kubernetes中的Pod 你需要知道的访问Pod的5种方式 前面几节讲到如何访问kubneretes集群,本文主要讲解访问kubenretes中的Pod和Serivce的集中方式,包括如下几种: hostNetwork hostPort NodePort ...
  • Kubernetes Pod 优先级和抢占

    千次阅读 2018-12-11 12:47:20
    Kubernetes 1.8 及其以后的版本中可以指定 Pod 的优先级。优先级表明了一个 Pod 相对于其它 Pod 的重要性。当 Pod 无法被调度时,scheduler 会尝试抢占(驱逐)低优先级的 Pod,使得这些挂起的 pod 可以被调度。在 ...
  • kubernetes 官方简介 pod 间亲和与反亲和: pod 间亲和与反亲和使你可以基于已经在节点上运行的 pod 的标签来约束 pod调度到节点上,而不是基于节点上的标签 Pod 亲和与反亲和的合法操作符有 名称 属性 In ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 60,167
精华内容 24,066
关键字:

kubernetespod