在之前的博文中,我们演示过如何通过ceph来实现kubernetes的持久存储,以使得像mysql这种有状态服务可以在kubernetes中运行并保存数据。这看起来很美妙,然而在实际的生产环境使用中,通过分布式存储来实现的磁盘在mysql这种IO密集性应用中,性能问题会显得非常突出。所以在实际应用中,一般不会把mysql这种应用直接放入kubernetes中管理,而是使用专用的服务器来独立部署。而像web这种无状态应用依然会运行在kubernetes当中,这个时候web服务器要连接kubernetes管理之外的数据库,有两种方式:一是直接连接数据库所在物理服务器IP,另一种方式就是借助kubernetes的Endpoints直接将外部服务器映射为kubernetes内部的一个服务。
我们来看一个简单的示例:
apiVersion: v1
kind: Service
metadata:
name: plat-dev
spec:
ports:
- port: 3306
protocol: TCP
targetPort: 3306
---
apiVersion: v1
kind: Endpoints
metadata:
name: plat-dev
subsets:
- addresses:
- ip: "10.5.5.19"
ports:
- port: 3306
这个示例定义了两种资源对象,分别是Service和Endpoints。其中Service的定义并没有使用标签选择器,而在后面定义了一个与Service同名的Endpoints,以使得它们能自动关联。Endpoints的subsets中指定了需要连接的外部服务器的IP和端口。
我们可以通过kubectl get svc来进行查看:
kubectl get svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
plat-dev 10.234.3.75 <none> 3306/TCP 20m