ExternalName 服务
学习目标
- 理解 ExternalName 的工作原理
- 掌握 ExternalName 的配置方法
- 了解 ExternalName 的使用场景
核心概念
一句话解释
ExternalName 是 Kubernetes 中用于将 Service 映射到外部 DNS 名称的 Service 类型,不代理流量。
ExternalName 工作原理
集群内部 Pod
│
▼
┌─────────────────────────────────────────┐
│ ExternalName Service │
│ 名称: external-service │
│ externalName: api.example.com │
└─────────────────────────────────────────┘
│
▼ (DNS CNAME 记录)
┌─────────────────────────────────────────┐
│ 外部服务 │
│ api.example.com │
│ IP: 203.0.113.10 │
└─────────────────────────────────────────┘
ExternalName 配置
apiVersion: v1
kind: Service
metadata:
name: external-service
spec:
type: ExternalName
externalName: api.example.com
配置参数说明
| 参数 | 说明 | 默认值 |
|---|---|---|
| type | Service 类型 | ExternalName |
| externalName | 外部 DNS 名称 | 无 |
ExternalName 访问方式
1. 通过 Service 名称访问
curl http://external-service
2. DNS 解析结果
external-service.default.svc.cluster.local → CNAME → api.example.com
ExternalName 与其他 Service 类型
┌─────────────────────────────────────────┐
│ ClusterIP/NodePort/LoadBalancer │
│ - 代理流量到后端 Pod │
│ - 提供负载均衡 │
│ - 有 Endpoints │
└─────────────────────────────────────────┘
┌─────────────────────────────────────────┐
│ ExternalName │
│ - 不代理流量 │
│ - 仅 DNS CNAME 记录 │
│ - 无 Endpoints │
└─────────────────────────────────────────┘
ExternalName 特性
| 特性 | 说明 |
|---|---|
| DNS CNAME | 创建 DNS CNAME 记录 |
| 不代理流量 | 不处理网络流量 |
| 无 Endpoints | 不创建 Endpoints |
| 外部访问 | 访问集群外部服务 |
| 简单配置 | 配置简单 |
ExternalName 使用场景
1. 访问外部数据库
- 外部 MySQL、PostgreSQL
- 云数据库服务
2. 访问外部 API
- 第三方 API
- 外部微服务
3. 访问外部缓存
- 外部 Redis
- 云缓存服务
4. 统一访问入口
- 内部服务和外部服务统一访问方式
- 简化配置
ExternalName 与 DNS
┌─────────────────────────────────────────┐
│ Kubernetes DNS │
│ ┌─────────────────────────────────┐ │
│ │ external-service.default.svc. │ │
│ │ cluster.local │ │
│ │ │ │ │
│ │ ▼ (CNAME) │ │
│ │ api.example.com │ │
│ └─────────────────────────────────┘ │
└─────────────────────────────────────────┘
ExternalName 限制
1. 不代理流量
- 仅 DNS 重定向
- 不提供负载均衡
- 不提供健康检查
2. 依赖外部服务
- 外部服务必须可用
- 无自动故障转移
3. 无 Endpoints
- 不创建 Endpoints
- 无法查看后端状态
4. 仅支持 DNS 名称
- 不支持 IP 地址
- 不支持端口映射
ExternalName 与 Headless Service
ExternalName:
- DNS CNAME 记录
- 不代理流量
- 访问外部服务
Headless Service:
- 无 ClusterIP
- 直接返回 Pod IP
- 访问内部 Pod
实践练习
练习 1:创建 ExternalName Service
创建一个 ExternalName Service:
apiVersion: v1
kind: Service
metadata:
name: external-db
spec:
type: ExternalName
externalName: db.example.com
练习 2:验证 ExternalName
- 创建 Service
- 查看 DNS 记录
- 从集群内部访问外部服务
常见误解
1. ExternalName 不代理流量
错误:ExternalName 代理外部服务流量
正确:ExternalName 仅创建 DNS CNAME 记录
流量直接从 Pod 到外部服务,不经过 Service
2. ExternalName 不是负载均衡器
错误:ExternalName 提供负载均衡
正确:ExternalName 仅 DNS 重定向
需要负载均衡:使用 LoadBalancer 或 Ingress
小结
| 要点 | 说明 |
|---|---|
| ExternalName | 外部 DNS 名称映射 |
| DNS CNAME | 创建 DNS CNAME 记录 |
| 不代理流量 | 仅 DNS 重定向 |
| 使用场景 | 访问外部服务 |
| 限制 | 不代理流量、无 Endpoints |
练习编辑器
bash
Loading...