AI Infra 训练营
总览
  • 总览
  • 完整安装
  • 核心 K8s
  • Cilium 网络
  • Longhorn 存储
  • 监控日志
  • CI / GitOps
  • 安全准入
  • CI/CD 实战(MySQL+Go+Vue)
  • HPA/Ingress/Hubble 实战
  • 面试速查 + 真实踩坑
  • Day 0 · 新手接管 Runbook
  • Day 1 · 集群起步 + CNI
  • Day 2 · 控制面 + etcd
  • Day 3 · CRD + Operator + Webhook
  • Day 4 · 存储深度
  • Day 5 · 卷扩容 + 安全
  • Day 6 · 调度 + 可观测
  • Day 7 · Harbor + ArgoCD + Mesh
  • Day 8 · AI Infra
  • Day 9 · Triton + GPU
  • Day 10 · MIG + HPA + 量化
  • Day 11 · AI Agent 端到端
  • Day 12 · 灾备
  • Day 13 · Operator + 联邦 + Mesh + RAG
  • Day 14 · CKA / CKS + 总结
  • LLM 训练手册
  • RAG + Agent 手册
  • 推理优化手册
  • 上下文工程手册
  • Agent 开发手册
  • 面试深度复盘
  • 训练 v2 深度手册
  • 心智模型
  • 看懂命令输出
  • 容器网络底层
  • K8s 网络深入
  • DNS 全套
  • 故障排查方法论
  • 心智模型
  • 容器挂载完整指南
  • K8s Volumes 大全
  • PV/PVC/CSI 深入
  • NFS 深入
  • 分布式存储概览
  • 故障排查 runbook
命令手册
HiHuo 主站
GitHub
总览
  • 总览
  • 完整安装
  • 核心 K8s
  • Cilium 网络
  • Longhorn 存储
  • 监控日志
  • CI / GitOps
  • 安全准入
  • CI/CD 实战(MySQL+Go+Vue)
  • HPA/Ingress/Hubble 实战
  • 面试速查 + 真实踩坑
  • Day 0 · 新手接管 Runbook
  • Day 1 · 集群起步 + CNI
  • Day 2 · 控制面 + etcd
  • Day 3 · CRD + Operator + Webhook
  • Day 4 · 存储深度
  • Day 5 · 卷扩容 + 安全
  • Day 6 · 调度 + 可观测
  • Day 7 · Harbor + ArgoCD + Mesh
  • Day 8 · AI Infra
  • Day 9 · Triton + GPU
  • Day 10 · MIG + HPA + 量化
  • Day 11 · AI Agent 端到端
  • Day 12 · 灾备
  • Day 13 · Operator + 联邦 + Mesh + RAG
  • Day 14 · CKA / CKS + 总结
  • LLM 训练手册
  • RAG + Agent 手册
  • 推理优化手册
  • 上下文工程手册
  • Agent 开发手册
  • 面试深度复盘
  • 训练 v2 深度手册
  • 心智模型
  • 看懂命令输出
  • 容器网络底层
  • K8s 网络深入
  • DNS 全套
  • 故障排查方法论
  • 心智模型
  • 容器挂载完整指南
  • K8s Volumes 大全
  • PV/PVC/CSI 深入
  • NFS 深入
  • 分布式存储概览
  • 故障排查 runbook
