SREWorks云原生数智运维工程实践-Kubernetes资源编排之一:Pod YAML篇(下)

简介: SREWorks云原生数智运维工程实践-Kubernetes资源编排之一:Pod YAML篇

四、 Spec规范

 

Spec作为Pod的期望状态,一定程度上也覆盖了Pod完整生命周期的逻辑,Pod的生命周期分为以下阶段

 

image.png

 

Pending:代表Pod处于未调度阶段

Creating:节点上的kubelet已经发现了Pod,处于创建阶段

Running:至少一个容器运行完毕,kubelet这会发起健康监测

Terminating:Pod处于删除状态,kubelet开始回收容器

TerminatedPod销毁完成

 

1. Pod生命周期Pending

 

Pod资源创建完毕后,处于还未调度阶段,这个时候scheduler(调度器)基于pod yaml本身的配置与节点资源状态情况,来进行调度。

 

image.png

 

scheduler会去分析PodYAML将其中的策略提取出来,与节点组中的节点配置进行匹配,若匹配成功后,会选出最佳节点,重新修改pod yaml,将spec.nodeName更新掉,完成整个调度环节

 

资源策略

 

资源策略表明Pod运行需要的资源情况,以demo为例,Pod需要2核4G的资源,那么调度过去的节点也需要有2核4G的资源剩余,Pod才能运行在该节点上

 

节点标签筛选策略

 

节点标签筛选策略,筛选节点是否存在topology.kubernetes.io/region:cn-hangzhou

 

亲和策略

 

亲和策略,有节点亲和与Pod亲和(Pod所在节点优先调度),常规来说可以优先满足亲和的节点上,当前例子就是节点亲和,满足标签disk-type=aaa或者disk-type=bbb

 

污点策略

 

污点策略,当节点上配置了污点,若Pod没有容忍该污点的策略,则Pod不允许调度到该节点上

 

 

2. Pod生命周期Creating

 

当Pod调度完毕后,开始创建阶段,Kubelet会基于pod.spec期望状态来创建出PodKubelet在创建Pod阶段,总共大致经历以下过程:

 

Group配置主要是为了容器配置cgroup,里面涉及了对容器资源限制,比如不允许超过cpu、memory配置这里涉及到Pod的qos级别判定

初始化环境配置主要是对相关Pod数据存储目录进行配置,涉及到volume,则会去引用CSI协议,也会去获取镜像secret,为了后续拉取镜像进行准备工作

创建pause容器创建pause容器,该容器主要是为了后续配置容器网络,配置容器网络会去调用CNI

创建Pod容器基于imagesecret拉取业务镜像,在创建Pod容器阶段,也会将相应的Pod YAML配置传输进去,在启动Pod容器完毕后,会基于poststart进行相关的回调

 

image.png

上述阶段,会相关选择部分关键概念进行详细说明

 


 

image

 

 

spec:

  containers:

  - image: testdemo:v1

    imagePullPolicy: Always

    name: test-config

  imagePullSecrets:

  - name: image-regsecret

 

 

imagePullSecrets拉取镜像的密钥,保证能够拉取image:testdemo:v1,尤其在镜像库是私有库的阶段

imagePullPolicy:镜像拉取策略

 

Always总是拉取镜像

IfNotPresent本地若有则使用本地镜像,不进行拉取

Never:只使用本地镜像,不拉取

 

containers

 

注意这个containers用的是复数,可以填多个容器镜像比如可以放nginx和业务容器。这样做的好处是可以尽量减少业务容器中与业务无关的代码或进程。

 

container涉及很多配置,其中有涉及到volume、env、dnsconfig、host等基础配置

 

 

spec:

  containers:

  - env:

    - name: TZ

      value: Asia/Shanghai

    image: testdemo:v1

    name: taihao-app-cn-shanghai-pre-share

    volumeMounts:

    - mountPath: /home/admin

      name: test-config

      readOnly: true

  dnsConfig:

    nameservers:

    - 100.100.1.1

    - 100.100.2.1

    options:

    - name: ndots

      value: "3"

    - name: timeout

      value: "3"

    - name: attempts

      value: "3"

    searches:

    - default.svc.cluster.local

    - svc.cluster.local

    - cluster.local

  hostAliases:

  - hostnames:

    - kubernetes

    - kubernetes.default

    - kubernetes.default.svc

    - kubernetes.default.svc.cluster.local

    ip: 1.1.1.1

  volumes:

  - configMap:

      defaultMode: 420

      name: test-config

name: test-config

 

 

