PostgreSQL是一款以可靠性和性能为人所熟知的开源数据库。它在很多行业和应用程序中都有应用,尤其是web开发人员的最爱。从node.js到Django再到Rails和Spring,所有主流web框架均原生支持PostgreSQL,所以其适应性在整个互联网的网站后台系统中是相当广泛的。
与任何数据库一样,开发人员需要工具来使用它们。Pgweb是一个开源的、基于web的PostgreSQL客户端。它有一个非常简洁的界面,让你可以连接到任何PostgreSQL实例来浏览数据表,运行查询和导出数据。对于轻量级的数据库工作来说,它比pgAdmin等应用程序更加轻量级和方便。
在安全方面,向互联网开放数据库端口是一个糟糕的想法。需要快速访问调试运行在Kubernetes集群上的生产数据库的开发人员可以通过多种方式设置Pgweb来保证数据库的安全,并保持其安全态势。例如,将Pgweb部署到与数据库相同的集群中,并将其公开暴露,同时保持数据库端口只能在网络内部访问。将Pgweb放在Oauth2代理后面,以获得额外的一层认证,然后就可以从任何地方超级简单和超级安全地访问数据库了。
Pgweb可以在Linux、macOS或Windows上本地运行,但我们今天要探讨的是将它部署到你的Kubernetes集群中。在这篇文章中,我们将把Pgweb镜像作为一个pod部署到我们的集群中,使用Kubernetes服务暴露它,部署PostgreSQL并暴露它(但只在集群内以获得最大的安全性),然后连接到数据库。最后,我们将通过Rancher作为工作负载重新部署一切,看看Rancher让你的应用程序启动和运行变得多么容易。
要完成本文的教程指南,你需要提前准备以下东西:
创建一个名为pgweb.yaml的新文件,将以下内容粘贴进去,然后应用该文件来部署你的pod和服务。
apiVersion: v1kind: Podmetadata: labels: run: pgweb name: pgwebspec: containers: - image: sosedoff/pgweb name: pgweb ports: - containerPort: 8081---apiVersion: v1kind: Servicemetadata: labels: run: pgweb name: pgweb-svcspec: ports: - port: 8081 targetPort: 8081 protocol: TCP type: NodePort selector: run: pgweb
kubectl apply -f pgweb.yamlpod/pgweb createdservice/pgweb-svc created
然后获取服务信息,找到正在使用的节点端口;在本文中,它是31338。你的可能会有所不同,但一般会在30000-32767范围内。
kubectl get svc pgweb-svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEpgweb-svc NodePort 10.96.47.248 <none> 8081:31338/TCP 9s
现在在浏览器中进入一个该端口上的节点的公共IP。找到你的公关IP以及根据你的设置打开必要的防火墙端口,如果一切顺利,你将会看到Pgweb登录页面。
如果你在访问节点端口时遇到问题,端口转发(port forwarding)在紧要关头也能发挥作用。
现在我们需要一个数据库来访问。
与Pgweb类似,我们将使用一个YAML manifest在Kubernetes中部署PostgreSQL。这个稍微有些困难。我们将保留默认的ClusterIP服务类型,因为我们不希望从集群外部访问数据库。否则,我们所有为了保障安全的设置都是白搭。
我们正在使用的镜像是一个标准的PostgreSQL镜像,但是已经预载了样本国家的数据:
https://hub.docker.com/r/ghusta/postgres-world-db
复制以下内容到postgres.yaml中并应用该manifest:
apiVersion: v1kind: Podmetadata: labels: run: postgres name: postgresspec: containers: - image: ghusta/postgres-world-db name: postgres ports: - containerPort: 5432---apiVersion: v1kind: Servicemetadata: labels: run: postgres name: postgres-svcspec: ports: - port: 5432 targetPort: 5432 protocol: TCP selector: run: postgres
kubectl apply -f postgres.yamlpod/postgres createdservice/postgres-svc created
现在回到我们的Pgweb登录页面,用以下信息登录:
Host:postgres-svc.default.svc.cluster.local
用户名:world
密码:world123
数据库:world-db
SSL模式:Disable
现在你已经连接到数据库,点击左侧表格中的“city”:
请注意我们所使用的host名称。这是Kubernetes的内部DNS在工作,允许你通过名字而不是pod IP连接到服务。第一部分是服务名称,我们在postgres.yaml文件中定义了它。第二部分是你的服务所部署的命名空间——本例中为default。接下来,svc明确说明我们使用的是服务名称(你也可以通过名称指定pod)。最后,cluster.local是集群的默认DNS名。这种架构可以轻松地将pod连接在一起,并利用服务如何优雅地处理副本和隔离离线的pod。
回到Pgweb,点击顶部的 "Query",尝试查询数据库中的New Zealand。
SELECT * FROM city WHERE country_code like 'NZL'
或者查询拥有超过80年历史的城市:
SELECT * FROM country WHERE life_expectancy > 80
你可以花费尽可能多的时间来查看数据,就好像你是一个开发人员正在为一个连接到这个数据库的应用程序排除故障一样。当你准备好继续时,从你的集群中删除资源,以便进行下一步:
kubectl delete -f pgweb.yamlkubectl delete -f postgres.yaml
现在我们将重新部署相同的配置,不过这一次我们将使用Rancher来部署工作负载而不是Kubernetes manifest文件。
在你的集群公共IP上访问Pgweb和连接数据库,这与通过Kubernetes manifest文件部署两者时的工作原理是一样的。
在本文中,我们已经了解了Web开发人员的首选数据库PostgreSQL和Pgweb客户端。我们首先使用manifest文件手动将其部署到我们的Kubernetes集群,然后使用Rancher重新部署。两相比较,我们可以看到Rancher能够消除部署和编辑应用程序pods所涉及的一些开销。希望你可以从部署这些资源中获得经验,在设置其他应用程序在多个 pod 之间进行通信(如 WordPress 或自定义 Web 应用程序)的过程中利用这些经验进一步实践。