命令手册
HiHuo 主站
GitHub
  • 命令手册总览
  • SSH 与远程执行

    • ssh —— 远程登录与远程执行
    • ssh-config —— ~/.ssh/config 客户端配置文件
    • ssh-keygen —— 密钥对生成与 known_hosts 维护
    • sshd —— SSH 服务端守护进程与硬化
    • sshpass —— 密码登录自动化(仅限"首次推 key"场景)
    • scp / rsync —— 远程文件拷贝
    • nsenter —— 进入 Linux namespace 的"传送门"
  • 系统状态与诊断

    • systemd-detect-virt —— 探测当前运行环境的虚拟化类型
    • systemctl —— systemd 服务管理的总入口
    • journalctl —— systemd 日志查询
    • hostnamectl / timedatectl —— 改主机名与时区
    • ss —— socket statistics(替代 netstat)
    • lsblk / df / du —— 三个被混淆的"看磁盘"命令
  • 进程与资源

    • ps —— 看进程
    • top / htop —— 实时进程资源监控
    • lsof —— 列出打开的文件(list open files)
    • strace —— 系统调用追踪
    • dmesg —— 看内核环形缓冲日志
    • iostat —— 磁盘 I/O 性能分析
    • iotop —— 进程级 I/O 实时监控
  • 文本与文件批处理

    • grep —— 文本搜索
    • sed —— 流编辑器
    • awk —— 按字段处理文本
    • jq —— JSON 命令行处理器
    • find —— 按各种条件找文件
    • xargs —— 把 stdin 喂给下一个命令
    • tee —— 一边输出、一边写文件
  • 磁盘与存储

    • mount / umount —— 挂载文件系统
    • mkfs —— 格式化文件系统
    • /etc/fstab —— 持久化挂载配置
    • parted / fdisk —— 分区表管理
    • LVM —— pvcreate / vgcreate / lvcreate 三件套
    • findmnt —— 现代化的"看挂载"命令
    • nfsstat / showmount —— NFS 状态与性能
    • smartctl —— 盘健康检查与坏盘预警
  • 网络诊断

    • curl —— HTTP 客户端的瑞士军刀
    • ip —— 现代 Linux 网络配置工具(替代 ifconfig / route)
    • iptables —— Linux 内核包过滤 / NAT 规则
    • tcpdump —— 命令行抓包
    • dig —— DNS 查询工具
    • mtr —— traceroute + ping 合体
    • iperf3 —— 网络带宽测试
    • nc (netcat) —— 网络瑞士军刀
    • ethtool —— 物理网卡参数 / 速率 / offload
  • 内核 / 包管理 / 时间

    • modprobe / lsmod —— 内核模块加载
    • sysctl —— 内核运行时参数
    • apt / apt-get / dpkg —— Debian / Ubuntu 包管理
    • chrony / chronyc —— NTP 时间同步
  • K8s / 容器工具链

    • kubectl —— K8s 的瑞士军刀
    • kubeadm —— K8s 集群引导工具
    • helm —— K8s 应用包管理器
    • crictl —— 容器运行时命令行(CRI 层)
    • etcdctl —— 直连 K8s 元数据存储
    • docker —— 单机容器(构建和本地开发)
  • 监控 / GitOps / 备份

    • argocd —— GitOps CLI
    • velero —— K8s 集群备份恢复
    • prometheus / promtool —— 监控数据查询和工具
    • cilium / cilium-cli / hubble —— eBPF CNI 排错
    • grafana / grafana-cli —— 可视化平台运维
    • alertmanager / amtool —— 告警分组、抑制、路由
  • 开发 / 构建 / 终端

    • git —— 版本控制 + GitOps 的底座
    • make / Makefile —— 任务编排
    • openssl —— 证书 / 密钥 / TLS 调试工具箱
    • tmux —— 终端复用 / 长跑任务防掉线
    • vim —— 远程编辑必备最小集
    • cron / crontab —— 定时任务

dig —— DNS 查询工具

一句话定义

dig(Domain Information Groper)是 DNS 调试的事实标准:发一个 DNS 查询,把详细的请求 / 响应打出来。比 nslookup 强大、比 host 详细——三个里选 dig。

典型场景

  • 排查"域名解析不对":dig example.com
  • 测特定 DNS 服务器:dig @8.8.8.8 example.com
  • 排查 K8s CoreDNS:dig @10.96.0.10 kubernetes.default.svc.cluster.local
  • 反向 DNS:dig -x 1.2.3.4
  • 看完整解析链:dig +trace example.com

装

apt install -y dnsutils                       # Ubuntu / Debian
yum install -y bind-utils                     # CentOS / RHEL

很多最小化容器镜像没装。


基础用法

dig example.com

输出长这样:

; <<>> DiG 9.18.18 <<>> example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12345
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;example.com.                   IN      A

;; ANSWER SECTION:
example.com.            7200    IN      A       93.184.215.14

;; Query time: 24 msec
;; SERVER: 192.168.1.1#53(192.168.1.1) (UDP)
;; WHEN: Mon May 27 14:30:00 UTC 2026
;; MSG SIZE  rcvd: 56

读法:

  • status: NOERROR —— 查询成功(NXDOMAIN = 域名不存在)
  • flags: qr rd ra —— qr=响应,rd=客户端要求递归,ra=服务端支持递归
  • QUESTION SECTION —— 你问了什么
  • ANSWER SECTION —— 答案(最关键)
  • Query time —— 耗时
  • SERVER —— 谁回答的(用了哪个 DNS)

简化输出 +short

完整输出排错有用、但日常太啰嗦。+short 只给答案:

$ dig +short example.com
93.184.215.14

$ dig +short example.com MX
0 .

$ dig +short example.com NS
a.iana-servers.net.
b.iana-servers.net.

日常用 +short,排错用完整输出。


查不同记录类型

