k8s核心概念 pod调度和生命周期

2023-05-16

文章目录

    • 调度约束方法
      • nodeName
      • nodeSelector
    • Pod调度流程
    • pod生命周期
      • 生命周期概述
    • pod生命周期流程
      • 容器启动
      • 容器终止
      • 容器重启策略回顾
      • 容器生命周期
    • 健康检查
      • 健康检查方式
      • Probe探测方式
      • 探测方式举例
        • liveness-exec案例
        • liveness-httpget案例
        • readiness案例
        • readiness+liveness综合案例

调度约束方法

  • 默认情况下,一个pod在那个节点运行完全是由Scheduler组件的相关算法来完成的,这个过程不受人工干预,在实际使用场景中不一定符合我们的使用场景
  • 为了解决这个问题,我们可以使用约束,将pod调用到指定的Node节点上面,常用的方式有以下两个

nodeName

  • 用于将Pod调用到指定的Node上
  • 编写yaml资源清单文件,将spec.nodeName指定成想要调度的节点
apiVersion: v1
kind: Pod
metadata:
  name: nainx
spec:
  nodeSelector: master1		# 指定pod需要调度的节点
  containers:
  - name: nginx
    image: nginx 

nodeSelector

  • 用于将pod调用到匹配label的node上
  • 编写yaml资源清单文件,将spec.nodeName指定成想要调度的节点
apiVersion: v1
kind: Pod
metadata:
  name: nainx
spec:
  nodeName:		# 指定调度到标签env为dev的节点上
  env: dev 	
  containers:
  - name: nginx
    image: nginx 

Pod调度流程

pod调度流程

  1. 通过 kubectl 命令应用资源清单文件,向APIServer发起一个创建Pod的请求
  2. APIServer收到创建pod请求之后,生成一个创建pod的资源清单文件
  3. APIServer 将资源清单文件中的数据写入到ETCD中
  4. Scheduler 组件,启动一个watch apiServer,获取spec.nodeName为空的pod,即判断pod.spec.Node == null? 若为null,表示这个Pod请求是新的,需要创建,因此先进行调度计算(共计2步:1、过滤不满足条件的,2、选择优先级高的),找到合适的node,然后将信息在etcd数据库中更新分配结果:pod.spec.Node = nodeA (设置一个具体的节点)
  5. kubelet 通过watch etcd数据库(即不停地看etcd中的记录),发现有新的Node出现,如果这条记录中的Node与所在节点编号相同,即这个Pod由scheduler分配给自己,则调用node中的Container Runtime,进而创建container,并将创建后的结果返回到给api server用于更新etcd数据库中数据状态。

pod生命周期

生命周期概述

  • pod从创建到终止的过程就是Pod的生命周期,在pod中主要有这两个情况
    • pod启动后会一直存在,知道手动删除才会终止,常见于后台进程服务,如mysqld,hhtpd
    • 执行完具体的计算任务之后就会终止,如定时任务等

pod生命周期流程

pod生命周期流程

容器启动

  1. pod容器启动之前,会有初始化容器(initContainer)会先进行环境的初始化
  2. 初始化后主容器(main container)开始启动
  3. 主容器启动之后会有一个post start之类的(启动后钩子函数)操作
  4. post start执行之后就开始进行健康检查

容器终止

  1. 可以在容器终止之前,设置pre stop操作(终止前钩子函数)
  2. 当出现特殊情况不能正常销毁pod时,大概会等待30秒之后强制终止
  3. 终止后容器是否能重启,取决于容器重启策略

容器重启策略回顾

  • Always:表示容器挂了总是重启,这是默认策略
  • OnFailures:表示容器状态为错误时才重启,也就是容器正常终止时不重启
  • Never:表示容器挂了不予重启
  • 对于Always这种策略,容器只要挂了,就会立即重启,这样是很耗费资源的。所以Always重启策略是这么做的:第一次容器挂了立即重启,如果再挂了就要延时10s重启,第三次挂了就等20s重启… 依次类推

容器生命周期

  • 编写yaml模版文件
apiVersion: v1
kind: Pod
metadata:
  name: post-start-test
spec:
  containers:
  - name: poststart
    image: nginx
    lifecycle: # 生命周期事件
      postStart:
        exec:
          command: ["mkdir", "-p", "/usr/share/nginx/post_start_test"]  # 创建pod后创建文件夹
      preStop:
        exec:
          command: ["/bin/sh", "-c", "sleep 1000000000"]    # 容器异常终止大概需要30s以上
  • 启动验证poststart事件
