Skip to content
← 返回Kubernetes列表
实践公司适用

公司适用 · 请结合本文的项目背景与团队约定使用。

kubectl 进阶命令 · 精确筛选资源至API 原始请求与 proxy ​

返回分篇目录

本文承接 基础命令,按筛选与输出 → 受控变更 → 容器调试 → 节点维护 → 故障分层 → 脚本防护组织。历史 Helm 仓库/ChartMuseum 操作见独立案例。

示例主要面向 Bash/Zsh。debug profile 等参数受客户端版本和集群策略影响,执行前用本机帮助确认。生产变更先核对上下文、命名空间和目标。

kubectl 进阶命令 ​

本文承接 基础命令,按筛选与输出 → 受控变更 → 容器调试 → 节点维护 → 故障分层 → 脚本防护组织。历史 Helm 仓库/ChartMuseum 操作见独立案例。

示例主要面向 Bash/Zsh。debug profile 等参数受客户端版本和集群策略影响,执行前用本机帮助确认。生产变更先核对上下文、命名空间和目标。

精确筛选资源 ​

标签选择器由客户端传给 API Server,适合业务维度;字段选择器只支持资源预定义字段。

bash
kubectl -n demo get pods -l 'app=web,tier in (frontend,edge)'
kubectl -n demo get pods --field-selector=status.phase=Pending
kubectl -n demo get pods --field-selector=spec.nodeName=worker-01
kubectl get events -A --field-selector=type=Warning

不确定支持哪些字段时查看资源文档;不受支持的字段会被服务器拒绝。大量资源查询要尽量在服务端过滤。

JSONPath、Custom Columns 与 jq ​

bash
# Pod 名、节点、Pod IP
kubectl -n demo get pods -o \
  custom-columns='NAME:.metadata.name,NODE:.spec.nodeName,IP:.status.podIP'

# 输出所有容器镜像
kubectl -n demo get pods -o \
  jsonpath='{range .items[*]}{.metadata.name}{"\t"}{range .spec.containers[*]}{.image}{" "}{end}{"\n"}{end}'

# JSON 交给 jq 做复杂计算
kubectl -n demo get pods -o json | jq -r \
  '.items[] | [.metadata.name, .status.phase, (.spec.nodeName // "-")] | @tsv'

JSONPath 的 Shell 引号在 Windows 与 Unix 不同。生产脚本优先 -o json | jq 并检查空值和退出码;不要解析表格列。

bash
# 指定 Pod 的 Ready 条件
kubectl -n <namespace> get pod <pod> \
  -o jsonpath='{range .status.conditions[?(@.type=="Ready")]}{.status}{"\t"}{.reason}{"\n"}{end}'

Ready 条件与容器资源输出 ​

bash
# 非 Running Pod
kubectl -n <namespace> get pods -o json | \
  jq -r '.items[] | select(.status.phase != "Running") | [.metadata.name, .status.phase] | @tsv'

