Red Hat Training

A Red Hat training course is available for OpenShift Container Platform

17.2. 为外部数据库定义服务

最常见的外部服务类型是外部数据库。要支持外部数据库,应用程序需要:

  1. 一个要与之通信的端点。
  2. 一组凭证和协调,包括:

    • 用户名
    • 密码短语
    • 数据库名称

与外部数据库集成的解决方案包括:

  • 一个 Service 对象,它将 SaaS 供应商表示为 OpenShift Container Platform 服务。
  • 服务的一个或多个端点
  • 含有凭据的适当 pod 中的环境变量。

下列步骤概述了与外部 MySQL 数据库集成的情况:

17.2.1. 第 1 步:定义服务

您可以通过提供 IP 地址和端点来定义服务,或者提供完全限定域名(FQDN)。

17.2.1.1. 使用 IP 地址

  1. 创建一个 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
    1
    可选:服务将连接转发到的后备 pod 上的端口。
    2
    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"
    1
    Service 实例的名称,如上一步中所定义。
    2
    如果提供了多个端点,则在提供的端点间对服务的流量进行负载平衡。
    3
    端点 IP 不能是 loopback (127.0.0.0/8), link-local (169.254.0.0/16), 或 link-local multicast (224.0.0.0/24).
    4
    portname 定义必须与上一步中定义的服务中的 portname 的值相匹配。

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 地址。