kubectl exec -it post-start-test -- ls -l /usr/share/nginx/
total 8
drwxr-xr-x 2 root root 4096 Dec 29  2021 html
drwxr-xr-x 2 root root 4096 Aug 22 05:09 post_start_test
  • 验证prestop事件
kubectl delete -f lifecycle.yaml 
pod "post-start-test" deleted		# 删除的光标会持续将近20秒才结束,或者可以写个shel死循环,每隔一秒输出一个计数,看看用了多少计算

健康检查

健康检查方式

  • Liveness Probe(存活状态探测):指示容器是否正在运行。如果存活态探测失败,则 kubelet 会杀死容器, 并且容器将根据其重启策略决定。如果容器不提供存活探针, 则默认状态为 Success
  • readiness Probe(就绪型探测):指示容器是否准备好为请求提供服务。如果就绪态探测失败, 端点控制器将从与 Pod 匹配的所有服务的端点列表中删除该 Pod 的 IP 地址。 初始延迟之前的就绪态的状态值默认为 Failure。 如果容器不提供就绪态探针,则默认状态为 Success。注:检查后不健康,将容器设置为Notready;如果使用service来访问,流量不会转发给此种状态的pod
  • startup Probe(启动探测):指示容器中的应用是否已经启动。如果提供了启动探针,则所有其他探针都会被 禁用,直到此探针成功为止。如果启动探测失败,kubelet 将杀死容器,而容器依其进行重启。 如果容器没有提供启动探测,则默认状态为 Success

Probe探测方式

  • Exec:执行命令
  • HttpURL:http请求某一url路径
  • TCP:TCP链接某一个端口
  • gRPC:使用grpc执行一个远程过程调用,目标应该实现grpc的健康检查,如果响应状态为SERVING,则认为诊断成功。gRPC 探针是一个 alpha 特性,只有在你启用了 GRPCContainerProbe 特性门控时才能使用。

探测方式举例

liveness-exec案例

  • 编写yaml文件
apiVersion: v1
kind: Pod
metadata:
  name: liveness-exec
spec:
  containers:
  - name: liveness
    image: busybox
    imagePullPolicy: IfNotPresent	
    args:
    - /bin/sh
    - -c
    - touch /tmp/health; sleep 30; rm -rf /tmp/health; sleep 600
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/health
      initialDelaySeconds: 5	# 启动后5秒开始检测
      periodSeconds: 5	# 检测间隔,5秒检测一次
  • 观察探测情况
Events:
  Type     Reason     Age                From               Message
  ----     ------     ----               ----               -------
  Normal   Scheduled  83s                default-scheduler  Successfully assigned default/liveness-exec to docker-desktop
  Normal   Pulling    82s                kubelet            Pulling image "busybox"
  Normal   Pulled     65s                kubelet            Successfully pulled image "busybox" in 17.1068002s
  Normal   Created    65s                kubelet            Created container liveness
  Normal   Started    65s                kubelet            Started container liveness
  Warning  Unhealthy  23s (x3 over 33s)  kubelet            Liveness probe failed: cat: can't open '/tmp/health': No such file or directory
  Normal   Killing    23s                kubelet            Container liveness failed liveness probe, will be restarted

liveness-httpget案例

  • 编写yaml文件
apiVersion: v1
kind: Pod
metadata:
  name: liveness-httpget
spec:
  containers:
    - name: nginx
      image: nginx
      imagePullPolicy: IfNotPresent
      ports:
      - name: http
        containerPort: 80
      livenessProbe:
        httpGet:
          port: http
          path: /indexhtml
        initialDelaySeconds: 5
        periodSeconds: 5
  • 启动并查看
kubectl get pod
NAME               READY   STATUS             RESTARTS   AGE
liveness-httpget   0/1     ImagePullBackOff   0          44s
  • 交互方式删除nginx的主页文件
kubectl exec -it liveness-httpget -- rm -rf /usr/share/nginx/html/index.html
  • 查看容器详情描述
