K8S Pod 基础解析-分篇-叩丁狼

3.1 POD

3.1.1 Pod 配置文件

复制代码
apiVersion: v1 # api 文档版本
kind: Pod  # 资源对象类型,也可以配置为像Deployment、StatefulSet这一类的对象

metadata: # Pod 相关的元数据,用于描述 Pod 的数据
  name: nginx-demo # Pod 的名称
  labels: # 定义 Pod 的标签
    type: app # 自定义 label 标签,名字为 type,值为 app
    test: 1.0.0 # 自定义 label 标签,描述 Pod 版本号
  namespace: 'default' # 命名空间的配置

spec: # 期望 Pod 按照这里面的描述进行创建
  containers: # 对于 Pod 中的容器描述
  - name: nginx # 容器的名称
    image: nginx:1.7.9 # 指定容器的镜像
    imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的
    command: # 指定容器启动时执行的命令
    - nginx
    - -g
    - 'daemon off;' # nginx -g 'daemon off;'
    workingDir: /usr/share/nginx/html # 定义容器启动后的工作目录
    ports:
    - name: http # 端口名称
      containerPort: 80 # 描述容器内要暴露什么端口
      protocol: TCP # 描述该端口是基于哪种协议通信的
    - env: # 环境变量
      name: JVM_OPTS # 环境变量名称
      value: '-Xms128m -Xmx128m' # 环境变量的值
    reousrces:
      requests: # 最少需要多少资源
        cpu: 100m # 限制 cpu 最少使用 0.1 个核心
        memory: 128Mi # 限制内存最少使用 128兆
      limits: # 最多可以用多少资源
        cpu: 200m # 限制 cpu 最多使用 0.2 个核心
        memory: 256Mi # 限制 最多使用 256兆
  restartPolicy: OnFailure # 重启策略,只有失败的情况才会重启

3.1.2 探针

3.1.2.1 概念

用于探测容器中应用是否正在运行,如果探测失败,kubectl会根据配置的重启策略进行重启.没有配置默认容器启动成功,不会重启.