# 每个容器的 requests/limits
kubectl -n <namespace> get pods -o json | jq -r '
  .items[] as $pod
  | $pod.spec.containers[]
  | [$pod.metadata.name, .name,
     (.resources.requests.cpu // "-"),
     (.resources.requests.memory // "-"),
     (.resources.limits.cpu // "-"),
     (.resources.limits.memory // "-")]
  | @tsv'

排序与最近事件 ​

bash
kubectl -n demo get pods --sort-by=.metadata.creationTimestamp
kubectl -n demo get events --sort-by=.lastTimestamp
kubectl -n demo events --for pod/web-abc --watch

Event 是短期、尽力而为的诊断数据,可能聚合、限流和过期。长期审计不能依赖 Event。

Server-Side Apply 与冲突 ​

bash
kubectl apply --server-side --dry-run=server \
  --field-manager=platform-ci -f manifests/
kubectl diff --server-side --field-manager=platform-ci -f manifests/
kubectl apply --server-side --field-manager=platform-ci -f manifests/

# 查看字段管理者
kubectl -n demo get deployment web -o json | jq '.metadata.managedFields'

遇到 conflict 时,应定位哪个管理者拥有字段并协调来源。--force-conflicts 会夺取字段所有权,不是普通重试参数;只有迁移字段负责人并确认影响后才能使用。

Patch 类型 ​

临时打开编辑器修改资源见 edit 与声明式清单。

bash
# Merge Patch:把副本数改为 5
kubectl -n demo patch deployment web --type=merge \
  -p '{"spec":{"replicas":5}}'

# JSON Patch:按路径替换字段
kubectl -n demo patch deployment web --type=json \
  -p='[{"op":"replace","path":"/spec/replicas","value":5}]'

# Strategic Merge Patch:内置类型可按 merge key 合并容器列表
kubectl -n demo patch deployment web --type=strategic \
  -p '{"spec":{"template":{"spec":{"containers":[{"name":"web","image":"nginx:1.29.0"}]}}}}'

CRD 不支持 Strategic Merge Patch。数组的 Merge/替换语义容易出错,先加 --dry-run=server -o yaml 检查结果。长期变更仍应回写 Git。

伸缩及副本数前置条件见 手工伸缩。

修改镜像见 发布与镜像更新,修改环境变量和 requests/limits 见 环境与资源。

Rollout 操作 ​

bash
kubectl -n demo rollout status deployment/web --timeout=5m
kubectl -n demo rollout history deployment/web
kubectl -n demo rollout history deployment/web --revision=3
kubectl -n demo rollout pause deployment/web
kubectl -n demo rollout resume deployment/web
kubectl -n demo rollout restart deployment/web
kubectl -n demo rollout undo deployment/web --to-revision=3

回滚 Deployment 只恢复 PodTemplate,不恢复 ConfigMap、Secret、数据库 Schema 和外部依赖。先确认历史版本兼容性,再执行 undo。

五、Pod 状态和容器退出原因 ​

bash
kubectl -n <namespace> get pod <pod> -o json | jq '{
  phase: .status.phase,
  reason: .status.reason,
  message: .status.message,
  conditions: .status.conditions,
  init: .status.initContainerStatuses,
  containers: .status.containerStatuses
}'

提取最后退出信息:

bash
kubectl -n <namespace> get pod <pod> -o json | jq -r '
  .status.containerStatuses[]
  | [.name,
     (.restartCount | tostring),
     (.lastState.terminated.reason // "-"),
     ((.lastState.terminated.exitCode // "-") | tostring),
     (.lastState.terminated.finishedAt // "-")]
  | @tsv'

容器退出码只是证据之一。例如 OOMKilled 需结合容器 limit、节点压力、应用 RSS 和工作负载变化判断。

临时调试容器 ​

业务镜像没有 shell 时,给运行中的 Pod 添加 ephemeral container:

bash
kubectl -n demo debug -it pod/web-abc \
  --image=registry.k8s.io/e2e-test-images/busybox:1.29-4 \
  --target=web --profile=general

调试节点:

bash
kubectl debug node/worker-01 -it \
  --image=ubuntu:24.04 --profile=sysadmin

节点调试 Pod 通常把宿主机根目录挂在 /host,sysadmin 配置权限很高。

注意

临时容器不能从 PodSpec 中正常删除,且高权限调试可能读取节点上其他工作负载数据。生产必须使用批准镜像、限制 RBAC、记录工单,并在结束后删除调试 Pod。

创建调试副本 ​

不希望触碰原 Pod 时,可复制一个临时 Pod 并修改命令:

bash
kubectl -n demo debug pod/web-abc -it \
  --copy-to=web-debug --container=web -- sh
kubectl -n demo delete pod web-debug

副本可能仍连接生产依赖、挂载 Secret 或消费消息。先审查生成的 Pod,必要时移除探针、Service 标签和业务入口。

八、资源配额、限制和调度约束 ​

bash
kubectl -n <namespace> get resourcequota,limitrange
kubectl -n <namespace> describe resourcequota
kubectl -n <namespace> describe limitrange

kubectl get nodes --show-labels
kubectl describe node <node>
kubectl get nodes -o custom-columns=\
'NAME:.metadata.name,TAINTS:.spec.taints,UNSCHEDULABLE:.spec.unschedulable'

检查 Pod 的调度输入:

bash
kubectl -n <namespace> get pod <pod> -o json | jq '{
  requests: [.spec.containers[].resources.requests],
  nodeSelector: .spec.nodeSelector,
  affinity: .spec.affinity,
  tolerations: .spec.tolerations,
  topologySpreadConstraints: .spec.topologySpreadConstraints
}'

Pending 不能只靠增加节点解决;也可能是 request 过大、污点不容忍、亲和性冲突、PVC 未绑定或配额不足。

九、节点维护 ​

9.1 标记不可调度 ​

bash
kubectl cordon <node>
kubectl get node <node>

cordon 只阻止新的普通 Pod 调度,不会迁移已有 Pod。

9.2 排空节点 ​

先预览目标工作负载和 PodDisruptionBudget:

bash
kubectl get pods -A --field-selector=spec.nodeName=<node> -o wide
kubectl get poddisruptionbudget -A
kubectl drain <node> --dry-run=server --ignore-daemonsets

进入批准的维护窗口后:

bash
kubectl drain <node> \
  --ignore-daemonsets \
  --timeout=<duration>

drain 参数

默认命令遇到 emptyDir 会停止。只有确认数据可丢弃时才添加 --delete-emptydir-data;--disable-eviction 会绕过 PodDisruptionBudget;--force 允许继续处理没有控制器的 Pod。不要为了“排空成功”盲目叠加参数,应先解决容量、PDB 和工作负载所有权问题。

维护完成并验证节点健康后:

bash
kubectl uncordon <node>

十、网络排障 ​

10.1 Service 到后端 ​

bash
kubectl -n <namespace> get service <service> -o yaml
kubectl -n <namespace> get endpointslice \
  -l kubernetes.io/service-name=<service> -o wide
kubectl -n <namespace> get pods -l <service-selector> -o wide --show-labels

确认 selector 与标签、Pod Ready、targetPort 名称/数值和 EndpointSlice 地址一致。

10.2 集群内 DNS 和连接 ​

bash
kubectl -n <namespace> run <debug-pod> \
  --image=<approved-debug-image> \
  --restart=Never --rm -it -- /bin/sh

进入临时 Pod 后按镜像已有工具执行:

bash
getent hosts <service>.<namespace>.svc
nslookup <service>.<namespace>.svc
curl -v --max-time 5 http://<service>:<port>/<health-path>

调试 Pod 也受 NetworkPolicy、ServiceAccount 和准入策略影响。使用与业务 Pod 相同命名空间或身份前先评估权限。

10.3 NetworkPolicy ​

bash
kubectl -n <namespace> get networkpolicy
kubectl -n <namespace> describe networkpolicy <name>
kubectl -n <namespace> get pod <pod> --show-labels

NetworkPolicy 是允许列表模型,其实际执行依赖 CNI 插件。排查时分别验证入站、出站、DNS 和对端标签,不能仅从 YAML 判断数据面一定按预期执行。

十一、存储排障 ​

bash
kubectl -n <namespace> get pvc
kubectl -n <namespace> describe pvc <pvc>
kubectl get pv
kubectl get storageclass
kubectl -n <namespace> get events --field-selector type=Warning

检查 Pod 卷和挂载:

bash
kubectl -n <namespace> get pod <pod> -o json | jq '{
  volumes: .spec.volumes,
  mounts: [.spec.containers[] | {name, volumeMounts}]
}'

不要手工删除 PVC、PV finalizer 或修改 claimRef 来“解卡”,除非已理解 StorageClass 回收策略、CSI 状态、云盘挂载和数据恢复影响。

十二、证书、准入与 API 错误 ​

bash
kubectl get validatingwebhookconfigurations,mutatingwebhookconfigurations
kubectl get apiservices
kubectl get apiservices | grep False

服务端验证清单:

bash
kubectl apply --dry-run=server -f <manifest.yaml>

若出现 webhook timeout,先确认 webhook Service、EndpointSlice、证书、DNS、NetworkPolicy 和控制面到 webhook 的网络路径。不要直接删除 webhook 配置作为第一反应,这会绕过安全或默认化策略。

API 原始请求与 proxy ​

bash
kubectl get --raw='/version'
kubectl get --raw='/readyz?verbose'
kubectl get --raw='/apis/metrics.k8s.io/v1beta1/nodes'

# 只监听回环地址;另一个终端访问 API
kubectl proxy --address=127.0.0.1 --port=8001
curl http://127.0.0.1:8001/api/v1/namespaces/demo/pods

kubectl proxy 使用当前凭据代理 API,不是生产网关。不要监听公网地址。

客户端请求日志 ​

bash
kubectl -v=6 -n <namespace> get pod <pod>
kubectl -v=8 -n <namespace> get pod <pod>

高详细度可能输出 URL、头信息和对象内容;只在短时诊断中使用,分享前脱敏。

继续阅读