如何简洁优雅地部署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 ...
随机推荐
- 02_Linux实操篇
第五章 VI和VIM编辑器 5.1. VI和VIM基本介绍 Vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器.由于对Unix及Linux系统的任何版本,Vi ...
- 下载数据到csv中(乱码),使用numpy , pandas读取失败 解决方案
读取数据,下载数据到 csv 文件中 allUniv 列表类型[[...],[...]] 字符集编码使用 utf-8-sig with open('文件名.csv','w',newline='',en ...
- SELECT within SELECT Tutorial -- SQLZOO
SELECT within SELECT Tutorial 注意:where语句中对表示条件的需要用单引号, 下面的译文使用的是有道翻译如有不正确,请直接投诉有道 01.List each count ...
- Python os.ftruncate() 方法
概述 os.ftruncate() 裁剪文件描述符fd对应的文件, 它最大不能超过文件大小.高佣联盟 www.cgewang.com Unix, Windows上可用. 语法 ftruncate()方 ...
- PHP strtotime() 函数
------------恢复内容开始------------ 实例 将任何字符串的日期时间描述解析为 Unix 时间戳: <?php // 设置时区 date_default_timezone_ ...
- CF掉分日记 6.6 6.8
---恢复内容开始--- 写的效果依旧不好 还没写完前四题比赛就结束了 而且这些普及组的题目 我大多还是缺少简单算法的灵性 总是把问题搞复杂化. 6.5 A 第一道题非常水 简单分析发现是一个快速幂的 ...
- 3.29省选模拟赛 除法与取模 dp+组合计数
LINK:除法与取模 鬼题.不过50分很好写.考虑不带除法的时候 其实是一个dp的组合计数. 考虑带除法的时候需要状压一下除法操作. 因为除法操作是不受x的大小影响的 所以要状压这个除法操作. 直接采 ...
- Asp.Net项目发布 到 IIS、 Core3.1 发布到 IIS CentOS8.x
摘要:发布项目到IIS或者.Net Core 项目发布到IIS服务器或者CentOS记录一下,后面忘了又来看看. 1.服务器安装IIS 1.1.不管你是本地的电脑还是网上购买的服务器,只要是能通过远程 ...
- Newbe.Claptrap 框架如何实现多级生命周期控制?
Newbe.Claptrap 框架如何实现多级生命周期控制?最近整理了一下项目的术语表.今天就谈谈什么是 Claptrap Lifetime Scope. 特别感谢 kotone 为本文提供的校对建议 ...
- 系统UISearchController详解
原文链接:https://www.jianshu.com/p/aa9a153a5b58