服务发现
学习目标
- 理解服务发现的概念
- 掌握 Kubernetes 服务发现机制
- 了解服务发现的使用方式
核心概念
一句话解释
服务发现是 Kubernetes 中自动发现和访问服务的机制,通过 DNS 和环境变量实现。
服务发现解决问题
问题:如何找到服务?
┌─────────────────────────────────────────┐
│ Pod A 需要访问 Pod B │
│ - Pod B 的 IP 是什么? │
│ - Pod B 重启后 IP 变了怎么办? │
│ - Pod B 有多个副本怎么访问? │
└─────────────────────────────────────────┘
服务发现解决方案:
┌─────────────────────────────────────────┐
│ Service │
│ - 稳定的访问入口 │
│ - 自动负载均衡 │
│ - DNS 名称解析 │
└─────────────────────────────────────────┘
Kubernetes 服务发现机制
┌─────────────────────────────────────────┐
│ 服务发现机制 │
├─────────────────────────────────────────┤
│ 1. DNS 解析 │
│ - Service 名称 → ClusterIP │
│ - 自动创建 DNS 记录 │
│ │
│ 2. 环境变量 │
│ - Service IP 和端口 │
│ - Pod 启动时注入 │
│ │
│ 3. Endpoints │
│ - 后端 Pod IP 列表 │
│ - 自动更新 │
└─────────────────────────────────────────┘
DNS 服务发现
┌─────────────────────────────────────────┐
│ DNS 记录 │
├─────────────────────────────────────────┤
│ Service: my-service │
│ Namespace: default │
│ │
│ DNS 记录: │
│ - my-service.default.svc.cluster.local │
│ - my-service (同命名空间) │
│ │
│ 解析结果: │
│ - ClusterIP: 10.96.0.100 │
└─────────────────────────────────────────┘
环境变量服务发现
┌─────────────────────────────────────────┐
│ 环境变量 │
├─────────────────────────────────────────┤
│ Service: my-service │
│ ClusterIP: 10.96.0.100 │
│ Port: 80 │
│ │
│ 注入到 Pod 的环境变量: │
│ MY_SERVICE_SERVICE_HOST=10.96.0.100 │
│ MY_SERVICE_SERVICE_PORT=80 │
└─────────────────────────────────────────┘
服务发现流程
1. 创建 Service
└─ 分配 ClusterIP
└─ 创建 DNS 记录
└─ 创建 Endpoints
2. Pod 访问 Service
└─ 通过 DNS 名称解析
└─ 获取 ClusterIP
└─ 访问 ClusterIP
3. kube-proxy 路由
└─ 接收请求
└─ 选择后端 Pod
└─ 转发请求
服务发现方式对比
| 方式 | 优点 | 缺点 | 使用场景 |
|---|---|---|---|
| DNS | 灵活、动态 | 依赖 DNS | 首选方式 |
| 环境变量 | 简单、直接 | 静态、需重启 | 简单应用 |
| Endpoints | 直接访问 Pod | 复杂 | 特殊需求 |
DNS 服务发现详解
┌─────────────────────────────────────────┐
│ DNS 记录格式 │
├─────────────────────────────────────────┤
│ 完整格式: │
│ <service-name>.<namespace>.svc. │
│ cluster.local │
│ │
│ 简短格式 (同命名空间): │
│ <service-name> │
│ │
│ 示例: │
│ my-service.default.svc.cluster.local │
│ my-service (同命名空间) │
└─────────────────────────────────────────┘
环境变量服务发现详解
┌─────────────────────────────────────────┐
│ 环境变量命名规则 │
├─────────────────────────────────────────┤
│ Service: my-service │
│ Port: 80 │
│ │
│ 环境变量: │
│ MY_SERVICE_SERVICE_HOST=10.96.0.100 │
│ MY_SERVICE_SERVICE_PORT=80 │
│ │
│ 规则: │
│ - 大写、连字符转下划线 │
│ - 后缀: _SERVICE_HOST, _SERVICE_PORT │
└─────────────────────────────────────────┘
服务发现最佳实践
1. 优先使用 DNS
- 灵活、动态
- 支持跨命名空间访问
2. 避免硬编码 IP
- Service IP 可能变化
- Pod IP 会变化
3. 使用命名空间
- 隔离服务
- 避免名称冲突
4. 配置健康检查
- 自动移除不健康 Pod
- 提高可用性
实践练习
练习 1:DNS 服务发现
- 创建 Service
- 从 Pod 内部通过 DNS 名称访问 Service
- 验证 DNS 解析
练习 2:环境变量服务发现
- 创建 Service
- 查看 Pod 环境变量
- 通过环境变量访问 Service
常见误解
1. 服务发现不是手动配置
错误:手动配置服务 IP
正确:使用 DNS 或环境变量
Kubernetes 自动提供服务发现机制
2. 服务发现不是静态的
错误:服务发现配置是静态的
正确:服务发现是动态的
Service IP 稳定,但后端 Pod 会变化
小结
| 要点 | 说明 |
|---|---|
| 服务发现 | 自动发现和访问服务 |
| DNS | 通过 DNS 名称访问服务 |
| 环境变量 | 通过环境变量访问服务 |
| Endpoints | 后端 Pod IP 列表 |
| 最佳实践 | 优先使用 DNS |
练习编辑器
bash
Loading...