前言

我们知道 kubernetes 内部服务之间是通过 service 进行相互访问的, 那么如果现在有一个非 kubernetes 部署的服务,我们可以也通过 service 进行内部交互使用吗?答案是可以,我们可以使用 service 的 ExternalName 类型将service 映射到外部服务上。

最近需要将一个外部服务映射到 kubernetes service 上,通过查找资料学习,本文记录如何将 kubernetes service 映射到外部服务的流程步骤。

外部域名映射内部 service

先讲解如何将外部服务通过域名的方式映射到内部 service 上,通过配置 externalName 字段来配置映射关系.例如,以下 Service 定义将 test 命名空间中的 my-service 服务映射到 my.overstarry.vip:

1
2
3
4
5
6
7
8
apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: test
spec:
  type: ExternalName
  externalName: my.overstarry.vip

虽然 externalName 也支持填写 ip 地址,但不会被 kubernetes 解析,如果需要使用 ip 地址,可以使用无头服务 Headless ,下文会进行介绍。

外部服务ip映射service

接下来介绍没有域名的外部服务和service如何进行映射。上文讲过虽然 externalName 也支持填写 ip 地址,但不会被 kubernetes 解析,如果需要,则应该使用 Headless Service 进行映射。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
apiVersion: v1
kind: Service
metadata:
  name: test
spec:
  clusterIP: None
  type: ClusterIP

---

apiVersion: v1
kind: Endpoints
metadata:
 name: test
subsets:
 - addresses:
     - ip: 10.0.1.10

创建service 不指定 selector,手动维护创建 endpoint,创建之后就可以通过 test 访问 10.0.1.10 这个外部服务。

小结

本文简单的介绍了 kubernetes 如何将 service 和 外部服务进行映射,通过查阅资料可以得知两种方式映射外部服务是没有经过中间层代理的,都是通过 DNS 劫持实现。通过外部服务映射的功能,我们可以使用不同命名空间的service访问不同的数据库。

参考