K8s 常用命令手记

前言:这是一份偏“随用随查”的 K8s 命令手记,覆盖排障、发布、日志、网络、Ingress/真实 IP、以及开发调试常见操作。适合日常运维/开发在集群里定位问题、验证配置、快速改动资源。你会得到:一套可复制粘贴的命令清单 + 真实 IP(X-Forwarded-For)落地要点 + 常见“暂停容器/挂起 Pod”技巧。


1. 环境与约定(含版本/合规提醒)

  • 适用集群:Kubernetes(含 RKE2/Ingress-NGINX)
  • 命令客户端:kubectl(需已配置 kubeconfig)
  • Ingress:Ingress-NGINX(常见)
  • 真实 IP:基于 HTTP Header(X-Forwarded-For / X-Real-IP

2. 资源查询与定位(最快找到“发生了什么”)

2.1 看整体健康(先看面,再看点)

Bash
kubectl get nodes -o wide
kubectl get ns
kubectl get pods -A -o wide
kubectl get deploy,sts,ds -A
kubectl get svc -A
kubectl get ing -A

你想确认“是不是 Ingress/Service/Pod 任意一层挂了”,优先用 -A 全局扫一遍。

2.2 精确过滤(按 label、按字段、按状态)

Bash
# label 过滤
kubectl get pods -n default -l app=demo-backend -o wide

# 只看非 Running
kubectl get pods -A --field-selector=status.phase!=Running

# 看节点上的 Pod(定位节点网络/磁盘问题)
kubectl get pods -A -o wide --field-selector spec.nodeName=<NODE_NAME>

2.3 描述与事件(排障优先级最高)

Bash
kubectl describe pod -n default <POD_NAME>
kubectl describe deploy -n default <DEPLOY_NAME>
kubectl get events -A --sort-by=.metadata.creationTimestamp | tail -n 50

排障时 describe + events 的信息密度最高:镜像拉取、探针失败、调度失败、权限/挂载错误都在这里。


3. 日志与进入容器(定位应用层问题)

3.1 看日志(按时间、按容器、持续跟随)

Bash
# 只看最近 10 分钟
kubectl logs -n default <POD_NAME> --since=10m

# 持续跟随(tail -f)
kubectl logs -n default <POD_NAME> -f

# 多容器 Pod 指定容器
kubectl logs -n default <POD_NAME> -c <CONTAINER_NAME> --since=30m

# 上一次重启的日志(CrashLoopBackOff 常用)
kubectl logs -n default <POD_NAME> --previous

3.2 进入容器执行命令(exec)

Bash
kubectl exec -n default -it <POD_NAME> -- /bin/sh
# 或 bash
kubectl exec -n default -it <POD_NAME> -- /bin/bash

3.3 临时调试容器(不改镜像,直接起一个工具箱)

Bash
kubectl run -n default net-debug --rm -it \
  --image=nicolaka/netshoot -- /bin/bash

适合在集群里直接 curl/nslookup/tcpdump 排查 DNS、连通性、TLS。


4. 发布、回滚、扩缩容(最常用“变更操作”)

4.1 重启 / 滚动发布

Bash
kubectl rollout restart deploy -n default demo-backend-deployment
kubectl rollout status  deploy -n default demo-backend-deployment

4.2 查看历史与回滚

Bash
kubectl rollout history deploy -n default demo-backend-deployment
kubectl rollout undo    deploy -n default demo-backend-deployment --to-revision=<REV>

4.3 扩缩容

Bash
kubectl scale deploy -n default demo-backend-deployment --replicas=2
kubectl get pods -n default -l app=demo-backend -o wide

4.4 临时改镜像(快速验证)

Bash
kubectl set image deploy/demo-backend-deployment -n default \
  demo-backend-containers=harbor.demo.com/library/demo-backend:dev-1.0.1

kubectl rollout status deploy -n default demo-backend-deployment

5. Ingress/真实 IP:X-Forwarded-For 方案(可复现)

5.1 目标与判断标准

  • 目标:应用日志/审计记录能拿到客户端真实 IP,而不是路由/代理 IP。
  • 判断标准:
    • Ingress-NGINX access log 中 remote_addr 可能仍为上游,但 X-Forwarded-For 应包含真实客户端 IP。
    • Spring/Java 侧读取 X-Forwarded-For(取第一个)或 X-Real-IP

5.2 Ingress-NGINX:开启“信任转发头”(常用 ConfigMap 参数)

你使用的是 RKE2 Ingress-NGINX,通常在 kube-system 的 controller ConfigMap 配置。

建议配置要点(名字可能随 chart 略有差异,思路一致):

  • use-forwarded-headers: "true":使用 X-Forwarded-*
  • compute-full-forwarded-for: "true":保留完整链路(多级代理)
  • real-ip-header: "X-Forwarded-For":从哪个头取真实 IP
  • set-real-ip-from: "<你的上游代理IP/CIDR>":信任来源(关键,否则容易被伪造)
YAML
apiVersion: v1
kind: ConfigMap
metadata:
  name: rke2-ingress-nginx-controller
  namespace: kube-system
data:
  use-forwarded-headers: "true"
  compute-full-forwarded-for: "true"
  real-ip-header: "X-Forwarded-For"
  # 这里必须写“你信任的上游代理/负载均衡”网段,否则可能被伪造
  set-real-ip-from: "10.0.0.0/8"

修改后让 controller 滚动重启(或等其自动 reload)。

Bash
kubectl -n kube-system rollout restart ds/rke2-ingress-nginx-controller
kubectl -n kube-system rollout status  ds/rke2-ingress-nginx-controller

5.3 Spring Boot:让框架自动识别 Forwarded 头(可选)

如果你希望 request.getRemoteAddr() 也变成真实 IP,可启用 Forwarded Header 解析(按版本选择)。

YAML
server:
  forward-headers-strategy: framework

更稳的方式是你现在的 ClientIpUtils:显式读 X-Forwarded-For / X-Real-IP,不依赖容器行为。

5.4 验证:一条 curl 看头链路

Bash
curl -k -I https://demo-backend.demo.com \
  -H 'X-Forwarded-For: 1.2.3.4' \
  -H 'X-Real-IP: 1.2.3.4'

预期:

  • 如果 set-real-ip-from 没配置好,Ingress 可能不会信任你注入的 header。
  • 正确配置后,Ingress access log / upstream header 会反映真实 IP(或至少在 X-Forwarded-For 链路中出现)。

6. 开发/排障常用“技巧命令”(拿走就能用)

6.1 停止并挂起容器(保持 Pod 不退出,便于 debug)

用途:容器启动后不退出,方便你 kubectl exec 进去排查文件/证书/网络。

Bash
/bin/sh -c 'tail -f /dev/null'

也可以这样:

Bash
/bin/sh -c 'sleep infinity'

如果你要在 Deployment 里临时改命令(只用于排障,别长期这么跑):

Bash
kubectl patch deploy -n default demo-backend-deployment \
  -p '{"spec":{"template":{"spec":{"containers":[{"name":"demo-backend-containers","command":["/bin/sh","-c","tail -f /dev/null"]}]}}}}'

恢复时把 command 改回原值或回滚 revision。

6.2 端口转发(本地直连 Service/Pod)

Bash
# 本地 18080 -> svc 8002
kubectl port-forward -n default svc/demo-backend-deployment 18080:8002

# 本地 18080 -> pod 8080
kubectl port-forward -n default pod/<POD_NAME> 18080:8080

6.3 抓取 YAML(线上资源导出对比)

Bash
kubectl get deploy -n default demo-backend-deployment -o yaml > deploy.yaml
kubectl get ing   -n default demo-backend-deployment -o yaml > ingress.yaml
kubectl get cm    -n kube-system rke2-ingress-nginx-controller -o yaml > nginx-cm.yaml

6.4 观察资源(实时刷新)

Bash
watch -n 1 "kubectl get pods -n default -o wide"
watch -n 1 "kubectl top pod -n default"

6.5 常见“清理/重建”(谨慎)

Bash
# 删除一个 Pod,让控制器重建(排除临时异常)
kubectl delete pod -n default <POD_NAME>

# 强制删除卡死 Pod(慎用)
kubectl delete pod -n default <POD_NAME> --grace-period=0 --force

结尾

边界提醒:X-Forwarded-For 可被伪造,Ingress 必须用 set-real-ip-from 限制可信上游来源。

总结
get/describe/events/logs 四件套快速缩小故障范围。
发布回滚优先用 rollout,不要直接删 Deployment。
真实 IP 推荐走 X-Forwarded-For:Ingress 信任链路 + 应用侧显式解析更稳。
“挂起容器”用 tail -f /dev/null,配合 exec 是最快 debug 路径。

使用 pyrasite-ng 劫持 Python 实现任意代码注入 基于Docker的Windows容器化实践 ESXi 6.7/7.0/8.0配置GPU/硬盘直通
View Comments
There are currently no comments.