3.1.2.2类型
  • StartupProbe : 优先与下面<会先禁用其他探针>,用于判断用用是否启动,启动成功后开放下面(LiveNessProbe,ReadinessProbe)的探针

    • 为什么需要 Startup Probe : 为了解决一个特定问题:对于那些启动速度非常慢的应用程序(例如大型Java应用、需要初始化大量数据的应用),在启动完成之前,它们的存活探针和就绪探针肯定会失败。如果没有 startupProbe
      • 存活探针 (livenessProbe) 会在失败多次后,误以为应用启动失败,从而错误地重启这个正在努力启动的容器,导致它永远无法成功启动。
    • 有了 startupProbe
      • 在启动探针成功之前,存活探针和就绪探针都会被禁用。

      • 启动探针拥有非常高的 failureThreshold,允许容器在较长时间内(例如5分钟)持续报告"未启动",而不会触发重启。一旦应用程序自己准备好了,启动探针成功,控制权就交给 livenessProbereadinessProbe 来负责运行时的健康检查。

        startupProbe: # 定义了一个启动探针,用于检测容器内的应用程序是否已完成启动。
        # 它的主要目的是保护慢启动容器,在其完成启动前,暂停存活探针和就绪探针的执行。
        httpGet: # 指定使用HTTP GET请求的方式进行启动检查。
        path: /api/startup # HTTP GET请求访问的服务器路径。这里检查的是容器内服务的'/api/startup'端点。
        # 这个端点通常被设计为在应用程序完全启动成功后才返回成功响应。
        port: 80 # HTTP GET请求访问的容器端口号。这里检查的是容器内80端口(标准的HTTP端口)。

  • LiveNessProbe : 重启相关,判断是否运行. # 用于探测容器中的应用是否运行,如果探测失败,kubelet 会根据配置的重启策略进行重启,若没有配置,默认就认为容器启动成功,不会执行重启策略。

    • 等待 :容器启动后,先等待 60 秒 (initialDelaySeconds)。

    • 开始检查 :60秒后,发起第一次健康检查。向容器内 8080 端口的 /health 路径发送一个 HTTP GET 请求。

    • 等待响应 :它期望在 5 秒内 (timeoutSeconds) 收到一个成功的 HTTP 响应状态码 (2xx 或 3xx)。

    • 判定结果

      • 如果请求在5秒内成功返回,则探测成功
      • 如果请求超时(5秒内无响应)或返回错误状态码(如4xx, 5xx),则探测失败
    • 后续检查 :无论第一次成功与否,它都会每 10 秒 (periodSeconds) 重复一次步骤2-4的检查

    • 失败处理 :如果连续 5 次 (failureThreshold) 探测都失败了,Kubernetes 就会判定容器不健康,并重启这个容器。

    • 恢复处理 :一旦失败后(比如连续失败了3次),只要有一次探测成功,失败计数器就会被重置。因为 successThreshold1

      livenessProbe: # 定义了一个存活探针,用于检测容器是否仍在健康运行。如果探测失败,k8s会重启容器。
      failureThreshold: 5 # 连续探测失败5次后,k8s才会将容器判定为不健康并重启它。这提供了一定的缓冲,避免因临时故障重启。
      httpGet: # 指定使用HTTP GET请求的方式进行健康检查。
      path: /health # HTTP GET请求访问的服务器路径。这里检查的是容器内Web服务的'/health'端点。
      port: 8080 # HTTP GET请求访问的容器端口号。这里检查的是容器内8080端口。
      scheme: HTTP # 用于连接的健康检查的协议(HTTP 或 HTTPS)。这里使用的是HTTP协议。
      initialDelaySeconds: 60 # 容器启动后,等待60秒后才开始第一次执行存活探测。给应用足够的启动时间。
      periodSeconds: 10 # 每次执行存活探测的间隔时间是10秒。即每10秒检查一次。
      successThreshold: 1 # 探测失败后,只要有一次成功,即被认定为探测成功。对于livenessProbe,此值必须为1。
      timeoutSeconds: 5 # 每次探测请求的超时时间为5秒。如果5秒内没有响应,则本次探测判定为失败。

  • ReadinessProbe : 是否接受消息<监听>,用于探测容器内的程序是否健康

    • 检查容器是否准备好工作。失败只会停止向该容器发送流量,但不会重启它。

      readinessProbe: # 定义了一个就绪探针,用于检测容器是否已准备就绪,可以开始接收外部流量。
      failureThreshold: 3 # 连续探测失败3次后,k8s会将容器标记为"未就绪"(Unready)。该容器将从服务的负载均衡器中移除,不再接收任何流量。
      httpGet: # 指定使用HTTP GET请求的方式进行就绪检查。
      path: /ready # HTTP GET请求访问的服务器路径。这里检查的是容器内Web服务的'/ready'端点。
      port: 8181 # HTTP GET请求访问的容器端口号。这里检查的是容器内8181端口。
      scheme: HTTP # 用于连接的健康检查的协议(HTTP 或 HTTPS)。这里使用的是HTTP协议。
      periodSeconds: 10 # 每次执行就绪探测的间隔时间是10秒。即每10秒检查一次容器是否就绪。
      successThreshold: 1 # 对于就绪探针,探测失败后,只要有一次成功,该容器就会被标记为"就绪"(Ready),并重新开始接收流量。
      timeoutSeconds: 1 # 每次探测请求的超时时间为1秒。如果1秒内没有响应,则本次探测判定为失败。

3.1.2.3 探测方式
  • ExecAction : 在容器内部执行一个命令,看返回值

    livenessProbe:
    exec:
    command:
    - cat
    - /health

  • TCPSocketAction : 通过TCP连接检测容器端口是否开放,判断是否健康

    livenessProbe:
    tcpSocket:
    port: 80

  • HTTPGetAction : 配置HTTP请求,看状态码

    livenessProbe:
    failureThreshold: 5 # 允许失败的阈值
    httpGet:
    path: /health
    port: 8080
    scheme: HTTP # 通过http请求8080端口的/healthAPI,检测容器是否健康
    httpHeaders:
    - name: xxx
    value: xxx

3.1.2.4 参数配置 :
参数 说明
initalDelayScconds 初始化时间
timeoutSeconds 超时时间
priodSeconds 间隔时间
successThreshold 检查几次成功算成功
failureThreshold 检查几次失败算失败
3.1.2.5 常用命令
复制代码
kubectl create -f nginx-po.yml # 通过指定的资源文件创建资源 
kubectl describe po nginx-po # 查看指定资源的具体情况,在这里可以看到探针的处理情况 
kubectl get po nginx-po # 获取指定pod资源的启动情况 
kubectl exec -it nginx-po -c nginx -- cat /inited # 查看指定pod资源的初始化日志

3.1.3 生命周期

复制代码
初始化 -> 容器创建完成 -> posStart钩子 -> 对容器的各种操作 -> preStop钩子 -> 销毁容器

