Pods

理解 Pod

请参阅 Kubernetes 官方网站文档:Pod

Pod 是 Kubernetes 中可以创建和管理的最小可部署计算单元。Pod(如鲸鱼群中的 pod 或豌豆荚)是一组一个或多个容器(例如 containers),它们共享存储和网络资源,并包含用于描述如何运行这些容器的规范。Pods 是所有更高级控制器(如 DeploymentsStatefulSetsDaemonSets)构建的基础组件。

YAML 文件示例

pod-example.yaml
apiVersion: v1
kind: Pod
metadata:
  name: my-nginx-pod
  labels:
    app: nginx
spec:
  containers:
    - name: nginx
      image: nginx:latest # The container image to use.
      ports:
        - containerPort: 80 # Container ports exposed.
      resources: # Defines CPU and memory requests and limits for the container.
        requests:
          cpu: '100m'
          memory: '128Mi'
        limits:
          cpu: '200m'
          memory: '256Mi'

使用 CLI 管理 Pod

虽然 Pods 通常由更高级控制器管理,但直接对 Pods 执行 kubectl 操作对于故障排查、检查和临时任务非常有用。

调整 Pod 资源

要通过 Kubernetes resize 子资源更新正在运行的 Pod 的 CPU 或内存 requests 和 limits,请参阅 无需中断 Pod 即可调整 Pod 资源级别

查看 Pod

  • 列出当前 namespace 中的所有 Pods:

    kubectl get pods
  • 列出所有 namespace 中的所有 Pods:

    kubectl get pods --all-namespaces
    # Or a shorter version:
    kubectl get pods -A
  • 获取特定 Pod 的详细信息:

    kubectl describe pod <pod-name> -n <namespace>
    
    # Example
    kubectl describe pod my-nginx-pod -n default

查看 Pod 日志

  • 流式获取 Pod 中某个容器的日志(适用于调试):

    kubectl logs <pod-name> -n <namespace>
  • 如果 Pod 有多个容器,必须指定容器名称:

    kubectl logs <pod-name> -c <container-name> -n <namespace>
  • 跟踪日志(随着新日志出现而持续输出):

    kubectl logs -f <pod-name> -n <namespace>

在 Pod 中执行命令

在 Pod 中的特定容器内执行命令(适用于调试,例如访问 shell):

kubectl exec -it <pod-name> -n <namespace> -- <command>

# Example (to get a shell):
kubectl exec -it my-nginx-pod -n default -- /bin/bash

转发到 Pod 的端口

将本地端口转发到 Pod 上的某个端口,使您可以从本地机器直接访问运行在 Pod 内的服务(适用于测试,或无需对外暴露服务即可直接访问):

kubectl port-forward <pod-name> <local-port>:<pod-port> -n <namespace>

#Example
kubectl port-forward my-nginx-pod 8080:80 -n default

运行此命令后,您可以在 Web 浏览器中访问 localhost:8080 ,查看运行在 my-nginx-pod 中的 Nginx Web server。

删除 Pod

  • 删除特定 Pod:

    kubectl delete pod <pod-name> -n <namespace>
    
    # Example
    kubectl delete pod my-nginx-pod -n default
  • 按名称删除多个 Pods:

    kubectl delete pod <pod-name-1> <pod-name-2> -n <namespace>
  • 根据 label selector 删除 Pods(例如,删除所有带有 label app=nginx 的 Pods):

    kubectl delete pods -l app=nginx -n <namespace>

使用 Web 控制台管理 Pod

查看 Pod

平台界面提供了有关 pods 的各种信息,便于快速参考。

操作步骤

  1. Container Platform 中,点击左侧边栏的 Workloads > Pods

  2. 找到您要查看的 Pod。

  3. 点击 deployment 名称以查看 DetailsYAMLConfigurationLogsEventsMonitoring 等内容。

Pod 参数

下面是一些参数说明:

参数说明
Resource Requests & LimitsResource RequestsLimits 定义了 Pod 内 Containers 的 CPU 和内存消耗边界,随后汇总形成 Pod 的整体资源画像。这些值对于 Kubernetes 的 scheduler 将 Pods 高效调度到 Nodes 上,以及 kubelet 执行资源治理都至关重要。
  • Requests:容器被 调度 并运行所需的最低 CPU/内存保障值。Kubernetes scheduler 使用该值来决定 Pod 可以运行在哪个 Node 上。
  • Limits:容器在执行期间允许消耗的最大 CPU/内存值。超过 CPU limit 会导致节流,而超过 memory limit 则会导致容器被终止(Out Of Memory - OOM Killed)。
