k8s(二):Pod

Pod

pod 是K8s中最小的可部署单元,用于容纳一个或多个容器。Pod为容器提供了一个共享的环境,包括网络命名空间、存储卷和IP地址。

pod的阶段(phase)

  • Pending: Pod 已被 Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行。此阶段包括等待 Pod 被调度的时间和通过网络下载镜像的时间。

  • Running: Pod 已经绑定到了某个节点,Pod 中所有的容器都已被创建。至少有一个容器仍在运行,或者正处于启动或重启状态。

  • Succeeded: Pod 中的所有容器都已成功终止,并且不会再重启。

  • Failed: Pod 中的所有容器都已终止,并且至少有一个容器是因为失败终止。也就是说,容器以非 0 状态退出或者被系统终止。

  • Unknown: 因为某些原因无法取得 Pod 的状态。这种情况通常是因为与 Pod 所在主机通信失败。

Pod 生命周期详细解析:

1. 创建与调度阶段:
  • Pod 创建: 可通过定义 Pod 的 YAML 创建 Pod 对象。

    apiVersion: v1
    kind: Pod
    metadata:
      name: example-pod
    spec:
      containers:
        - name: container-1
          image: nginx
    
    kubectl apply -f pod-definition.yaml
    
  • 调度器考虑以下因素:

    • 节点资源: 调度器检查节点的资源利用率,确保节点上有足够的 CPU、内存等资源来容纳 Pod。
    • 节点亲和性和反亲和性: 用户可以通过配置亲和性和反亲和性规则,影响 Pod 被调度到哪个节点。
    • Pod 亲和性和反亲和性: Pod 本身也可以定义与节点的亲和性和反亲和性规则。
    • Pod 优先级: Pod 的优先级和调度器的优先级策略也会影响调度决策。
    • 调度约束: 用户可以通过 PodSpec 中的 NodeSelector 字段设置调度约束,将 Pod 调度到具有特定标签的节点。
  • 节点选择: 调度器选择一个满足调度约束和条件的节点,将 Pod 分配到该节点上。如果找不到合适的节点,Pod 将保持在未调度状态。

  • Pod 被接受: 选定的节点上的 Kubelet 接受 Pod,并开始初始化过程。

  • 卷挂载: 一旦 Pod 被接受,Kubelet 开始挂载 Pod 所需的卷,以满足容器的存储需求。

2. 运行:
  1. 存在 Init 容器: 如果 Pod 的配置中定义了 Init 容器,kubelet 将按照顺序执行这些 Init 容器。每个 Init 容器负责执行一些初始化任务,例如加载配置、准备数据等。这些任务在主容器启动之前完成,确保主容器运行时具备所需的环境。
  2. Initialized 状态设置: 一旦所有 Init 容器成功完成,kubelet 将设置 Pod 的 Initialized 状态为 True。这表示 Pod 已经完成了初始化阶段,并且已经准备好开始运行主容器。

探针配置:

在 Pod 中定义探针是为了监控容器的健康状况。在上述提供的 YAML 示例中,定义了一个 readinessProbe,该探针使用 HTTP GET 请求检查容器的 /health 路径是否可达。以下是该探针的配置细节:

readinessProbe:
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 10
  • httpGet 配置: 使用 HTTP GET 请求进行健康检查,检查路径为 /health,端口为 8080。
  • initialDelaySeconds 探针将在容器启动后等待 5 秒钟再执行第一次检查。
  • periodSeconds 探针将每隔 10 秒执行一次检查。

PodReadyToStartContainersCondition:

如果启用了 PodReadyToStartContainersCondition 特性门控,Kubelet 会通过 Pod 的 status.conditions 字段中的 PodReadyToStartContainers 状态来报告 Pod 是否达到了初始化里程碑。这个条件反映了 Pod 是否具备了运行容器的必要条件,例如 Init 容器的成功完成、网络的正确配置等。 PodReadyToStartContainersCondition 的设置为 True 表示 Pod 已经准备好开始运行容器。