apiVersion: v1 # api 文档版本
kind: Pod  # 资源对象类型,也可以配置为像Deployment、StatefulSet这一类的对象

metadata: # Pod 相关的元数据,用于描述 Pod 的数据
  name: nginx-po # Pod 的名称
  labels: # 定义 Pod 的标签
    type: app # 自定义 label 标签,名字为 type,值为 app
    test: 1.0.0 # 自定义 label 标签,描述 Pod 版本号
  namespace: 'default' # 命名空间的配置

spec: # 期望 Pod 按照这里面的描述进行po

  # 变为删除中的状态后,会给 pod 一个宽限期,让 pod 去执行一些清理或销毁操作。
  terminationGracePeriodSeconds: 30

  containers: # 对于 Pod 中的容器描述
  - name: nginx # 容器的名称
    image: nginx:1.7.9 # 指定容器的镜像
    imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的

    # 可以控制容器创建之后和容器停止之前完成的额外的动作....
    lifecycle:
      postStart: # 容创建完成后执行的动作,不能保证该操作一定在容器的 command 之前执行,一般不使用
        exec: # 可以是 exec / httpGet / tcpSocket
          command:
            - sh
            - -c
            - 'mkdir /data'
      preStop: # 在容器停止前执行的动作
        httpGet: # 发送一个 http 请求
          path: /
          port: 80
        exec: # 执行一个命令
          command:
            - sh
            - -c
            - sleep 9

    startupProde: # 应用启动探针配置
        tcpSocket:
            port: 80
        failureThreshold: 3 # 失败3次才算真正的失败
        periodSecond: 10 # 间隔时间
        successThreshold: 1 # 多少次成功算成功
        timeoutSeconds: 5 # 超时时间
    command: # 指定容器启动时执行的命令
    - nginx
    - -g
    - 'daemon off;' # nginx -g 'daemon off;'
    workingDir: /usr/share/nginx/html # 定义容器启动后的工作目录
    ports:
    - name: http # 端口名称
      containerPort: 80 # 描述容器内要暴露什么端口
      protocol: TCP # 描述该端口是基于哪种协议通信的
    - env: # 环境变量
      name: JVM_OPTS # 环境变量名称
      value: '-Xms128m -Xmx128m' # 环境变量的值
    reousrces:
      requests: # 最少需要多少资源
        cpu: 100m # 限制 cpu 最少使用 0.1 个核心
        memory: 128Mi # 限制内存最少使用 128兆
      limits: # 最多可以用多少资源
        cpu: 200m # 限制 cpu 最多使用 0.2 个核心
        memory: 256Mi # 限制 最多使用 256兆
  restartPolicy: OnFailure # 重启策略,只有失败的情况才会重启

Pod 的退出流程, endpoint 删除 pod 的IP 地址 -> Pod 状态变为 terminating 状态 -> 执行 perStop 钩子函数(注册中心下线,数据的清理与销毁)
相关推荐
阿里云云原生11 小时前
不改代码也能监控 AI Agent?揭秘 OBI 如何在内核层精准解析 GenAI 语义流量
云原生·agent
众人皆醒我独醉12 小时前
Pod 一直 Terminating,死活删不掉?三个凶手,每一个你都意想不到
面试·kubernetes
飞翔沫沫情13 小时前
K8s Alloy 采集 Pod 控制台日志
云原生·容器·kubernetes
潮起鲸落入海19 小时前
Kubernetes Metric Server, Quota and Limits
容器·kubernetes
梦想的颜色19 小时前
Docker 容器化本地部署 Claude Code 完整硬核教程|隔离沙盒 + 国产模型直连 + 持久化 Skill
运维·容器·ai 工程化·沙盒隔离·docker 本地部署·claude code硬核实战·国内国产模型接入
摇滚侠19 小时前
云原生 Java 架构师的第一课 K8s+Docker+KubeSphere+DevOps 19-25
java·云原生·kubernetes
渣渣盟19 小时前
Docker 运维常用命令手册(含扩容与实战)
运维·docker·容器
我叫张小白。21 小时前
一个微服务电商+社区项目(瓷韵app)的技术深度复盘
docker·微服务·云原生·架构
咕噜咕噜的猪大侠21 小时前
《K8s 核心知识梳理:Deployment 滚动更新、JobCronJob、DaemonSet 和 Service》
云原生·容器·kubernetes
虚心的百褶裙21 小时前
远程调用服务架构设计及zookeeper技术详解(下篇)
分布式·zookeeper·云原生