如何简洁优雅地部署PostgreSQL和Pgweb?
本文转自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-start/)
由Rancher管理的Kubernetes集群(根据这一文档导入或配置一个集群:https://rancher2.docs.rancher.cn/docs/cluster-provisioning/_index)
部署Pgweb
创建一个名为pgweb.yaml的新文件,将以下内容粘贴进去,然后应用该文件来部署你的pod和服务。
apiVersion: v1
kind: Pod
metadata:
labels:
run: pgweb
name: pgweb
spec:
containers:
- image: sosedoff/pgweb
name: pgweb
ports:
- containerPort: 8081
---
apiVersion: v1
kind: Service
metadata:
labels:
run: pgweb
name: pgweb-svc
spec:
ports:
- port: 8081
targetPort: 8081
protocol: TCP
type: NodePort
selector:
run: pgweb
kubectl apply -f pgweb.yaml
pod/pgweb created
service/pgweb-svc created
然后获取服务信息,找到正在使用的节点端口;在本文中,它是31338。你的可能会有所不同,但一般会在30000-32767范围内。
kubectl get svc pgweb-svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
pgweb-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: v1
kind: Pod
metadata:
labels:
run: postgres
name: postgres
spec:
containers:
- image: ghusta/postgres-world-db
name: postgres
ports:
- containerPort: 5432
---
apiVersion: v1
kind: Service
metadata:
labels:
run: postgres
name: postgres-svc
spec:
ports:
- port: 5432
targetPort: 5432
protocol: TCP
selector:
run: postgres
kubectl apply -f postgres.yaml
pod/postgres created
service/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.yaml
kubectl 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 pods和kubectl get svc以查看Rancher部署的pod和服务。
结 论
在本文中,我们已经了解了Web开发人员的首选数据库PostgreSQL和Pgweb客户端。我们首先使用manifest文件手动将其部署到我们的Kubernetes集群,然后使用Rancher重新部署。两相比较,我们可以看到Rancher能够消除部署和编辑应用程序pods所涉及的一些开销。希望你可以从部署这些资源中获得经验,在设置其他应用程序在多个 pod 之间进行通信(如 WordPress 或自定义 Web 应用程序)的过程中利用这些经验进一步实践。
在你的集群公共IP上访问Pgweb和连接数据库,这与通过Kubernetes manifest文件部署两者时的工作原理是一样的。
如何简洁优雅地部署PostgreSQL和Pgweb?的更多相关文章
- docker部署postgresql时,data目录不生效的问题探究
今天用docker部署postgresql,用的是官方的镜像.结果挂载完 /var/lib/postgresql/data目录后,和容器里的目录其实并没有挂载成功. 母机上的目录并没有成功挂载到容器里 ...
- 使用 pm2 优雅的部署 node 程序
使用 pm2 优雅的部署 node 程序 # 启动并监控名字为 XXX 的 npm run start:dev 命令 pm2 start npm --watch --name XXX -- run s ...
- Async:简洁优雅的异步之道
前言 在异步处理方案中,目前最为简洁优雅的便是 async函数(以下简称A函数).经过必要的分块包装后,A函数能使多个相关的异步操作如同同步操作一样聚合起来,使其相互间的关系更为清晰.过程更为简洁.调 ...
- 推荐一个简洁优雅的博客系统,farbox
这是我用farbox搞的一个博客:http://www.jsnull.com/ 特点: 1.无数据库,数据存在dropbox里,需要自己注册一个dropbox帐号 2.静态文本文件即是文章,可以在任何 ...
- Revealjs网页版PPT让你复制粘贴另类装逼,简洁优雅又低调,不懂编程也看过来
Revealjs网页版PPT让你复制粘贴另类装逼,简洁优雅又低调,不懂编程也看过来 要了解一个新知识我们可以从三个方面入手:是什么,有什么用,怎么用.下面我们就从这三个方面进行讲解Reveal.js噢 ...
- Java8之——简洁优雅的Lambda表达式
Java8发布之后,Lambda表达式,Stream等等之类的字眼边慢慢出现在我们字眼.就像是Java7出现了之后,大家看到了“钻石语法”,看到了try-with-resource等等.面对这些新东西 ...
- 牛逼哄哄的 Lambda 表达式,简洁优雅就是生产力!
阅读本文大概需要 4 分钟. 作者:Sevenvidia https://www.zhihu.com/question/20125256/answer/324121308 什么是Lambda? 我们知 ...
- 开发基础之牛逼哄哄的 Lambda 表达式,简洁优雅就是生产力
什么是Lambda? 我们知道,对于一个Java变量,我们可以赋给其一个“值”. 如果你想把“一块代码”赋给一个Java变量,应该怎么做呢? 比如,我想把右边那块代码,赋给一个叫做aBlockOfCo ...
- centos7部署postgresql集群高可用 patroni + etcd 之patroni篇
实验环境:centos7.4纯净版 postgres版本: 9.6.15 etcd版本:3.3.11 patroni版本:1.6.0 patroni介绍可参考:https://github.com/z ...
随机推荐
- Numpy修改数组中的元素值
import numpy as np x = np.arange(8) # [0 1 2 3 4 5 6 7] # 在数组尾部追加一个元素 np.append(x,10) # array([ 0, 1 ...
- Hexo 静态博客指南:建站教程(中)
本文最初发布于我的个人博客Bambrow's Blog,采用 BY-NC-SA 许可协议,转载请注明出处.若有后续更新,将更新于原博客.欢迎去我的博客阅读更多文章! 本文详细记录一下站点建立过程,以便 ...
- PHP cal_from_jd() 函数
------------恢复内容开始------------ 实例 把儒略日计数转换为格利高里历法的日期: <?php$d=unixtojd(mktime(0,0,0,6,20,2007));p ...
- PHP dechex() 函数
实例 把十进制转换为十六进制: <?phpecho dechex("30") . "<br>";echo dechex("10&qu ...
- luogu 1587 [NOI2016]循环之美
LINK:NOI2016循环之美 这道题是 给出n m k 求出\(1\leq i\leq n,1\leq j\leq m\) \(\frac{i}{j}\)在k进制下是一个纯循环的. 由于数值相同的 ...
- Java和C语言谁是编程语言的老大?
最近,TIOBE 公布了 2020 年 7 月的编程语言排行榜. 本次排行榜的最大亮点就是:C语言击败Java,稳坐老大宝座! 这两年,编程语言排行榜榜首位置,不是C语言,就是Java. 以下为具体榜 ...
- linux之SAMBA共享目录服务端架设
samba 共享目录 1.SAMBA服务概述 协议 监听端口137 架构 samba:Linux系统的一种文件共享程序服务 通常在主机文件共享的应用场景中,由于文件系统的差异化,Windows和L ...
- RESTFUL风格的URL请求及参数接收
RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义.RESTFUL适用于移动互联网厂商作为业务使能接口的场景,实现第三方OTT调用移动网络资源 ...
- 不使用spring-boot-starter-parent作为依赖parent
背景环境 在某些情况下由于某些原因,我们的项目不能使用spring-boot-starter-parent作为<parent>依赖,一定要有自己的<parent>,但同时还希望 ...
- nodeJs + js 大文件分片上传
简单的文件上传 一.准备文件上传的条件: 1.安装nodejs环境 2.安装vue环境 3.验证环境是否安装成功 二.实现上传步骤 1.前端部分使用 vue-cli 脚手架,搭建一个 demo 版本, ...