env:配置Pod的环境变量

dnsConfig:配置Pod的域名解析

hostALiases:配置/etc/hosts文件内容

volume/volumeMount配置文件挂载到容器内,也可以配置文件存储系统挂载到容器内

 

postStart

 

 

containers:

  - image: testdemo:v1

    imagePullPolicy: Always

    lifecycle:

      postStart:

        exec:

          command:

          - /bin/sh

          - -c

          - sleep 5

 

 

当前poststart demo是发起command命令,也可以发起http请求,主要作用可以作为资源部署以及环境准备

 

3. Pod生命周期Running

 

在Pod running阶段的时候,Pod就迎来对其健康的检查,当前kubelet提供三种方式判定

 

readiness:检查Pod是否为健康

liveness:件看Pod是否正常,若检查失败,则重启容器

readinessGate:提供给第三方组件健康验证,第三方组件验证不过,则Pod不为健康

 

 

spec:

  readinessGates:

  - conditionType: TestPodReady

  containers:

  - image: testdemo:v1

    imagePullPolicy: Always

    livenessProbe:

      failureThreshold: 3

      initialDelaySeconds: 45

      periodSeconds: 5

      successThreshold: 1

      tcpSocket:

        port: 8080

      timeoutSeconds: 1

    readinessProbe:

      failureThreshold: 3

      httpGet:

        path: /actuator/health

        port: 8989

        scheme: HTTP

      initialDelaySeconds: 25

      periodSeconds: 3

      successThreshold: 1

      timeoutSeconds: 1

 

 

readiness与liveness检查参数都是一致的

 

httpGet/tcpSocket:都是检查方式,一种是http请求验证,一种是tcpSocket,其中也有exec执行命令,以及grpc形式验证

initialDelaySeconds:延迟多久开始检查,原因在于容器启动的时候,通常需要过段时间进行验证

periodSeconds:检验时间周期

failureThreshold:连续几次失败,则代表这轮检验失败

successThreshold:连续几次成功,则代表这轮检验成功

timeoutSeconds:代表检验超时时间,若检验在该配置时间内没有返回,则认为检验失败

 

readiness、liveness虽然参数不一样,但对检验的结果行为不一致。

 

readiness默认状态下为false,也就是Pod为不健康,直到检查通过,才将Pod变为健康

liveness默认状态下为true,不会在刚开始就将Pod重启,只有等检查不通过后,才会进行容器重启操作

 

readinessGate是Pod健康的扩展,kubelet会基于此,默认在pod.status.conditions上配置对应的condition,比如当前例子readinessGate为conditionType:TestPodReady,则相应就会有conditions

 

 

status:

  conditions:

  - lastProbeTime: null

    lastTransitionTime: "2022-07-05T09:16:07Z"

    status: "false"

type: TestPodReady

 

 

当该condition.status为false时,则Pod就会一直是不健康,哪怕readiness检查通过,直到第三方系统去操作更新Pod该condition.status为true,才可以将Pod变为健康,这样就可以接入更多的Pod健康指标。

 

4. Pod生命周期Terminating

 

client在发起请求删除Pod的时候,实际上是配置pod.metadata.deletionTimestamp,kubelet感知到后,开始进行Pod回收流程

整个Pod的回收周期,常规来说preStop—>SIGTERM—>SIGKILL

 

 

lifecycle:

  preStop:

    exec:

      command:

      - /bin/sh

      - -c

      - sleep 5

 

 

当kubelet进行preStop后,开始发起SIGTERM给容器内进程,若超过总默认耗时30S(metadata.DeletionGracePeriodSeconds)则强制发起SIGKILL给容器,也就是prestop+SIGTERM总耗时不允许超过30s。

 

五、 Status状态

 

 

status:

  conditions:

  - lastProbeTime: null

    lastTransitionTime: "2022-07-05T09:16:07Z"

    status: "True"

    type: TestPodReady

  - lastProbeTime: null

    lastTransitionTime: "2022-07-05T09:16:07Z"

    status: "True"

    type: Initialized

  - lastProbeTime: null

    lastTransitionTime: "2022-07-05T09:16:14Z"

    status: "True"

    type: Ready

  - lastProbeTime: null

    lastTransitionTime: "2022-07-05T09:16:14Z"

    status: "True"

    type: ContainersReady

  - lastProbeTime: null

    lastTransitionTime: "2022-07-05T09:16:07Z"

    status: "False"

    type: ContainerDiskPressure

  - lastProbeTime: null

    lastTransitionTime: "2022-07-05T09:16:07Z"

    status: "True"

    type: PodScheduled

  containerStatuses:

  - containerID: containerd://xxxxx

    image: docker.io/library/testdemo:v1

    imageID: docker.io/library/centos@sha256:xxxx

    lastState: {}

    name: zxtest

    ready: true

    restartCount: 0

    started: true

    state:

      running:

        startedAt: "2022-07-05T09:16:13Z"

  hostIP: 21.1.96.23

  phase: Running

  podIP: 10.11.17.172

  podIPs:

  - ip: 10.11.17.172

  qosClass: Guaranteed

  startTime: "2022-07-05T09:16:07Z"

 

 

