kubectl 进阶命令 · 精确筛选资源至API 原始请求与 proxy
本文承接 基础命令,按筛选与输出 → 受控变更 → 容器调试 → 节点维护 → 故障分层 → 脚本防护组织。历史 Helm 仓库/ChartMuseum 操作见独立案例。
示例主要面向 Bash/Zsh。debug profile 等参数受客户端版本和集群策略影响,执行前用本机帮助确认。生产变更先核对上下文、命名空间和目标。
kubectl 进阶命令
本文承接 基础命令,按筛选与输出 → 受控变更 → 容器调试 → 节点维护 → 故障分层 → 脚本防护组织。历史 Helm 仓库/ChartMuseum 操作见独立案例。
示例主要面向 Bash/Zsh。debug profile 等参数受客户端版本和集群策略影响,执行前用本机帮助确认。生产变更先核对上下文、命名空间和目标。
精确筛选资源
标签选择器由客户端传给 API Server,适合业务维度;字段选择器只支持资源预定义字段。
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
# 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 并检查空值和退出码;不要解析表格列。
# 指定 Pod 的 Ready 条件
kubectl -n <namespace> get pod <pod> \
-o jsonpath='{range .status.conditions[?(@.type=="Ready")]}{.status}{"\t"}{.reason}{"\n"}{end}'Ready 条件与容器资源输出
# 非 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'排序与最近事件
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 --watchEvent 是短期、尽力而为的诊断数据,可能聚合、限流和过期。长期审计不能依赖 Event。
Server-Side Apply 与冲突
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 与声明式清单。
# 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 操作
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 状态和容器退出原因
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
}'提取最后退出信息:
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:
kubectl -n demo debug -it pod/web-abc \
--image=registry.k8s.io/e2e-test-images/busybox:1.29-4 \
--target=web --profile=general调试节点:
kubectl debug node/worker-01 -it \
--image=ubuntu:24.04 --profile=sysadmin节点调试 Pod 通常把宿主机根目录挂在 /host,sysadmin 配置权限很高。
注意
临时容器不能从 PodSpec 中正常删除,且高权限调试可能读取节点上其他工作负载数据。生产必须使用批准镜像、限制 RBAC、记录工单,并在结束后删除调试 Pod。
创建调试副本
不希望触碰原 Pod 时,可复制一个临时 Pod 并修改命令:
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 标签和业务入口。
八、资源配额、限制和调度约束
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 的调度输入:
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 标记不可调度
kubectl cordon <node>
kubectl get node <node>cordon 只阻止新的普通 Pod 调度,不会迁移已有 Pod。
9.2 排空节点
先预览目标工作负载和 PodDisruptionBudget:
kubectl get pods -A --field-selector=spec.nodeName=<node> -o wide
kubectl get poddisruptionbudget -A
kubectl drain <node> --dry-run=server --ignore-daemonsets进入批准的维护窗口后:
kubectl drain <node> \
--ignore-daemonsets \
--timeout=<duration>drain 参数
默认命令遇到 emptyDir 会停止。只有确认数据可丢弃时才添加 --delete-emptydir-data;--disable-eviction 会绕过 PodDisruptionBudget;--force 允许继续处理没有控制器的 Pod。不要为了“排空成功”盲目叠加参数,应先解决容量、PDB 和工作负载所有权问题。
维护完成并验证节点健康后:
kubectl uncordon <node>十、网络排障
10.1 Service 到后端
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 和连接
kubectl -n <namespace> run <debug-pod> \
--image=<approved-debug-image> \
--restart=Never --rm -it -- /bin/sh进入临时 Pod 后按镜像已有工具执行:
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
kubectl -n <namespace> get networkpolicy
kubectl -n <namespace> describe networkpolicy <name>
kubectl -n <namespace> get pod <pod> --show-labelsNetworkPolicy 是允许列表模型,其实际执行依赖 CNI 插件。排查时分别验证入站、出站、DNS 和对端标签,不能仅从 YAML 判断数据面一定按预期执行。
十一、存储排障
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 卷和挂载:
kubectl -n <namespace> get pod <pod> -o json | jq '{
volumes: .spec.volumes,
mounts: [.spec.containers[] | {name, volumeMounts}]
}'不要手工删除 PVC、PV finalizer 或修改 claimRef 来“解卡”,除非已理解 StorageClass 回收策略、CSI 状态、云盘挂载和数据恢复影响。
十二、证书、准入与 API 错误
kubectl get validatingwebhookconfigurations,mutatingwebhookconfigurations
kubectl get apiservices
kubectl get apiservices | grep False服务端验证清单:
kubectl apply --dry-run=server -f <manifest.yaml>若出现 webhook timeout,先确认 webhook Service、EndpointSlice、证书、DNS、NetworkPolicy 和控制面到 webhook 的网络路径。不要直接删除 webhook 配置作为第一反应,这会绕过安全或默认化策略。
API 原始请求与 proxy
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/podskubectl proxy 使用当前凭据代理 API,不是生产网关。不要监听公网地址。
客户端请求日志
kubectl -v=6 -n <namespace> get pod <pod>
kubectl -v=8 -n <namespace> get pod <pod>高详细度可能输出 URL、头信息和对象内容;只在短时诊断中使用,分享前脱敏。
继续阅读
- 知识专题
- 知识专题
- 命令