dig example.com A                              # IPv4(默认)
dig example.com AAAA                           # IPv6
dig example.com MX                             # 邮件交换
dig example.com NS                             # 名字服务器
dig example.com TXT                            # 文本(SPF / DKIM 等)
dig example.com CNAME                          # 别名
dig example.com SOA                            # 权威记录
dig example.com SRV                            # K8s service 用这种
dig example.com ANY                            # 所有类型(不少 DNS 拒绝这个)

指定 DNS 服务器:@

dig @8.8.8.8 example.com                       # 用 Google DNS
dig @1.1.1.1 example.com                       # 用 Cloudflare DNS
dig @10.96.0.10 kubernetes.default.svc.cluster.local    # 用 K8s CoreDNS

排查"自己机器上的 /etc/resolv.conf 配的 DNS 不对":用 @ 指定备选 DNS 比较结果。

dig example.com                                # 用本机配的 DNS
dig @8.8.8.8 example.com                       # 用 8.8.8.8

# 两者答案不一样 → 本机 DNS 缓存 / 内网劫持 / 配错

反向 DNS:-x

dig -x 8.8.8.8
# 显示 8.8.8.8 对应的主机名(PTR 记录)
# google-public-dns-a.google.com.

排查邮件相关 / 日志里有 IP 想知道是谁。


看完整解析链:+trace

dig +trace example.com

不从本机 DNS 缓存查,从根域名开始一步步问:

.                          ← 问根
com.                       ← 问 .com TLD
example.com.               ← 问 example.com 权威 NS

+trace 显示每一跳。用来:

  • 看是哪一层 DNS 给的错答案
  • 验证授权委派链是否正确
  • 调试 DNSSEC

K8s CoreDNS 排错黄金套路

K8s 集群内 pod 解析问题 90% 用 dig 在 5 分钟内定位。

1. 集群 DNS 的 IP

kubectl get svc -n kube-system kube-dns
# NAME       TYPE        CLUSTER-IP   ...
# kube-dns   ClusterIP   10.96.0.10   ...   ← 通常是这个

2. 在某个 pod 里测

kubectl run -it --rm test --image=infoblox/dnstools --restart=Never -- bash
# 进交互
dig kubernetes.default.svc.cluster.local
# 应该返回 10.96.0.1(apiserver service)

3. 测不同 service

dig kubernetes                                          # 简写
dig kubernetes.default                                  # 加 ns
dig kubernetes.default.svc.cluster.local                # 全名
dig myapp.myns.svc.cluster.local

如果短名 kubernetes 也解析得到 → /etc/resolv.conf 里的 search domain 在起作用:

cat /etc/resolv.conf
# nameserver 10.96.0.10
# search myns.svc.cluster.local svc.cluster.local cluster.local
# options ndots:5

K8s 自动给 pod 写 search domain,让 dig myapp 自动尝试拼几个域名。

4. 测 service 对应的 endpoint

dig myapp.myns.svc.cluster.local SRV
# _myport._tcp.myapp.myns.svc.cluster.local. 30 IN SRV 0 33 8080 10-244-0-5.myapp.myns.svc.cluster.local.

SRV 记录里包含 endpoint IP 和端口。

5. 测外部域名(pod → 互联网)

dig github.com
# 应该解析到真实 IP(CoreDNS forward 给上游)

dig github.com +trace
# 看每跳;如果某跳是公司内网 DNS 劫持,能在这里看到

排查"pod 解析外部域名超时" —— 用 dig 直接测,看是上游慢还是 CoreDNS pod 自己的问题。

6. 直接问某个 CoreDNS pod

kubectl get pod -n kube-system -l k8s-app=kube-dns -o wide
# coredns-xxx  Running   10.244.0.3  m1
# coredns-yyy  Running   10.244.1.4  m4

dig @10.244.0.3 kubernetes.default.svc.cluster.local
# 直接问某个 CoreDNS pod

判断"是不是某个 CoreDNS pod 挂了":分别问每个 pod。


+time +tries 控制重试 / 超时

dig +time=3 +tries=1 example.com
# 3 秒超时,不重试

在脚本里测连通性用:

if dig +time=3 +tries=1 +short example.com > /dev/null 2>&1; then
  echo "DNS OK"
fi

实战场景

1. pod 解析慢 / 超时

# pod 里抓 DNS 流量
nsenter -t <pod-pid> -n tcpdump -i any -nn 'udp port 53' -c 20

# pod 里直接测
kubectl exec my-pod -- nslookup kubernetes.default
# 或者
kubectl exec my-pod -- timeout 5 dig kubernetes.default.svc.cluster.local

