主题
15 — kubectl 工具链深度教材
kubectl 是 K8s 运维的瑞士军刀。本章覆盖高级命令、krew 插件、k9s、调试技巧、脚本化运维。
1. kubectl 高级命令
bash
# === JSONPath 高级查询 ===
# 列出所有非 Running 的 Pod
kubectl get pods -A --field-selector=status.phase!=Running
# 列出所有 Pending Pod 及其所在节点
kubectl get pods -A --field-selector=status.phase=Pending \
-o jsonpath='{range .items[*]}{.metadata.namespace}{"/"}{.metadata.name}{"\n"}{end}'
# 列出所有节点的内存使用
kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.capacity.memory}{"\n"}{end}'
# === 排序 ===
kubectl get pods --sort-by='.status.startTime' # 按启动时间
kubectl get pods --sort-by='.metadata.creationTimestamp' # 按创建时间
# === 自定义列 ===
kubectl get pods -o custom-columns=\
NAME:.metadata.name,\
STATUS:.status.phase,\
NODE:.spec.nodeName,\
IP:.status.podIP,\
RESTARTS:.status.containerStatuses[0].restartCount
# === dry-run + 生成 YAML ===
kubectl create deployment nginx --image=nginx:latest --dry-run=client -o yaml > deploy.yaml
kubectl create service clusterip my-svc --tcp=80:8080 --dry-run=client -o yaml > svc.yaml
# === patch(部分更新) ===
kubectl patch deployment web -p '{"spec":{"replicas":5}}'
kubectl patch deployment web --type merge -p '{"spec":{"template":{"spec":{"containers":[{"name":"app","image":"app:v2"}]}}}}'
# === exec 与 port-forward ===
kubectl exec -it <pod> -c <container> -- /bin/sh
kubectl port-forward svc/my-service 8080:80 # 本地 8080 → Service 80
kubectl port-forward pod/<pod> 8443:443 # 本地 8443 → Pod 4432. krew 插件管理
bash
# 安装 krew
kubectl krew install <plugin>
# 常用 krew 插件
kubectl krew install ctx # 切换集群上下文
kubectl krew install ns # 切换命名空间
kubectl krew install neat # 清理 YAML 输出
kubectl krew install resource-versions # 查看资源的 API 版本
kubectl krew install tree # 查看资源关系树
kubectl krew install outdated # 检查过时的镜像
kubectl krew install stern # 多 Pod 日志尾随
kubectl krew install kubeconform # YAML 校验
# 使用示例
kubectl ctx production-cluster # 切换集群
kubectl ns monitoring # 切换命名空间
kubectl get pod <name> -o yaml | kubectl neat # 清理输出
kubectl tree deployment web-app # 查看 RS/Pod 关系
kubectl stern -l app=web # 同时跟踪多个 Pod 日志3. k9s — 终端 UI
k9s 是一个 K8s 终端 UI,类似 htop 但用于 K8s:
核心功能:
:pods → 查看所有 Pod(实时刷新)
:deploy → 查看所有 Deployment
:svc → 查看所有 Service
:nodes → 查看节点资源使用
:pv → 查看 PV
:logs <pod> → 查看日志
:shell <pod> → 进入容器
:describe <pod> → 查看描述
常用快捷键:
/ → 搜索/过滤
: → 切换资源类型
d → describe
l → logs
s → shell
e → edit
Ctrl-a → 切换命名空间
:alias → 查看资源别名4. 调试技巧
bash
# === 临时调试 Pod ===
kubectl run debug --rm -it --image=busybox -- /bin/sh
kubectl run debug --rm -it --image=nicolaka/netshoot --overrides='{"spec":{"hostNetwork":true}}' -- /bin/sh
# === 调试容器(K8s 1.25+) ===
kubectl debug -it <pod> --image=busybox --target=<container>
# === 节点调试 ===
kubectl debug node/<node> -it --image=busybox
# 进入节点的 namespace,可以查看 /host 下的文件系统
# === 检查 API Server 连接 ===
kubectl get --raw /healthz
kubectl get --raw /api/v1/namespaces
kubectl api-resources # 列出所有 API 资源
kubectl api-versions # 列出所有 API 版本
# === 事件分析 ===
kubectl get events --sort-by='.lastTimestamp' -A | head -30
kubectl get events --field-selector reason=FailedScheduling -A5. 脚本化运维
bash
# 批量重启所有 Deployment
for deploy in $(kubectl get deploy -n production -o name); do
kubectl rollout restart $deploy -n production
done
# 找出所有没有 PDB 的 Deployment
for deploy in $(kubectl get deploy -A -o jsonpath='{range .items[*]}{.metadata.namespace}/{.metadata.name}{"\n"}{end}'); do
ns=$(echo $deploy | cut -d/ -f1)
name=$(echo $deploy | cut -d/ -f2)
pdb=$(kubectl get pdb -n $ns -o jsonpath="{.items[?(@.spec.selector.matchLabels.app=='$name')].metadata.name}" 2>/dev/null)
if [ -z "$pdb" ]; then echo "NO PDB: $deploy"; fi
done
# 列出所有镜像及其版本
kubectl get pods -A -o jsonpath='{range .items[*]}{.metadata.namespace}{"/"}{.metadata.name}{"\t"}{range .spec.containers[*]}{.image}{" "}{end}{"\n"}{end}' | sort6. 面试高频问题
Q: 如何快速定位集群中资源使用最高的 Pod?
方案 1: kubectl top pods -A --sort-by=cpu | head -10
方案 2: kubectl top pods -A --sort-by=memory | head -10
方案 3: Prometheus 查询 topk(10, container_cpu_usage_seconds_total)
方案 4: k9s → :pods → 按 CPU/MEM 排序