Events:
  Type     Reason     Age                From               Message
  ----     ------     ----               ----               -------
  Normal   Scheduled  30s                default-scheduler  Successfully assigned default/liveness-httpget to docker-desktop
  Normal   Killing    11s                kubelet            Container nginx failed liveness probe, will be restarted
  Normal   Pulled     10s (x2 over 30s)  kubelet            Container image "nginx" already present on machine
  Normal   Created    10s (x2 over 30s)  kubelet            Created container nginx
  Normal   Started    10s (x2 over 30s)  kubelet            Started container nginx
  Warning  Unhealthy  1s (x4 over 21s)   kubelet            Liveness probe failed: HTTP probe 
  Normal   Killing    9s (x2 over 29s)   kubelet            Container nginx failed liveness probe, will be restarted
  Normal   Created    8s (x3 over 48s)   kubelet            Created container nginx
  Normal   Started    8s (x3 over 48s)   kubelet            Started container nginx
failed with statuscode: 404

readiness案例

  • 编写yaml文件
apiVersion: v1
kind: Pod
metadata:
  name: readiness-httpget
spec:
  containers:
    - name: readiness
      image: nginx
      imagePullPolicy: IfNotPresent
      ports:
        - name: http
          containerPort: 80
      readinessProbe:                     # 这里由liveness换成了readiness
        httpGet:
          port: http
          path: /index.html
        initialDelaySeconds: 3
        periodSeconds: 5
  • 交互方式删除nginx的主页文件
kubectl exec -it liveness-httpget -- rm -rf /usr/share/nginx/html/index.html
  • 观察pod执行细节
Events:
  Type     Reason     Age                From               Message
  ----     ------     ----               ----               -------
  Normal   Scheduled  2m57s              default-scheduler  Successfully assigned default/readiness-httpget to docker-desktop
  Normal   Pulled     2m57s              kubelet            Container image "nginx" already present on machine
  Normal   Created    2m57s              kubelet            Created container readiness
  Normal   Started    2m57s              kubelet            Started container readiness
  Warning  Unhealthy  3s (x13 over 63s)  kubelet            Readiness probe failed: HTTP probe failed with statuscode: 404
  • 观察pod状态
    在这里插入图片描述

readiness+liveness综合案例

  • 编写yaml文件
apiVersion: v1
kind: Pod
metadata:
  name: readiness-liveness-httpget
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
    - name: http
      containerPort: 80
    livenessProbe:
      httpGet:
        port: http
        path: /index.html
      initialDelaySeconds: 1
      periodSeconds: 3
    readinessProbe:
      httpGet:
        port: http
        path: /index.html
      initialDelaySeconds: 5
      periodSeconds: 5
  • 交互方式删除nginx的主页文件
kubectl exec -it liveness-httpget -- rm -rf /usr/share/nginx/html/index.html
  • 验证
    在这里插入图片描述
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

