跳到主要内容

ExternalName 域名映射

ExternalName 是什么?

ExternalName 是 Kubernetes 中的一种服务(Service)类型,它允许你为集群外的服务创建一个别名。当你在 Kubernetes 集群内部的应用程序尝试访问这个服务时,它会被透明地重定向到配置的外部 DNS 名称。

ExternalName 服务不同于其他类型的 Kubernetes 服务(如 ClusterIP, NodePort, 或 LoadBalancer),它不会配置 IPVS 或 iptables 规则,也不会分配集群内部的 IP 地址。相反,它仅仅在 Kubernetes 的 DNS 系统中创建一个 CNAME 记录,将服务名称解析到外部的 DNS 名称。

下面是一个 ExternalName 服务的例子:

apiVersion: v1
kind: Service
metadata:
name: my-external-service
spec:
type: ExternalName
externalName: my.external.service.com
ports:
- port: 80

在这个例子中,my-external-service 是一个 ExternalName 类型的服务,它指向 my.external.service.com。任何在集群内部尝试访问 my-external-service.default.svc.cluster.local 的 DNS 查询都会返回一个 CNAME 记录,指向 my.external.service.com

这种类型的服务主要有以下几种用途:

  1. 服务迁移:如果你正在将一个服务从集群外部迁移到 Kubernetes 集群内部(或者反之),你可以使用 ExternalName 服务来实现无缝迁移,因为客户端不需要更改服务名称。

  2. 简化配置:如果你的应用需要访问一个在多个环境中位置不同的服务,你可以在每个环境中使用一个相同名称但指向不同 externalNameExternalName 服务来简化配置。

  3. 引用第三方服务:当你的应用需要访问一个托管在 Kubernetes 集群外部的第三方服务时,你可以使用 ExternalName 服务来为这个服务提供一个集群内部的服务名。

请注意,因为 ExternalName 服务只是在 DNS 层面上进行重定向,客户端解析到的实际地址是外部服务的地址,所以你需要确保网络策略和防火墙规则允许从 Kubernetes 集群到外部服务的网络流量。

具体的使用例子

假设有一个运行在 Kubernetes 集群外部的数据库服务,让我们称它为 external-database,并且这个数据库服务可以通过域名 external-database.example.com 进行访问。

你希望你在 Kubernetes 集群内运行的应用能够通过一个稳定的服务名来访问这个数据库,而不是直接使用域名。这样,即使将来数据库的地址发生变化,你也只需要更新 Kubernetes 服务的配置,而不是修改每一个应用的配置。

你可以通过创建一个 ExternalName 类型的服务来实现这一点。下面是一个 Kubernetes Service 的 YAML 配置示例:

apiVersion: v1
kind: Service
metadata:
name: internal-db-service
spec:
type: ExternalName
externalName: external-database.example.com
ports:
- port: 3306

在这个例子中,我们创建了一个名为 internal-db-serviceExternalName 服务,它指向 external-database.example.com 的域名,并且使用了 MySQL 默认的端口号 3306。

应用现在可以通过访问 internal-db-service.default.svc.cluster.local:3306 来访问外部的数据库服务,Kubernetes 的 DNS 系统会将这个服务名解析为 external-database.example.com

这样,即使 external-database.example.com 的 IP 地址发生变化,或者你决定将数据库迁移到 Kubernetes 集群内部,你也只需要更新 internal-db-service 的配置,而不需要修改所有使用了这个数据库服务的应用的配置。

请注意,因为 ExternalName 只是在 DNS 层面上进行重定向,所以网络策略和防火墙规则需要正确配置,以允许从 Kubernetes 集群到 external-database.example.com 的网络流量。