K8S External Service

Kubernetes 外部服务

   在 Kubernetes 使用过程中,我们经常会使用一些部署在 Kubernetes 集群外的服务,例如数据库、缓存、配置中心等。在开发过程中对于这些服务我们一般都会部署多个环境,例如开发、测试、生产等,那么每个环境都会有不同的 IP Address 或 Domain,而我们又不想在每个环境里都变更代码,所以一般都不会硬编码这些地址。

   在 Kubernetes 中我们可以基于 DNS 服务发现来访问这些外部服务,就如同访问本地服务一样。

多环境外部服务

Kubernetes 静态服务

   在 Kubernetes 中可以使用静态服务的方式,对外部服务建立连接。

   我们可以创建一个没有关联任何 Pod 的 Service 对象,然后在创建一个可以接受流量的 Endpoints 对象。在 Endpoints 中需要手动置顶远程服务 IP Address 并且使用与 Service 相同的名字。Kubernetes 会使用配置的所有 IP Address 来建立外部服务连接,这样我们就可以使用一条简单的连接串来访问外部服务了。也就避免了在应用中硬编码外部服务的问题。如果以后 IP Address 发生变更,我们只需要在 Endpoints 中更新即可,应用程序无需任何变更,这对应用是透明的。

静态服务

Kubernetes IP 静态服务

   如果我们可以使用 IP Address 方式访问外部服务,我们就可以通过 type: ClusterIp 的 IP 静态服务的方式对外部服务建立连接。Kubernetes 会通过 IP 方式进行重定向,性能开销非常小。

   如下我们为外部的 MongoDb 服务建立了静态服务,我们的应用可以通过连接串的方式进行连接。

  mongodb://external-mongo

apiVersion: v1
kind: Service
metadata:
  name: external-mongo
spec:
  type: ClusterIp
  ports:
  - port: 27017
    targetPort: 27017
apiVersion: v1
kind: Endpoints
metadata:
  name: external-mongo
subsets:
  - address:
      - ip: 10.0.0.1
    ports:
      - port: 27017
IP 静态服务

Kubernetes URL 静态服务(一)

   如果我们无法使用 IP Address 方式访问外部服务,而是需要通过 URL 方式进行外部服务的访问,我们就需要通过 type: ExternalName 的 Domain 静态服务的方式对外部服务建立连接。Kubernetes 会通过内核级别的 CNAME 进行重定向,性能开销非常小。

   如下我们为外部的 MongoDb 服务建立了静态服务,我们的应用可以通过连接串的方式进行连接。

  mongodb://:@external-mongo:/dev

apiVersion: v1
kind: Service
metadata:
  name: external-mongo
spec:
  type: ExternalName
  externalName: mongo.service.com
Domain 静态服务带端口

Kubernetes URL 静态服务(二)

   通过 Domain 的方式我们连接了外部服务,我们发现外部服务的端口号是硬编码的,如果外部服务端口段是静态的那么这种方式没有任何问题,但是如果外部端口是动态的,那么我们就需要在端口进行变更时,手动修改硬编码的端口,这无异是一种累赘。

   对于上述问题,我们可以通过 nslookup domain 或 ping domain 获取到 domain 对应的 IP Address,有了 IP 我们就可以使用 Endpoints 方式对外部服务建立静态连接了。

   如下我们为外部的 MongoDb 服务建立了静态服务,我们的应用可以通过连接串的方式进行连接。

  mongodb://:@external-mongo/dev

$ nslookup mongo.service.com  
Server:        192.168.1.1
Address:    192.168.1.1#53

Non-authoritative answer:
www.baidu.com    canonical name = mongo.service.com 
Name:    mongo.service.com 
Address: 10.0.0.1
apiVersion: v1
kind: Service
metadata:
  name: external-mongo
spec:
  ports:
  - port: 27017
    targetPort: 27017
apiVersion: v1
kind: Endpoints
metadata:
  name: external-mongo
subsets:
  - address:
      - ip: 10.0.0.1
    ports:
      - port: 27017
Domain 静态服务无端口

注意事项

  • 使用 domain 解析 ip 的方式时,需要确保 ip 地址是不会变的,否则当 ip 发生变更时,在生产环境可能会出现无法连接外部服务的情况。

  • 使用 type: ClusterIp 建立静态服务时,需要确保外部服务的 IP Address 是集群内部 IP 通往的的地址才可以。



Kubernetes     

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!