DNS 解析
学习目标
- 理解 Kubernetes DNS 的工作原理
- 掌握 DNS 解析的配置方法
- 了解 DNS 解析的使用场景
核心概念
一句话解释
Kubernetes DNS 是集群内部的 DNS 服务,用于将 Service 名称解析为 ClusterIP,实现服务发现。
Kubernetes DNS 工作原理
┌─────────────────────────────────────────┐
│ Kubernetes DNS (CoreDNS) │
│ ┌─────────────────────────────────┐ │
│ │ DNS 记录 │ │
│ │ - Service → ClusterIP │ │
│ │ - Pod → Pod IP │ │
│ └─────────────────────────────────┘ │
└─────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ Pod │
│ /etc/resolv.conf │
│ nameserver 10.96.0.10 │
│ search default.svc.cluster.local │
│ svc.cluster.local │
│ cluster.local │
└─────────────────────────────────────────┘
DNS 记录类型
┌─────────────────────────────────────────┐
│ Service DNS 记录 │
├─────────────────────────────────────────┤
│ 完整格式: │
│ <service>.<namespace>.svc.cluster.local│
│ │
│ 简短格式 (同命名空间): │
│ <service> │
│ │
│ 示例: │
│ my-service.default.svc.cluster.local │
│ my-service (同命名空间) │
└─────────────────────────────────────────┘
┌─────────────────────────────────────────┐
│ Pod DNS 记录 │
├─────────────────────────────────────────┤
│ 格式: │
│ <pod-ip>.<namespace>.pod.cluster.local │
│ │
│ 示例: │
│ 10-244-1-5.default.pod.cluster.local │
└─────────────────────────────────────────┘
DNS 解析流程
1. Pod 访问 Service
curl http://my-service
2. DNS 查询
my-service → my-service.default.svc.cluster.local
3. DNS 解析
my-service.default.svc.cluster.local → 10.96.0.100
4. 访问 Service
http://10.96.0.100:80
DNS 配置
# Pod DNS 配置
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
dnsPolicy: "ClusterFirst"
containers:
- name: my-container
image: my-image
DNS 策略
| 策略 | 说明 | 使用场景 |
|---|---|---|
| ClusterFirst | 优先集群 DNS | 默认策略 |
| Default | 使用节点 DNS | 访问外部服务 |
| None | 自定义 DNS | 特殊需求 |
DNS 解析顺序
┌─────────────────────────────────────────┐
│ DNS 解析顺序 │
├─────────────────────────────────────────┤
│ 1. 搜索域列表 │
│ - default.svc.cluster.local │
│ - svc.cluster.local │
│ - cluster.local │
│ │
│ 2. 完整域名解析 │
│ - my-service.default.svc.cluster. │
│ local │
│ │
│ 3. 外部 DNS 解析 │
│ - example.com │
└─────────────────────────────────────────┘
DNS 配置参数
# 自定义 DNS 配置
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
dnsPolicy: "None"
dnsConfig:
nameservers:
- 10.96.0.10
searches:
- default.svc.cluster.local
- svc.cluster.local
- cluster.local
options:
- name: ndots
value: "5"
containers:
- name: my-container
image: my-image
DNS 特性
| 特性 | 说明 |
|---|---|
| 自动注册 | Service 自动注册 DNS 记录 |
| 动态更新 | Service 变化时自动更新 DNS |
| 跨命名空间 | 支持跨命名空间访问 |
| 搜索域 | 支持短名称解析 |
DNS 使用场景
1. 服务发现
- 通过 Service 名称访问服务
- 无需知道 Service IP
2. 跨命名空间访问
- 访问其他命名空间的服务
- 使用完整 DNS 名称
3. 外部服务访问
- 配置外部 DNS
- 访问外部服务
4. 调试和诊断
- 检查 DNS 解析
- 验证服务可用性
DNS 调试
# 检查 DNS 配置
kubectl exec my-pod -- cat /etc/resolv.conf
# 测试 DNS 解析
kubectl exec my-pod -- nslookup my-service
# 查看 CoreDNS 日志
kubectl logs -n kube-system -l k8s-app=kube-dns
# 检查 DNS 服务
kubectl get svc -n kube-system kube-dns
DNS 最佳实践
1. 使用 DNS 名称访问服务
- 灵活、动态
- 支持跨命名空间
2. 避免硬编码 IP
- Service IP 可能变化
- Pod IP 会变化
3. 配置合适的 DNS 策略
- ClusterFirst 用于集群内服务
- Default 用于外部服务
4. 监控 DNS 服务
- 检查 CoreDNS 状态
- 监控 DNS 解析延迟
实践练习
练习 1:DNS 解析测试
- 创建 Service
- 从 Pod 内部测试 DNS 解析
- 验证不同格式的 DNS 名称
练习 2:自定义 DNS 配置
- 创建自定义 DNS 配置的 Pod
- 测试 DNS 解析
- 验证配置效果
常见误解
1. DNS 不是静态配置
错误:DNS 配置是静态的
正确:DNS 是动态的
Service 变化时 DNS 记录自动更新
2. DNS 不是必须的
错误:必须使用 DNS
正确:可以使用环境变量
DNS 是推荐方式,但不是唯一方式
小结
| 要点 | 说明 |
|---|---|
| Kubernetes DNS | 集群内部 DNS 服务 |
| DNS 记录 | Service → ClusterIP |
| DNS 策略 | ClusterFirst、Default、None |
| 使用场景 | 服务发现、跨命名空间访问 |
| 调试工具 | nslookup、CoreDNS 日志 |
练习编辑器
bash
Loading...