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

前期准备

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

部署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 podskubectl get svc以查看Rancher部署的pod和服务。

结 论

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

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

如何简洁优雅地部署PostgreSQL和Pgweb?的更多相关文章

  1. docker部署postgresql时,data目录不生效的问题探究

    今天用docker部署postgresql,用的是官方的镜像.结果挂载完 /var/lib/postgresql/data目录后,和容器里的目录其实并没有挂载成功. 母机上的目录并没有成功挂载到容器里 ...

  2. 使用 pm2 优雅的部署 node 程序

    使用 pm2 优雅的部署 node 程序 # 启动并监控名字为 XXX 的 npm run start:dev 命令 pm2 start npm --watch --name XXX -- run s ...

  3. Async:简洁优雅的异步之道

    前言 在异步处理方案中,目前最为简洁优雅的便是 async函数(以下简称A函数).经过必要的分块包装后,A函数能使多个相关的异步操作如同同步操作一样聚合起来,使其相互间的关系更为清晰.过程更为简洁.调 ...

  4. 推荐一个简洁优雅的博客系统,farbox

    这是我用farbox搞的一个博客:http://www.jsnull.com/ 特点: 1.无数据库,数据存在dropbox里,需要自己注册一个dropbox帐号 2.静态文本文件即是文章,可以在任何 ...

  5. Revealjs网页版PPT让你复制粘贴另类装逼,简洁优雅又低调,不懂编程也看过来

    Revealjs网页版PPT让你复制粘贴另类装逼,简洁优雅又低调,不懂编程也看过来 要了解一个新知识我们可以从三个方面入手:是什么,有什么用,怎么用.下面我们就从这三个方面进行讲解Reveal.js噢 ...

  6. Java8之——简洁优雅的Lambda表达式

    Java8发布之后,Lambda表达式,Stream等等之类的字眼边慢慢出现在我们字眼.就像是Java7出现了之后,大家看到了“钻石语法”,看到了try-with-resource等等.面对这些新东西 ...

  7. 牛逼哄哄的 Lambda 表达式,简洁优雅就是生产力!

    阅读本文大概需要 4 分钟. 作者:Sevenvidia https://www.zhihu.com/question/20125256/answer/324121308 什么是Lambda? 我们知 ...

  8. 开发基础之牛逼哄哄的 Lambda 表达式,简洁优雅就是生产力

    什么是Lambda? 我们知道,对于一个Java变量,我们可以赋给其一个“值”. 如果你想把“一块代码”赋给一个Java变量,应该怎么做呢? 比如,我想把右边那块代码,赋给一个叫做aBlockOfCo ...

  9. centos7部署postgresql集群高可用 patroni + etcd 之patroni篇

    实验环境:centos7.4纯净版 postgres版本: 9.6.15 etcd版本:3.3.11 patroni版本:1.6.0 patroni介绍可参考:https://github.com/z ...

随机推荐

  1. pandas属性和方法

    Series对象的常用属性和方法 loc[ ]和iloc[ ]格式示例表 Pandas提供的数据整理方法 Pandas分组对象的属性和方法 date_range函数的常用freq参数表

  2. Python Tuple(元组) tuple()方法

    描述 Python 元组 tuple() 函数将列表转换为元组.每组词 www.cgewang.com 语法 tuple()方法语法: tuple( iterable ) 参数 iterable -- ...

  3. Skill 解决 Design Library 被识别成 Technology Library 的问题

    https://www.cnblogs.com/yeungchie/ code procedure(ycTechLibToDesign(libName attachLibName) prog((lib ...

  4. 实践录丨如何在鲲鹏服务器OpenEuler操作系统中快速部署OpenGauss数据库

    本文适合需要快速了解OpenGauss基本使用和操作的单机用户,可以短时间内完成安装体验.对于企业级生产使用或者需要部署多台服务器的,不适合本文. 因为业务需要,要在鲲鹏架构里安装单机版的OpenGa ...

  5. Elasticsearch入门指南

    好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 这篇文章主要是记录一下最近在学的 ...

  6. 2017面向对象程序设计(Java)第十三周助教工作总结

    时间飞逝,本学期即将接近尾声.不知不觉同学们已经学习java十三个星期了,想必同学们对Java课程体系及内容有了更加深入的理解,也应该摸索出了一套适用于自己的学习方法. 下面我对上周工作做以简单总结: ...

  7. (转)交叉编译lrzsz

    交叉编译lrzsz 2016-03-20 1. 系统环境: Distributor ID:    Ubuntu Description:    Ubuntu 14.04.1 LTS Release:  ...

  8. 补充的javascript 数据类型笔记

        <p> 变量名命名规范</p>     由字母,数字,下划线,$组成     严格区分大小写 var app和var App 是两个变量     变量名不能以数字开头 ...

  9. VUE——添加组件模块(图表)

    Vue是由一个个小模块组成的,模块可以让页面简介还可以复用: 1.不固定数据数量传到子组件 父组件: <chartVue v-for="(item, index) in chartLi ...

  10. MyKTV系统项目的感想

    不粉身碎骨,何以脱胎换骨! 3月11号,我们迎来S1的尾巴.这期间有温暖,默契,有项目.一切刚刚好.刚刚正式接到KTV这个微微型的项目的时候,还是很害怕的,虽然老师在前两天就已经提到也讲到,KTV系统 ...