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 钩子函数(注册中心下线,数据的清理与销毁)
相关推荐
阿里云云原生2 小时前
极速导入,便捷无忧!LoongCollector 一次性文件采集能力上线
云原生
丘桔2 小时前
k8s01:容器运行时之争
云原生·容器·kubernetes
2401_891655812 小时前
开源项目吐槽大会技术文章大纲
数据库·云原生
步步为营DotNet3 小时前
#.NET Aspire在云原生应用部署与管理中的深度实践
云原生·.net
学不完的4 小时前
Docker 的安全优化
运维·安全·docker·容器·eureka
恋红尘4 小时前
K8S 服务发现-叩丁狼
linux·docker·kubernetes
sleP4o5 小时前
[Docker] ‘s Basic Usage
docker·容器·eureka
掘根5 小时前
【微服务即时通讯】用户管理子服务2
微服务·云原生·架构
一直都在5725 小时前
K8s详解
云原生·容器·kubernetes