38·Service进阶

DNS 解析

kubernetesservicednsnetworking

DNS 解析

学习目标

  1. 理解 Kubernetes DNS 的工作原理
  2. 掌握 DNS 解析的配置方法
  3. 了解 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 解析测试

  1. 创建 Service
  2. 从 Pod 内部测试 DNS 解析
  3. 验证不同格式的 DNS 名称

练习 2:自定义 DNS 配置

  1. 创建自定义 DNS 配置的 Pod
  2. 测试 DNS 解析
  3. 验证配置效果

常见误解

1. DNS 不是静态配置

错误:DNS 配置是静态的
正确:DNS 是动态的

Service 变化时 DNS 记录自动更新

2. DNS 不是必须的

错误:必须使用 DNS
正确:可以使用环境变量

DNS 是推荐方式,但不是唯一方式

小结

要点说明
Kubernetes DNS集群内部 DNS 服务
DNS 记录Service → ClusterIP
DNS 策略ClusterFirst、Default、None
使用场景服务发现、跨命名空间访问
调试工具nslookup、CoreDNS 日志

练习编辑器

bash
Loading...

继续学习

完成本课后,建议继续学习下一课「Endpoints」 以巩固所学知识。