Get the FREE Ultimate OpenClaw Setup Guide →

pod-management

Scanned
npx machina-cli add skill chaterm/terminal-skills/pod-management --openclaw
Files (1)
SKILL.md
5.3 KB

Pod 管理与调试

概述

Pod 生命周期管理、日志查看、exec 调试等技能。

Pod 查看

# 列出 Pod
kubectl get pods
kubectl get pods -o wide                    # 详细信息
kubectl get pods -A                         # 所有命名空间
kubectl get pods -n namespace
kubectl get pods -l app=nginx               # 按标签过滤
kubectl get pods --field-selector status.phase=Running

# Pod 详情
kubectl describe pod pod-name
kubectl get pod pod-name -o yaml
kubectl get pod pod-name -o jsonpath='{.status.phase}'

日志查看

# 查看日志
kubectl logs pod-name
kubectl logs pod-name -c container-name     # 指定容器
kubectl logs pod-name --all-containers      # 所有容器

# 实时跟踪
kubectl logs -f pod-name
kubectl logs -f pod-name --since=1h         # 最近1小时
kubectl logs -f pod-name --tail=100         # 最后100行

# 上一个容器的日志(崩溃后)
kubectl logs pod-name --previous

# 多 Pod 日志
kubectl logs -l app=nginx                   # 按标签
kubectl logs -l app=nginx --max-log-requests=10

容器调试

exec 进入容器

# 进入容器
kubectl exec -it pod-name -- /bin/bash
kubectl exec -it pod-name -- sh
kubectl exec -it pod-name -c container-name -- /bin/bash

# 执行命令
kubectl exec pod-name -- ls -la
kubectl exec pod-name -- cat /etc/hosts
kubectl exec pod-name -- env

调试容器

# 使用 debug 容器(K8s 1.18+)
kubectl debug pod-name -it --image=busybox --target=container-name

# 复制 Pod 进行调试
kubectl debug pod-name -it --copy-to=debug-pod --container=debug --image=busybox

# 节点调试
kubectl debug node/node-name -it --image=busybox

端口转发

# 转发到本地
kubectl port-forward pod-name 8080:80
kubectl port-forward pod-name 8080:80 --address 0.0.0.0

# 后台运行
kubectl port-forward pod-name 8080:80 &

Pod 生命周期

创建 Pod

# pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
    livenessProbe:
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 10
      periodSeconds: 5
    readinessProbe:
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 5
      periodSeconds: 3
kubectl apply -f pod.yaml
kubectl create -f pod.yaml

删除 Pod

kubectl delete pod pod-name
kubectl delete pod pod-name --force --grace-period=0   # 强制删除
kubectl delete pods -l app=nginx                        # 按标签删除
kubectl delete pods --all -n namespace                  # 删除所有

Pod 状态

# 查看 Pod 状态
kubectl get pod pod-name -o jsonpath='{.status.phase}'

# 等待 Pod 就绪
kubectl wait --for=condition=Ready pod/pod-name --timeout=60s

# 查看事件
kubectl get events --field-selector involvedObject.name=pod-name

资源管理

查看资源使用

# Pod 资源使用
kubectl top pods
kubectl top pods -n namespace
kubectl top pod pod-name --containers

# 按资源排序
kubectl top pods --sort-by=cpu
kubectl top pods --sort-by=memory

资源配置

resources:
  requests:
    memory: "64Mi"
    cpu: "250m"
  limits:
    memory: "128Mi"
    cpu: "500m"

常见场景

场景 1:排查 Pod 启动失败

# 1. 查看 Pod 状态
kubectl get pod pod-name -o wide

# 2. 查看事件
kubectl describe pod pod-name | grep -A 20 Events

# 3. 查看日志
kubectl logs pod-name
kubectl logs pod-name --previous    # 如果容器重启

# 4. 检查镜像
kubectl get pod pod-name -o jsonpath='{.spec.containers[*].image}'

场景 2:排查 CrashLoopBackOff

# 1. 查看退出原因
kubectl describe pod pod-name | grep -A 5 "Last State"

# 2. 查看上一次日志
kubectl logs pod-name --previous

# 3. 检查资源限制
kubectl describe pod pod-name | grep -A 10 "Limits"

# 4. 检查探针配置
kubectl get pod pod-name -o yaml | grep -A 10 "livenessProbe"

场景 3:临时运行调试 Pod

# 运行临时 Pod
kubectl run debug --rm -it --image=busybox -- sh
kubectl run debug --rm -it --image=nicolaka/netshoot -- bash

