37·Service进阶

服务发现

kubernetesservicediscoverynetworking

服务发现

学习目标

  1. 理解服务发现的概念
  2. 掌握 Kubernetes 服务发现机制
  3. 了解服务发现的使用方式

核心概念

一句话解释

服务发现是 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 服务发现

  1. 创建 Service
  2. 从 Pod 内部通过 DNS 名称访问 Service
  3. 验证 DNS 解析

练习 2:环境变量服务发现

  1. 创建 Service
  2. 查看 Pod 环境变量
  3. 通过环境变量访问 Service

常见误解

1. 服务发现不是手动配置

错误:手动配置服务 IP
正确:使用 DNS 或环境变量

Kubernetes 自动提供服务发现机制

2. 服务发现不是静态的

错误:服务发现配置是静态的
正确:服务发现是动态的

Service IP 稳定,但后端 Pod 会变化

小结

要点说明
服务发现自动发现和访问服务
DNS通过 DNS 名称访问服务
环境变量通过环境变量访问服务
Endpoints后端 Pod IP 列表
最佳实践优先使用 DNS

练习编辑器

bash
Loading...

继续学习

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