k8s核心概念 pod调度和生命周期 的相关文章

  • 安装--centos7上使用kubeadm安装三节点的k8s集群

    安装文档 https kubernetes io zh cn docs setup production environment tools kubeadm install kubeadm 参考 https blog csdn net qq
  • k8s部署gitlab最新版并初始化和登录

    前提条件是已经部署了k8s环境 采用k8s部署gitlab作为devops的测试环境 更加简洁和方便 1 准备工作 1 1 创建nfs共享目录 在nfs服务器创建共享目录 部署的gitlib使用共享目录来进行持久化 这样不管在哪个节点运行g
  • 社区的代码规范及e2e测试

    golangci lint 静态代码检查工具 是对golint gofmt的集成 速度更快 1 安装 go install github com golangci golangci lint cmd golangci lint v1 38
  • CNI Plugin 介绍

    CNI 插件包括两种类型 CNI Plugin 和 IPAM IP Address Management Plugin CNI Plugin 负责为容器配置网络资源 IPAM Plugin 负责对容器的 IP 地址进行分配和管理 IPAM
  • KVM-7、KVM 虚拟机创建的几种方式

    通过对 qemu kvm libvirt 的学习 总结三种创建虚拟机的方式 1 通过 qemu kvm 创建 2 通过 virt install 创建 3 通过 virt manager 创建 在使用这三种创建虚拟机前提是 宿主机必须支持
  • 局域网使用kubeadm安装高可用k8s集群

    主机列表 ip 主机名 节点 cpu 内存 192 168 23 100 k8smaster01 master 2核 2G 192 168 23 101 k8smaster02 node 2核 2G 192 168 23 102 k8sma
  • k8s英伟达GPU插件(nvidia-device-plugin)

    安装方法 Installation Guide NVIDIA Cloud Native Technologies documentation 1 本地节点添加 NVIDIA 驱动程序 要求 NVIDIA drivers 384 81 先确保
  • Prometheus监控 controller-manager scheduler etcd

    用prometheus插件监控kubernetes控制平面 例如 您使用kubeadm构建k8s集群 然后kube控制器管理器 kube调度程序和etcd需要一些额外的工作来进行发现 create service for kube cont
  • wireshark 抓包学习TLS握手(ECDHE)

    首先放出经典的流程图 TLS 握手共分四个阶段 为了便于理解 我用wireshark抓了包来分析每一个阶段 Client Hello 第一次握手 客户端首先会发一个 Client Hello 消息 消息里面有客户端使用的 TLS 版本号 支
  • docker的联合文件系统(UnionFS)

    docker最大的贡献就是定义了容器镜像的分层的存储格式 docker镜像技术的基础是联合文件系统 UnionFS 其文件系统是分层的 这样既可以充分利用共享层 又可以减少存储空间占用 联合挂载系统的工作原理 读 如果文件在upperdir
  • 单机版kubernetes

    Kubernetes 集群的搭建是有一定难度的 官方安装推荐了MiniKube作为单机调试 学习 1 centos安装 1 1 先决条件 安装VirtualBox KVM Note Minikube 也支持 vm driver none 选
  • Rancher 全球化部署最佳实践

    作者 万绍远 CNCF 基金会官方认证 Kubernetes CKA CKS 工程师 云原生解决方案架构师 对 ceph Openstack Kubernetes prometheus 技术和其他云原生相关技术有较深入的研究 参与设计并实施
  • kubeadm配置虚拟机k8s集群

    环境 centos7 vm pro windows terminal termius 虚拟机 硬件配置 2核2G 实验用 具体可根据电脑调整 配置3台 master01 node01 node02 通过克隆虚拟机直接复制 配置通一项以后建议
  • Kubernetes + Dashboard 集群搭建

    1 环境说明 基于kubeadm工具部署k8s 集群 还有基于二进制的部署方式但是需要单独部署k8s的每个组件比较繁琐 kubeadm是 Kubernetes官 提供的 于快速部署Kubernetes集群的 具 基于Kubernetes v
  • k8s Failed to create pod sandbox错误处理

    错误信息 Failed to create pod sandbox rpc error code Unknown desc failed to get sandbox image k8s gcr io pause 3 2 failed to
  • Kubernets原理分解

    主节点 master 快速介绍 master也要装kubelet和kubeproxy 前端访问 UI CLI kube apiserver scheduler controller manager etcd kubelet kubeprox
  • K8S暴露端口-dubbo应用远程Debug

    1 Dockerfile增加环境变量 ENV JAVA OPTS Xdebug Xrunjdwp transport dt socket address 9901 server y suspend n 2 暴露端口 template ser
  • k8s学习(五)ReplicaSet的使用

    ReplicaSet ReplicaSet 的目的是维护一组在任何时候都处于运行状态的 Pod 副本的稳定集合 可确保指定数量的pod在任何设定的时间运行 因此 它通常用来保证给定数量的 完全相同的 Pod 的可用性 示例 1 nginx
  • 基于minikube的k8s单机环境部署ThingsBoard

    1 minikube安装k8s单机版 https blog csdn net qq 39879126 article details 121587678 2 安装ThingsBoard 下载 https github com thingsb
  • 从Docker到Kubernetes——Kubernetes设计解读之ReplicationController、Service

    文章目录 Kubernetes的设计解读 replication controller 设计解读 replication controller 使用示例 service的设计解读 service的使用示例 Kubernetes的设计解读 r