# 测每个 CoreDNS pod
for ip in $(kubectl get pod -n kube-system -l k8s-app=kube-dns -o jsonpath='{.items[*].status.podIP}'); do
  echo "=== $ip ==="
  dig @$ip kubernetes.default.svc.cluster.local +short +time=3
done

2. 排查 hosts vs DNS

getent hosts example.com                        # 系统层(含 /etc/hosts + DNS)
dig +short example.com                          # 只走 DNS
# 两者不一致 → /etc/hosts 里有覆盖

3. 验证 TTL 是不是 0(让浏览器/系统不缓存)

dig example.com | grep -E "ANSWER SECTION" -A 5
# example.com.       30      IN      A       1.2.3.4
#                    ↑ TTL 秒数

DNS 切换前先把 TTL 调小(30 秒),方便快速切。

4. 看 NS 委托是否正确

dig example.com NS
# 返回的 NS 服务器是不是你期望的
dig @ns1.example.com example.com               # 直接问权威 NS

5. 验证 DKIM / SPF 记录

dig example.com TXT +short
# "v=spf1 include:_spf.google.com ~all"
dig default._domainkey.example.com TXT

dig vs nslookup vs host

工具优点缺点
dig完整输出、可控、专业输出长
nslookup老 / 普及输出格式不固定、容易解析错
host简洁信息少

学 dig,忘 nslookup。


常见踩坑

坑 1:忘了域名结尾的 . 是 FQDN

dig example.com                                 # 用 search domain 拼接(可能错)
dig example.com.                                # 末尾的 . 表示 FQDN,不再拼接

要测绝对域名就加 .,避免被 search domain 干扰。

坑 2:dig 在某些容器镜像里没装

$ dig
sh: dig: not found

alpine 用 apk add bind-tools;distroless 没法装 —— 用 kubectl debug 起个调试 sidecar。

坑 3:+short 没答案就退出码 0

dig +short nxdomain.example.com
# (空输出)
echo $?
# 0

空答案的退出码是 0(dig 跑成功了,只是答案是空)。脚本判断:

ANS=$(dig +short example.com)
[ -z "$ANS" ] && echo "no answer"

坑 4:dig 卡住

dig @192.168.1.99 example.com
# 卡住 ...

DNS 服务器不可达,dig 默认重试 3 次每次 5 秒 = 15 秒才退出。

dig +time=2 +tries=1 @192.168.1.99 example.com
# 最多 2 秒

坑 5:本机 stub resolver 缓存让你看不到改动

Ubuntu 22 默认有 systemd-resolved,在 127.0.0.53 监听并缓存。

dig example.com                                 # 用 systemd-resolved,可能拿到缓存
dig @8.8.8.8 example.com                        # 跳过本地 stub,直接问上游

刷 systemd-resolved 缓存:

resolvectl flush-caches

坑 6:dig pod-name.pod 不存在

dig my-pod.default.pod.cluster.local           # 通常不工作

K8s 默认不给 pod 创建 DNS 记录(只给 Service / Headless Service 创建)。要 pod DNS:

  • StatefulSet pod 用 pod-name.svc.ns.svc.cluster.local(要有 Headless Service)
  • 或者 PodDNSConfig

坑 7:CoreDNS forward plugin 转发外部 DNS 失败

pod 解析 github.com 慢 / 超时,但 CoreDNS 本身没事。看 CoreDNS 配置:

kubectl get cm -n kube-system coredns -o yaml | grep -A 5 forward
# forward . /etc/resolv.conf {
#   max_concurrent 1000
# }

forward . /etc/resolv.conf 转发给节点的 DNS。节点 DNS 通不通:

ssh m1 'dig @<节点 resolv.conf 里的 DNS> github.com'

通常根因是节点 /etc/resolv.conf 配错 / 上游 DNS 慢。

坑 8:用 dig 测 mDNS(.local)失败

dig myhost.local                                # 失败

.local 是 mDNS(Avahi / Bonjour)的保留域,不走标准 DNS。K8s .svc.cluster.local 不一样——后者是普通域,CoreDNS 内部权威解析、不走 mDNS。


关联命令

  • getent hosts <name> —— 系统层解析(含 /etc/hosts)
  • host / nslookup —— dig 的弱化版
  • resolvectl —— Ubuntu 22+ systemd-resolved 工具
  • tcpdump —— 抓 53 端口看 DNS 流量
  • curl —— dig 验完 DNS,curl 验 HTTP
在 GitHub 上编辑此页
Prev
tcpdump —— 命令行抓包
Next
mtr —— traceroute + ping 合体