# 在特定节点运行
kubectl run debug --rm -it --image=busybox --overrides='{"spec":{"nodeName":"node-name"}}' -- sh

场景 4:复制文件

# 从 Pod 复制到本地
kubectl cp pod-name:/path/to/file ./local-file
kubectl cp namespace/pod-name:/path/to/file ./local-file

# 从本地复制到 Pod
kubectl cp ./local-file pod-name:/path/to/file

故障排查

状态可能原因排查方法
Pending资源不足/调度问题kubectl describe pod 查看事件
ImagePullBackOff镜像拉取失败检查镜像名、仓库认证
CrashLoopBackOff应用崩溃kubectl logs --previous
OOMKilled内存超限增加 memory limits
Evicted节点资源不足检查节点资源、清理 Pod
Unknown节点失联检查节点状态

Source

git clone https://github.com/chaterm/terminal-skills/blob/main/kubernetes/pod-management/SKILL.mdView on GitHub

Overview

pod-management 提供对 Pod 的全生命周期管理、日志查看、exec 调试、调试容器、端口转发以及资源查看等能力。你可以在一个技能内完成从创建到删除、从故障诊断到性能调优的日常运维工作,提升诊断效率与操作可重复性。

How This Skill Works

你使用 kubectl 针对 Pod 对象发出请求,kubectl 会向 Kubernetes API Server 获取 Pod 状态、事件和日志,并通过容器运行时返回执行结果。对于调试场景,你可以使用 kubectl exec 进入容器,或 kubectl debug 启动临时调试容器(K8s 1.18+),必要时通过 kubectl port-forward 将 Pod 服务暴露到本地。你还可以通过 kubectl top 查看资源使用情况,kubectl wait 等待就绪,以及 kubectl cp 实现本地与 Pod 之间的文件传输。

When to Use It

  • 需要快速诊断 Pod 的状态、事件和日志
  • 排查启动失败和 CrashLoopBackOff 的情况
  • 进行临时调试(exec、debug 容器)而不修改应用代码
  • 查看多 Pod 日志、按标签筛选或跨命名空间
  • 将本地端口暴露给集群服务进行本地测试

Quick Start

  1. 确保你的 kubectl 已指向目标集群并具备相应权限;kubectl get pods -A 查看全局 Pod 列表;kubectl describe pod <pod-name> 查看事件与状态;kubectl logs <pod-name> [-c <container> | --all-containers] 查看日志;如需交互或临时调试,使用 kubectl exec -it <pod-name> -- /bin/bash,或 kubectl debug <pod-name> -it --image=busybox --target=<container-name> 进行调试。

Best Practices

  • 尽量在跨命名空间或大规模 Pod 集群中使用标签选择器,如 kubectl get pods -A -l app=nginx;
  • 查看事件以理解状态变更,必要时结合 kubectl describe pod <pod-name];
  • 对于重启导致的上次日志,使用 kubectl logs <pod-name> --previous;
  • 进行调试时优先使用 kubectl debug/临时调试容器,而非修改正在运行的 Pod;
  • 使用 kubectl port-forward 进行本地测试时,注意只在受控网络环境中暴露端口,并可结合 --address 0.0.0.0 提供本地访问;
  • 监控资源时结合 kubectl top 以及 Pod YAML 的 resourceRequests 和 limits 来预防资源争抢。

Example Use Cases

  • 场景:排查 Pod 启动失败。先用 kubectl get pod 查看状态,再 kubectl describe pod 获取事件,最后使用 kubectl logs 查看日志以定位问题;
  • 场景:CrashLoopBackOff 调试。查看上一次退出的原因(kubectl logs --previous),再通过 kubectl describe pod 查看探针、资源和镜像信息;
  • 场景:临时运行调试 Pod。使用 kubectl debug 或 kubectl run debug --rm -it --image=busybox 来进行临时调试,调试结束后 Pod 会自动清理;
  • 场景:跨 Pod/多容器日志分析。通过 kubectl logs -l app=nginx --all-containers 或 kubectl logs pod-name -c container-name 获取目标容器日志并聚合分析;
  • 场景:将服务暴露到本地进行测试。使用 kubectl port-forward pod-name 8080:80 在本地访问 Pod 暴露的端口,并可通过 --address 0.0.0.0 全局监听来共享给同机的其他工具进行测试。

Frequently Asked Questions

Add this skill to your agents

Related Skills

Sponsor this space

Reach thousands of developers