随机推荐

  • 视图

    视图 简单介绍创建视图语法好处 修改视图语法 删除视图语法 查看视图语法 更新视图以下类型试图不可更新 视图和表比较 简单介绍 MySQL从5 0 1版本开始提供视图功能 xff0c 视图是一个虚拟表 xff0c 行和列的数据来自定义视图的
  • 存储过程和函数

    存储过程和函数 前提变量分类 系统变量使用作用域 自定义变量使用用户变量使用局部变量使用 作用域用户变量和局部变量对比 举例用户变量局部变量 存储过程和函数存储过程基本介绍语法举例 函数储过程和函数区别语法举例无参数又返回有参有返回 流程控
  • mysq简介

    mysql简介 RPM安装查看当前系统是否安装mysql安装查看mysql所属组和密码启动关闭mysql设置开机自启动安装位置修改字符集 配置文件二进制日志log bin错误日志log error查询日志log数据文件 存储引擎查看myis
  • mysql索引常见面试题

    mysql索引常见面试题 建表场景分析索引有查找和排序两大功能 建表 create table test1 id int not null PRIMARY KEY auto increment c1 char 10 c2 char 10 c
  • protobuf引入其它proto文件

    文章目录 同包内直接引用不同包中引用 同包内直接引用 文件结构 span class token operator span proto span class token operator span a proto span class t
  • JAVA_HOME配置

    Linux下配置 查询方法 xff1a span class token function which span java xff1a 查看Java执行命令位置 span class token function ls span lrt u
  • 经典进程同步问题(一)——生产者消费者问题

    目录 一 生产者消费者问题描述 二 解决思路 三 问题求解 xff1a 四 源码 五 运行结果 xff1a 一 生产者消费者问题描述 生产者消费者 xff08 producer customer xff09 问题是一个非常著名的进程同步问题
  • Markdown语法总结

    文章目录 Markdown 学习标题三级标题四级标题 字体引用分割线图片超链接列表有序列表无序列表 表格代码注脚LaTeX公式 表示行内公式 表示行内公式 使用HTML源码 Markdown 学习 标题 三级标题 四级标题 标题最多支持六级
  • linux下设置免密登录

    文章目录 配置本机免密登录设置远程免密登录 配置本机免密登录 未配置免密登录的时候需要输入密码ssh localhost span class token punctuation span root 64 zsx3 span class t
  • 设置静态ip

    设置静态ip 网络配置的配置文件所在位置 etc sysconfig network scripts 查看所有的设备配置文件 span class token punctuation span root zsx1 span class to
  • 退出telnet交互

    telnet 命令 xff1a telnet ip port 进入交互后使用ctrl 43 C无法退出 xff0c 使用ctrl 43 xff0c 进入telnet提示 xff0c 在使用ctrl 43 C
  • Redis集群只读问题

    问题 localhost span class token operator span class token file descriptor important 0 span gt span set n fsfsd span class
  • 批量删除镜像

    docker rmi f docker images grep 10 200 2 20 awk 39 print 3 39
  • Mac本地搭建loki日志追踪

    Loki版本 v2 4 x 参考文档 Helm Grafana Loki documentation 环境准备 helm工具安装 k8s环境支持 xff0c 可以直接使用docker桌面工具自带的k8s工具便于进行资源分配 安装 拉取gra
  • Mac系统配置k8s completion命令补全

    查看当前bash版本 bin bash version GNU bash version span class token number 3 2 span 57 span class token punctuation span span
  • namespaces “xxx“ not found

    使用k8s创建pod时提示namespace不存在 kubectl apply f statefulset deployment yaml n etcd Error from server span class token punctuat
  • yaml语法总结

    语法说明 区分大小写 缩进代表结构之间的层级 缩进最好使用空格 xff0c tab在有的编译器中不一定能支持 用于注释 数据类型 对象 语法 xff1a key value 举例 xff1a name 张三 age 12 数据 语法 xff
  • Centos虚拟机命令行和图形界面切换

    难题 小编最近遇到了问题 xff0c 就是部署git xff0c 但是是需要在命令行窗体中进行的 xff0c 现在安装了窗口版的 xff0c 那么有没有最简单的捷径让我变化一下呢 xff0c 接下来的一幕你会惊讶到如此简单 我们先看一下原理
  • k8s核心概念pod 基本定义和命令

    文章目录 工作负载pod定义pod分类关系静态pod控制器管理的pod 镜像拉取策略 pod常用命令创建pod查看pod删除pod删除单个pod删除多个pod pod的标签命令查看pod标签设置标签通过命令行设置标签通过yaml文件设置标签
  • k8s核心概念 pod调度和生命周期

    文章目录 调度约束方法nodeNamenodeSelector Pod调度流程pod生命周期生命周期概述 pod生命周期流程容器启动容器终止容器重启策略回顾容器生命周期 健康检查健康检查方式Probe探测方式探测方式举例liveness e