基于上述,将Pod status状态拆建出来

 

Conditionsconditions是作为一种更详尽的状态报告,其本身也是一种扩展机制,其他的扩展字段也可以放入其中,比如可以表明网络状况,其中readinessGate就是这种扩展机制的表现,但决定Pod是否ready,永远只看type:Ready是否为true

containerStatuses:Pod内各容器的状态

hostIPPod所在节点ip地址

phasePod的生命周期状态

 

Pending:代表Pod有一个容器或者多个容器还未运行,其中包括Pod调度到节点之前以及拉取镜像

Running:代表Pod已绑定到节点上,至少有一个容器运行或在重启

Successed:代表Pod所有容器已终止

Failed:代表Pod内至少有一个容器终止失败

Unknown:代表无法获取Pod状态

 

podIP/podIPs:Pod的IP地址,假如有ipv4、ipv6,则可以在podIPs上配置

qosClass:代表kubernetes服务等级

 

Guaranteed:resource.requests与resource.limits一致

Burstable:resource.requests与resource.limits不一致

BestEffort:没有配置resource.requests与resource.limits

 

startTime:启动时间

 

通过对Pod四个部分拆解,我们基本搞清了一个Pod在k8s下的“从哪里来”这个问题。本系列的后续的文章会对“到哪里去”这个问题继续展开:Kubernetes的魅力在于不仅仅是拉起一个工作负载,而是能够召之即来挥之即去地编排海量工作负载。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
Cloud Native Serverless 数据中心
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
ACK One注册集群已正式支持ACS(容器计算服务)算力,为企业的容器化工作负载提供更多选择和更强大的计算能力。
|
12月前
|
Cloud Native Serverless 数据中心
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
366 10
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
587 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
Kubernetes Cloud Native 开发者
云原生入门:Kubernetes的简易指南
【10月更文挑战第41天】本文将带你进入云原生的世界,特别是Kubernetes——一个强大的容器编排平台。我们将一起探索它的基本概念和操作,让你能够轻松管理和部署应用。无论你是新手还是有经验的开发者,这篇文章都能让你对Kubernetes有更深入的理解。
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
Kubernetes Cloud Native 云计算
云原生入门:Kubernetes 和容器化基础
在这篇文章中,我们将一起揭开云原生技术的神秘面纱。通过简单易懂的语言,我们将探索如何利用Kubernetes和容器化技术简化应用的部署和管理。无论你是初学者还是有一定经验的开发者,本文都将为你提供一条清晰的道路,帮助你理解和运用这些强大的工具。让我们从基础开始,逐步深入了解,最终能够自信地使用这些技术来优化我们的工作流程。
|
应用服务中间件 调度 nginx
Kubernetes-项目中pod调度使用法则
前言kubernetes中部署的pod默认根据资源使用情况自动调度到某个节点。可在实际项目的使用场景中都会有更细粒度的调度需求,比如:某些pod调度到指定主机、某几个相关的服务的pod最好调度到一个节点上、Master节点不允许某些pod调度等。
2196 0
|
Kubernetes 应用服务中间件 调度
Kubernetes之Pod调度
Kubernetes调度器根据特定的算法与策略将pod调度到工作节点上。在默认情况下,Kubernetes调度器可以满足绝大多数需求,例如调度pod到资源充足的节点上运行,或调度pod分散到不同节点使集群节点资源均衡等。
1600 0
|
Kubernetes 应用服务中间件 调度
Kubernetes之Pod调度
本文讲的是Kubernetes之Pod调度【编者的话】Kubernetes调度器根据特定的算法与策略将pod调度到工作节点上。在默认情况下,Kubernetes调度器可以满足绝大多数需求,例如调度pod到资源充足的节点上运行,或调度pod分散到不同节点使集群节点资源均衡等。
2966 0

热门文章

最新文章

推荐镜像

更多