36·Service进阶

ExternalName 服务

kubernetesserviceexternalnamenetworking

ExternalName 服务

学习目标

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

配置参数说明

参数说明默认值
typeService 类型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

  1. 创建 Service
  2. 查看 DNS 记录
  3. 从集群内部访问外部服务

常见误解

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...

继续学习

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