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
相关文章
|
Kubernetes Docker 容器
Kubernetes与Docker参数对照:理解Pod中的command、args与Dockerfile中的CMD、ENTRYPOINT。
需要明确的是,理解这些都需要对Docker和Kubernetes有一定深度的理解,才能把握二者的区别和联系。虽然它们都是容器技术的二个重要组成部分,但各有其特性和适用场景,理解它们的本质和工作方式,才能更好的使用这些工具,将各自的优点整合到生产环境中,实现软件的快速开发和部署。
619 25
|
存储 负载均衡 测试技术
ACK Gateway with Inference Extension:优化多机分布式大模型推理服务实践
本文介绍了如何利用阿里云容器服务ACK推出的ACK Gateway with Inference Extension组件,在Kubernetes环境中为多机分布式部署的LLM推理服务提供智能路由和负载均衡能力。文章以部署和优化QwQ-32B模型为例,详细展示了从环境准备到性能测试的完整实践过程。
|
存储 人工智能 Kubernetes
ACK Gateway with AI Extension:面向Kubernetes大模型推理的智能路由实践
本文介绍了如何利用阿里云容器服务ACK推出的ACK Gateway with AI Extension组件,在Kubernetes环境中为大语言模型(LLM)推理服务提供智能路由和负载均衡能力。文章以部署和优化QwQ-32B模型为例,详细展示了从环境准备到性能测试的完整实践过程。
|
存储 人工智能 物联网
ACK Gateway with AI Extension:大模型推理的模型灰度实践
本文介绍了如何使用 ACK Gateway with AI Extension 组件在云原生环境中实现大语言模型(LLM)推理服务的灰度发布和流量分发。该组件专为 LLM 推理场景设计,支持四层/七层流量路由,并提供基于模型服务器负载感知的智能负载均衡能力。通过自定义资源(CRD),如 InferencePool 和 InferenceModel,可以灵活配置推理服务的流量策略,包括模型灰度发布和流量镜像。
|
Kubernetes Shell Windows
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
580 12
|
Kubernetes 监控 Serverless
基于阿里云Serverless Kubernetes(ASK)的无服务器架构设计与实践
无服务器架构(Serverless Architecture)在云原生技术中备受关注,开发者只需专注于业务逻辑,无需管理服务器。阿里云Serverless Kubernetes(ASK)是基于Kubernetes的托管服务,提供极致弹性和按需付费能力。本文深入探讨如何使用ASK设计和实现无服务器架构,涵盖事件驱动、自动扩展、无状态设计、监控与日志及成本优化等方面,并通过图片处理服务案例展示具体实践,帮助构建高效可靠的无服务器应用。
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
889 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
监控 Kubernetes Cloud Native
基于阿里云容器服务Kubernetes版(ACK)的微服务架构设计与实践
本文介绍了如何基于阿里云容器服务Kubernetes版(ACK)设计和实现微服务架构。首先概述了微服务架构的优势与挑战,如模块化、可扩展性及技术多样性。接着详细描述了ACK的核心功能,包括集群管理、应用管理、网络与安全、监控与日志等。在设计基于ACK的微服务架构时,需考虑服务拆分、通信、发现与负载均衡、配置管理、监控与日志以及CI/CD等方面。通过一个电商应用案例,展示了用户服务、商品服务、订单服务和支付服务的具体部署步骤。最后总结了ACK为微服务架构提供的强大支持,帮助应对各种挑战,构建高效可靠的云原生应用。
|
人工智能 运维 监控
阿里云ACK容器服务生产级可观测体系建设实践
本文整理自2024云栖大会冯诗淳(花名:行疾)的演讲,介绍了阿里云容器服务团队在生产级可观测体系建设方面的实践。冯诗淳详细阐述了容器化架构带来的挑战及解决方案,强调了可观测性对于构建稳健运维体系的重要性。文中提到,阿里云作为亚洲唯一蝉联全球领导者的容器管理平台,其可观测能力在多项关键评测中表现优异,支持AI、容器网络、存储等多个场景的高级容器可观测能力。此外,还介绍了阿里云容器服务在多云管理、成本优化等方面的最新进展,以及即将推出的ACK AI助手2.0,旨在通过智能引擎和专家诊断经验,简化异常数据查找,缩短故障响应时间。
阿里云ACK容器服务生产级可观测体系建设实践
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
阿里云容器服务ACK提供强大的产品能力,支持弹性、调度、可观测、成本治理和安全合规。针对拥有IDC或三方资源的企业,ACK One分布式云容器平台能够有效解决资源管理、多云多集群管理及边缘计算等挑战,实现云上云下统一管理,提升业务效率与稳定性。

热门文章

最新文章

推荐镜像

更多