简洁优雅地部署PostgreSQL和Pgweb的步骤

发表时间: 2020-08-25 10:20

介绍PostgreSQL和Pgweb


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让你的应用程序启动和运行变得多么容易。



前期准备


要完成本文的教程指南,你需要提前准备以下东西:


  • Rancher deployment(你可以查看官网的快速指南了解如何启动并运行Rancher:https://www.rancher.cn/quick-start/
  • 由Rancher管理的Kubernetes集群(根据这一文档导入或配置一个集群:https://rancher2.docs.rancher.cn/docs/cluster-provisioning/_index

部署Pgweb


创建一个名为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)在紧要关头也能发挥作用。


现在我们需要一个数据库来访问。


使用示例数据部署PostgreSQL


与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


通过集群DNS连接到数据库


现在回到我们的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重新部署


现在我们将重新部署相同的配置,不过这一次我们将使用Rancher来部署工作负载而不是Kubernetes manifest文件。


  1. 在【Global】视图中,打开你要部署工作负载的项目(如果你没有创建其他项目,默认项目也可以)。
  2. 我们可以导入YAML文件,但这一次我们试试全程使用GUI来构建我们的配置,点击【Deploy
  3. 将其命名为pgweb,并设置Docker镜像为sosedoff/pgweb。
  4. 点击【Add Port】,将其命名为pgweb-svc并设置容器端口为8080
  5. 点击【Launch】,Rancher将把你的Pod部署到集群中
  6. 现在对PostgreSQL pod重复以上步骤,起一个合适的名字并使用ghusta/postgres-world-db作为镜像。容器端口为5432,并将服务类型更改为Cluster IP。
  7. 在该页面上列出你的工作负载,你将看到分配给Pgweb集群的节点端口,使用该端口访问Pgweb登录页面,并使用同一凭据登录。
  8. 回到你的terminal,运行kubectl get pods和kubectl get svc以查看Rancher部署的pod和服务。


在你的集群公共IP上访问Pgweb和连接数据库,这与通过Kubernetes manifest文件部署两者时的工作原理是一样的。

结 论


在本文中,我们已经了解了Web开发人员的首选数据库PostgreSQL和Pgweb客户端。我们首先使用manifest文件手动将其部署到我们的Kubernetes集群,然后使用Rancher重新部署。两相比较,我们可以看到Rancher能够消除部署和编辑应用程序pods所涉及的一些开销。希望你可以从部署这些资源中获得经验,在设置其他应用程序在多个 pod 之间进行通信(如 WordPress 或自定义 Web 应用程序)的过程中利用这些经验进一步实践。