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
Kubernetes URL 静态服务(一)
如果我们无法使用 IP Address 方式访问外部服务,而是需要通过 URL 方式进行外部服务的访问,我们就需要通过 type: ExternalName 的 Domain 静态服务的方式对外部服务建立连接。Kubernetes 会通过内核级别的 CNAME 进行重定向,性能开销非常小。
如下我们为外部的 MongoDb 服务建立了静态服务,我们的应用可以通过连接串的方式进行连接。
mongodb://
apiVersion: v1
kind: Service
metadata:
name: external-mongo
spec:
type: ExternalName
externalName: mongo.service.com
Kubernetes URL 静态服务(二)
通过 Domain 的方式我们连接了外部服务,我们发现外部服务的端口号是硬编码的,如果外部服务端口段是静态的那么这种方式没有任何问题,但是如果外部端口是动态的,那么我们就需要在端口进行变更时,手动修改硬编码的端口,这无异是一种累赘。
对于上述问题,我们可以通过 nslookup domain 或 ping domain 获取到 domain 对应的 IP Address,有了 IP 我们就可以使用 Endpoints 方式对外部服务建立静态连接了。
如下我们为外部的 MongoDb 服务建立了静态服务,我们的应用可以通过连接串的方式进行连接。
mongodb://
$ 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 解析 ip 的方式时,需要确保 ip 地址是不会变的,否则当 ip 发生变更时,在生产环境可能会出现无法连接外部服务的情况。
使用 type: ClusterIp 建立静态服务时,需要确保外部服务的 IP Address 是集群内部 IP 通往的的地址才可以。
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!