本文转自Rancher Labs

介绍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-...)
  • 由Rancher治理的Kubernetes集群(依据这一文档导入或配置一个集群:https://rancher2.docs.rancher...)

部署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/ghus...

复制以下内容到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文件。

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

结 论

在本文中,咱们曾经理解了Web开发人员的首选数据库PostgreSQL和Pgweb客户端。咱们首先应用manifest文件手动将其部署到咱们的Kubernetes集群,而后应用Rancher重新部署。两相比拟,咱们能够看到Rancher可能打消部署和编辑应用程序pods所波及的一些开销。心愿你能够从部署这些资源中取得教训,在设置其余应用程序在多个 pod 之间进行通信(如 WordPress 或自定义 Web 应用程序)的过程中利用这些教训进一步实际。

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