17.2. 为外部数据库定义服务
最常见的外部服务类型是外部数据库。要支持外部数据库,应用程序需要:
- 一个要与之通信的端点。
一组凭证和协调,包括:
- 用户名
- 密码短语
- 数据库名称
与外部数据库集成的解决方案包括:
-
一个
Service
对象,它将 SaaS 供应商表示为 OpenShift Container Platform 服务。 -
服务的一个或多个
端点
。 - 含有凭据的适当 pod 中的环境变量。
下列步骤概述了与外部 MySQL 数据库集成的情况:
17.2.1. 第 1 步:定义服务
您可以通过提供 IP 地址和端点来定义服务,或者提供完全限定域名(FQDN)。
17.2.1.1. 使用 IP 地址
创建一个 OpenShift Container Platform 服务来 代表您的外部数据库。这与创建内部服务类似,差异在服务的
Selector
字段中。内部 OpenShift Container Platform 服务使用
Selector
字段,通过 标签 将 pod 与服务关联。EndpointsController
系统组件将指定选择器的服务端点与与选择器匹配的 pod 同步。服务代理和 OpenShift Container Platform 路由器在服务端点之间对服务进行负载均衡。代表外部资源的服务不需要关联的 pod。相反,请保留
Selector
字段未设置。这代表了外部服务,使EndpointsController
忽略该服务并允许手动指定端点:kind: "Service" apiVersion: "v1" metadata: name: "external-mysql-service" spec: ports: - name: "mysql" protocol: "TCP" port: 3306 targetPort: 3306 1 nodePort: 0 selector: {} 2
接下来,为该服务创建所需的端点。这为服务代理和路由器提供发送到服务的流量的位置:
kind: "Endpoints" apiVersion: "v1" metadata: name: "external-mysql-service" 1 subsets: 2 - addresses: - ip: "10.0.0.0" 3 ports: - port: 3306 4 name: "mysql"
17.2.1.2. 使用外部域名
使用外部域名可以更轻松地管理外部服务链接,因为您不必担心外部服务的 IP 地址更改。
ExternalName
服务没有选择器,或者任何定义的端口或端点,您可以使用 ExternalName
服务将流量定向到外部服务。
kind: "Service"
apiVersion: "v1"
metadata:
name: "external-mysql-service"
spec:
type: ExternalName
externalName: example.domain.name
selector: {} 1
- 1
- 将
selector
字段留为空。
使用外部域名服务会通知系统在 externalName
字段中(上例中的example.domain.name
)中的 DNS 名称是恢复该服务的资源位置。针对 Kubernetes DNS 服务器发出 DNS 请求时,它会在 CNAME 记录中返回 externalName
,告知客户端查找返回的名称以获取 IP 地址。