3. 终止阶段:
  • 体面终止过程: Pod 在终止时尝试以优雅的方式关闭容器,可以配置 terminationGracePeriodSeconds

    terminationGracePeriodSeconds: 30
    
  • Pod 的垃圾收集: PodGC 控制器监视已终止的 Pod,当数量超过阈值时,删除已终止的 Pod 防止资源泄露。

  • 强制终止: 在需要立即删除 Pod 时,可以使用 kubectl delete 命令并设置宽限期为 0。

    kubectl delete pod example-pod --grace-period=0 --force
    

k8中的三种不同类型的探针

在 Kubernetes 中,探针(Probes)用于定期检查容器的健康状态,以确保容器能够正常运行。主要有三种类型的探针:livenessProbereadinessProbestartupProbe

1. livenessProbe 存活探针:

  • 目的: 指示容器是否仍在运行。

  • 配置方式:

    livenessProbe:
      exec:
        command:
          - cat
          - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 10
    
    • exec:使用指定的命令检查容器是否存活。如果命令成功执行(返回码为0),则认为容器存活。
    • initialDelaySeconds:容器启动后等待5秒再执行第一次检查。
    • periodSeconds:每隔10秒执行一次检查。

2. readinessProbe 就绪探针:

  • 目的: 指示容器是否准备好接收流量。

  • 配置方式:

    readinessProbe:
      httpGet:
        path: /health
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 10
    
    • httpGet:对容器的指定路径和端口执行 HTTP GET 请求,如果返回码在200到399之间,认为容器准备好接收流量。
    • initialDelaySeconds:容器启动后等待5秒再执行第一次检查。
    • periodSeconds:每隔10秒执行一次检查。

3. startupProbe 启动探针:

  • 目的: 指示容器中的应用是否已经启动。

  • 配置方式:

    startupProbe:
      exec:
        command:
          - check-app-started.sh
      initialDelaySeconds: 10
      periodSeconds: 5
    
    • exec:使用指定的命令检查应用是否已经启动。如果命令成功执行,认为应用已经启动。
    • initialDelaySeconds:容器启动后等待10秒再执行第一次检查。
    • periodSeconds:每隔5秒执行一次检查。

相关推荐

  1. k8s():Pod

    2023-12-06 03:06:02       55 阅读
  2. <span style='color:red;'>k</span><span style='color:red;'>8</span><span style='color:red;'>s</span>-<span style='color:red;'>Pod</span>

    k8s-Pod

    2023-12-06 03:06:02      53 阅读
  3. <span style='color:red;'>K</span><span style='color:red;'>8</span><span style='color:red;'>S</span> <span style='color:red;'>POD</span>

    K8S POD

    2023-12-06 03:06:02      36 阅读
  4. K8S Pod

    2023-12-06 03:06:02       31 阅读
  5. <span style='color:red;'>k</span><span style='color:red;'>8</span><span style='color:red;'>s</span>-<span style='color:red;'>Pod</span>

    k8s-Pod

    2023-12-06 03:06:02      37 阅读
  6. <span style='color:red;'>k</span><span style='color:red;'>8</span><span style='color:red;'>s</span>-<span style='color:red;'>pod</span>

    k8s-pod

    2023-12-06 03:06:02      31 阅读
  7. <span style='color:red;'>k</span><span style='color:red;'>8</span><span style='color:red;'>s</span>之<span style='color:red;'>pod</span>

    k8spod

    2023-12-06 03:06:02      43 阅读
  8. K8S测试pod

    2023-12-06 03:06:02       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-06 03:06:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-06 03:06:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-06 03:06:02       82 阅读
  4. Python语言-面向对象

    2023-12-06 03:06:02       91 阅读

热门阅读

  1. 50-75GHz大功率六倍频源设计

    2023-12-06 03:06:02       54 阅读
  2. 第七章 函数矩阵

    2023-12-06 03:06:02       51 阅读
  3. 网站安全攻防:降本增效的解决之道

    2023-12-06 03:06:02       63 阅读
  4. js数组合并的方法,以及各方法的区别

    2023-12-06 03:06:02       54 阅读
  5. react传值

    2023-12-06 03:06:02       49 阅读
  6. linux审计工具aureport

    2023-12-06 03:06:02       59 阅读
  7. VueUse使用

    2023-12-06 03:06:02       68 阅读
  8. Clickhouse遇到密码错误如何修改密码

    2023-12-06 03:06:02       53 阅读