Skip to content

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 443

2. 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 -A

5. 脚本化运维

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}' | sort

6. 面试高频问题

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 排序