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的魅力在于不仅仅是拉起一个工作负载,而是能够召之即来挥之即去地编排海量工作负载。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
2月前
|
缓存 Java API
【云原生】Spring Cloud Gateway的底层原理与实践方法探究
【云原生】Spring Cloud Gateway的底层原理与实践方法探究
|
4月前
|
存储 SQL Cloud Native
深入了解云原生数据库CockroachDB的概念与实践
作为一种全球领先的分布式SQL数据库,CockroachDB以其高可用性、强一致性和灵活性等特点备受关注。本文将深入探讨CockroachDB的概念、设计思想以及实践应用,并结合实例演示其在云原生环境下的优越表现。
|
4月前
|
Cloud Native 关系型数据库 大数据
CockroachDB:云原生数据库的新概念与实践
本文将介绍CockroachDB,一种先进的云原生数据库,它具备分布式、强一致性和高可用性等特点。我们将探讨CockroachDB的基本原理、架构设计以及在实际应用中的种种优势和挑战。
|
4月前
|
运维 Cloud Native Devops
云原生 DevOps 自动化运维 概述
【1月更文挑战第7天】云原生 DevOps 自动化运维 概述
|
2月前
|
Cloud Native 安全 持续交付
构建未来:云原生架构的演进与实践
【2月更文挑战第30天】 随着数字化转型的深入,企业对于信息技术的需求日益复杂化和动态化。传统的IT架构已难以满足快速迭代、灵活扩展及成本效率的双重要求。云原生技术作为解决这一矛盾的关键途径,通过容器化、微服务、持续集成/持续部署(CI/CD)等手段,实现了应用的快速开发、部署及运维。本文将探讨云原生架构的最新发展,分析其如何助力企业构建更加灵活、高效的业务系统,并结合实际案例,展示云原生转型过程中的最佳实践和面临的挑战。
|
2天前
|
Cloud Native Devops 持续交付
构建未来应用:云原生架构在现代企业中的实践与挑战
【4月更文挑战第29天】 随着数字化转型的加速,企业正迅速转向云计算以支撑其业务敏捷性和创新。云原生技术,作为推动这一转型的关键因素,正在重新定义软件开发和运维模式。本文将深入探讨云原生架构的核心组件,包括容器化、微服务、持续集成/持续部署(CI/CD)以及DevOps文化,并分析这些技术如何帮助企业实现弹性、可扩展和高效的应用部署。同时,我们将讨论在采纳云原生实践中所面临的挑战,包括安全性、治理和人才缺口等问题。
|
2天前
|
Kubernetes Cloud Native 持续交付
构建未来:云原生架构在现代企业中的应用与实践
【4月更文挑战第29天】 随着数字化转型的浪潮席卷各行各业,企业对于信息技术基础设施的要求日益提高。传统的IT架构已难以满足快速迭代、灵活扩展和持续创新的需求。本文聚焦于云原生架构,一种为云计算环境量身打造的设计理念和技术集合,旨在帮助企业构建更加灵活、可靠和高效的系统。通过对云原生核心组件的解析、实施策略的探讨以及成功案例的分析,我们揭示了云原生架构如何助力企业在竞争激烈的市场中保持领先地位。
|
18天前
|
Kubernetes 监控 Cloud Native
构建高效云原生应用:基于Kubernetes的微服务治理实践
【4月更文挑战第13天】 在当今数字化转型的浪潮中,企业纷纷将目光投向了云原生技术以支持其业务敏捷性和可扩展性。本文深入探讨了利用Kubernetes作为容器编排平台,实现微服务架构的有效治理,旨在为开发者和运维团队提供一套优化策略,以确保云原生应用的高性能和稳定性。通过分析微服务设计原则、Kubernetes的核心组件以及实际案例,本文揭示了在多变的业务需求下,如何确保系统的高可用性、弹性和安全性。
18 4
|
2月前
|
编解码 运维 Cloud Native
|
3月前
|
Prometheus 监控 Kubernetes
青团社:亿级灵活用工平台的云原生架构实践
青团社:亿级灵活用工平台的云原生架构实践
262353 6

推荐镜像

更多