有关详细单位定义(例如,m 表示 milliCPU,Mi 表示 mebibytes),请参阅 资源单位

Pod 级资源计算逻辑
Pod 的有效 CPU 和内存 Requests 及 Limits 值由其各个容器规格的求和和最大值推导而来。Pod 级 Requests 和 Limits 的计算方式类似;本文档以 Limit 值为例说明其逻辑。当一个 Pod 仅包含标准容器(业务容器)时:Pod 的有效 CPU/Memory Limit 值等于 Pod 内所有容器 CPU/Memory Limit 值的总和。

示例:如果一个 Pod 包含两个容器,其 CPU/Memory Limits 分别为 100m/100Mi 和 50m/200Mi,则该 Pod 聚合后的 CPU/Memory Limit 为 150m/300Mi。当一个 Pod 同时包含 initContainers 和标准容器时:Pod 的 CPU/Memory Limit 值计算步骤如下:
  • 1. 确定所有 initContainers 中最大的 CPU/Memory Limit 值。
  • 2. 计算所有标准容器 CPU/Memory Limit 值之和。
  • 3. 比较步骤 1 和步骤 2 的结果。Pod 的综合 CPU/Memory Limit 将取 CPU 值中的较大者(initContainers 最大值与 containers 总和之间的较大者),以及 Memory 值中的较大者(initContainers 最大值与 containers 总和之间的较大者)。
计算示例:如果一个 Pod 包含两个 initContainers,其 CPU/Memory Limits 分别为 100m/200Mi 和 200m/100Mi,则 initContainers 的最大有效 CPU/Memory Limit 为 200m/200Mi。同时,如果该 Pod 还包含两个标准容器,其 CPU/Memory Limits 分别为 100m/100Mi 和 50m/200Mi,则标准容器的总聚合 Limit 为 150m/300Mi。因此,该 Pod 的综合 CPU/Memory Limit 为 CPU 取 max(200m, 150m),Memory 取 max(200Mi, 300Mi),结果为 200m/300Mi。
Source管理此 Pod 生命周期的 Kubernetes workload controller。这包括 DeploymentsStatefulSetsDaemonSetsJobs
RestartPod 启动以来,Pod 内的 Container 已重启的次数。较高的重启次数通常表示应用程序或其环境存在问题。
Node当前调度并运行该 Pod 的 Kubernetes Node 名称。
Service AccountService Account 是 Kubernetes 对象,它为运行在 Pod 内的进程和服务提供身份,使其能够向 Kubernetes APIServer 进行身份验证并访问它。此字段通常仅在当前登录用户具有平台管理员角色或平台审计员角色时可见,从而允许查看 Service Account 的 YAML 定义。

删除 Pod

删除 pods 可能会影响计算组件的运行;请谨慎操作。

使用场景

  • 及时将 pods 恢复到期望状态:如果某个 pods 处于影响业务运行的状态,例如 PendingCrashLoopBackOff,在处理完错误信息后手动删除该 pods,可以帮助其快速恢复到期望状态,例如 Running。此时,被删除的 pods 会在当前节点上重新创建或重新调度。

  • 运维清理资源:某些 podss 会达到一个不再变化的指定阶段,这些组通常会大量积累,给其他 podss 的管理带来复杂性。需要清理的 podss 可能包括由于节点资源不足而处于 Evicted 状态的 podss,或者由周期性计划任务触发而处于 Completed 状态的 podss。在这种情况下,被删除的 podss 将不再存在。

    注意:对于计划任务,如果您需要查看每次任务执行的日志,不建议删除对应处于 Completed 状态的 podss。

操作步骤

  1. 进入 Container Platform

  2. 在左侧导航栏中,点击 Workloads > Pods

  3. (单独删除)点击要删除的 pods 右侧的 ⋮ > Delete,然后确认。

  4. (批量删除)选择要删除的 podss,点击列表上方的 Delete,然后确认。