经过Rancher Kubernetes Engine运行高可用 PostgreSQLnode
这篇是咱们关于在Kubernetes上运行PostgreSQL系列文章的其中一篇。下面是相关文章和连接。ios
Rancher Kubernetes Engine (RKE)是一个轻量级的Kubernetes 安装程序,支持在裸金属和虚拟机上安装Kubernetes。RKE解决了Kubernetes安装的复杂性问题。经过RKE安装是比较简单的,而跟下层的操做系统无关。git
Portworx是一个云原生的存储和数据管理平台,来支撑Kubernetes上持久性的工做负载。经过Portworx,用户可以管理不一样基础架构上的、不一样容器调度器上的数据库。它为全部的有状态服务(Stateful Service)提供了一个单一的数据管理层。github
本文列出了操做步骤:经过RancherKubernetes Engine (RKE),在AWS的Kubernetes集群上,部署和管理高可用PostgreSQL集群。sql
总结来讲,在Amazon上运行高可用PostgreSQL,须要:shell
如何经过RKE来建立一个Kubernetes集群数据库
RKE是一个安装和配置Kubernetes的工具。能够支持的环境包括裸金属,虚拟机或者IaaS。在本文中,咱们会在AWS EC2上建立一个3节点的Kubernetes集群。json
更为详细的步骤,能够参考这篇tutorial from The New Stack. (https://thenewstack.io/run-stateful-containerized-workloads-with-rancher-kubernetes-engine-and-portworx/)bash
作完这些操做,咱们会建立一个1 master 和 3 worker 节点的集群。架构
在Kubernetes上安装Portworx
在RKE的Kubernetes 上安装Portworx,跟在Kubernetes集群上经过Kops安装没什么不一样。Portworx有详细的文档,列出每步的操做 (https://docs.portworx.com/portworx-install-with-kubernetes/cloud/aws/),来完成在AWS环境的Kubernetes上运行Portworx集群。
The New Stacktutorial(https://thenewstack.io/run-stateful-containerized-workloads-with-rancher-kubernetes-engine-and-portworx/) 也包含了在Kubernetes部署Portworx DaemonSet的全部操做步骤。
Kubernetes集群运行起来,Portworx安装和配置完成,咱们就开始部署一个高可用的PostgreSQL数据库。
建立一个Postgres 存储类
经过存储类对象,一个Admin能够定义集群中不一样的Portworx卷的类。这些类在动态的卷的部署过程当中会被用到。存储类自己定义了复制因子,IO状况(例如数据库或者CMS),以及优先级(好比SSD或者HDD)。这些参数影响着工做负载的可用性和输出,所以参数能够被根据每一个卷分别设置。这很重要,由于对生产系统的数据库的要求,跟研发测试系统是彻底不同的。
在下面的例子里,咱们部署的存储类,它的复制因子是3,IO状况设定成“db”,优先级设定成“high”。这意味着存储会被优化为适合低传输速率的数据库负载(Postgres),而且自动的部署在集群具有最高性能的存储里。
$ kubectl create -f https://raw.githubusercontent.com/fmrtl73/katacoda-scenarios-1/master/px-k8s-postgres-all-in-one/assets/px-repl3-sc.yaml storageclass "px-repl3-sc" created
建立一个Postgres PVC
咱们如今能够基于存储类建立一个PersistentVolume Claim (PVC)。动态部署的优点就在于,claims可以在不须要显性部署持久卷Persistent Volume (PV)的状况下被建立。
$ kubectl create -f https://raw.githubusercontent.com/fmrtl73/katacoda-scenarios-1/master/px-k8s-postgres-all-in-one/assets/px-postgres-pvc.yaml persistentvolumeclaim "px-postgres-pvc" created
PostgreSQL的密码会被建立成Secret。运行下面的命令来用正确的格式建立Secret。
$ echo postgres123 > password.txt $ tr -d '\n' .strippedpassword.txt && mv .strippedpassword.txt password.txt $ kubectl create secret generic postgres-pass --from-file=password.txt secret "postgres-pass" created
在Kubernetes上部署PostgreSQL
最后,让咱们建立一个PostgreSQL实例,做为一个Kubernetes部署对象。为了简单起见,咱们只部署一个单独的Postgres Pod。由于Portworx提供同步复制来达到高可用。所以一个单独的Postgres实例,是Postgres数据库的最佳部署方式。Portworx也支持多节点的Postgres部署方式,看你的须要。
$ kubectl create -f https://raw.githubusercontent.com/fmrtl73/katacoda-scenarios-1/master/px-k8s-postgres-all-in-one/assets/postgres-app.yaml deployment "postgres" created
确保Postgres的Pods是在运行的状态。
$ kubectl get pods -l app=postgres -o wide --watch
等候直到Postgres pod变成运行状态。
咱们能够经过使用与PostgresPod一块儿运行的pxctl工具,来检查Portworx卷。
$ VOL=`kubectl get pvc | grep px-postgres-pvc | awk '{print $3}'` $ PX_POD=$(kubectl get pods -l name=portworx -n kube-system -o jsonpath='{.items[0].metadata.name}') $ kubectl exec -it $PX_POD -n kube-system -- /opt/pwx/bin/pxctl volume inspect ${VOL}
命令的输出信息,确认了支撑PostgreSQL数据库实例的卷已经被建立完成了。
PostgreSQL的错误恢复
让咱们为数据库填充5百万行的样例数据。
咱们首先找到运行PostgreSQL的Pod,来访问shell。
$ POD=`kubectl get pods -l app=postgres | grep Running | grep 1/1 | awk '{print $1}'` $ kubectl exec -it $POD bash
如今咱们进入了Pod,咱们可以链接到Postgres而且建立数据库。
# psql pgbench=# create database pxdemo; pgbench=# \l pgbench=# \q
默认状态下,Pgbench会建立4张表:(pgbench_branches,pgbench_tellers,pgbench_accounts,pgbench_history),在主pgbench_accounts表里会有10万行。这样咱们建立了一个简单的16MB大小的数据库。
使用-s选项, 咱们能够增长在每张表中的行的数量。在上面的命令中,咱们在“scaling”上填写了50,这样pgbench就会建立一个50倍默认大小的数据库。
咱们的pgbench_accounts如今有5百万行了。这样咱们的数据库变成了800MB (50*16MB)
# pgbench -i -s 50 pxdemo;
等待直到pgbench完成表的建立。咱们接着来确认一下
pgbench_accounts如今有500万行的填充。
# psql pxdemo \dt select count(*) from pgbench_accounts; \q exit
如今,咱们来模拟PostgreSQL正在运行的节点的失效,
$ NODE=`kubectl get pods -l app=postgres -o wide | grep -v NAME | awk '{print $7}'` $ kubectl cordon ${NODE} node "ip-172-20-57-55.ap-southeast-1.compute.internal" cordoned
执行kubectl get nods, 确认了其中一个节点的排程已经失效了。
$ kubectl get nodes
咱们继续删除这个PostgreSQLpod。
$ POD=`kubectl get pods -l app=postgres -o wide | grep -v NAME | awk '{print $1}'` $ kubectl delete pod ${POD} pod "postgres-556994cbd4-b6ghn" deleted
一旦删除完成。Portworx STorageORchestrator for Kubernetes (STORK)(https://portworx.com/stork-storage-orchestration-kubernetes/),会把pod重置来建立有数据复制集的节点。
一旦Pod被删除,它会被重置到有数据复制集的节点上。Portworx STorageORchestrator for Kubernetes (STORK) (https://portworx.com/stork-storage-orchestration-kubernetes/)- Portworx的客户存储排程器,容许在数据所在节点上放置多个pod,而且确保正确的节点可以被选择来用来排程Pod。
让咱们运行下面的命令验证一下。咱们会发现一个新的pod被建立了,而且被排程在了一个不一样的节点上。
$ kubectl get pods -l app=postgres
让咱们把以前的节点从新部署回来。
$ kubectl uncordon ${NODE} node "ip-172-20-57-55.ap-southeast-1.compute.internal" uncordoned
最后,咱们验证一下数据仍然是可用的。
咱们来看下容器里的pod名称和exec。
$ POD=`kubectl get pods -l app=postgres | grep Running | grep 1/1 | awk '{print $1}'` $ kubectl exec -it $POD bash
如今用psql来确保咱们的数据还在。
# psql pxdemo pxdemo=# \dt pxdemo=# select count(*) from pgbench_accounts; pxdemo=# \q pxdemo=# exit
咱们看到数据库表都还在,而且全部的内容都是正确的。
在Postgres进行存储管理
测试了端到端的数据库错误恢复后,咱们在Kubernetes集群上来运行StorageOps。
彻底无停机下,扩充卷
咱们如今来演示一下,在空间将满的状况下,如何简单的、动态的为卷添加空间。
在容器内打开一个shell,
$ POD=`kubectl get pods -l app=postgres | grep Running | awk '{print $1}'` $ kubectl exec -it $POD bash
让咱们来用pgbench来运行一个baseline transaction benchmark,它将尝试增长卷容量到1Gib,而且没能成功。
$ pgbench -c 10 -j 2 -t 10000 pxdemo $ exit
在运行上面命令的时候,可能会有多种错误产生。第一个错误提示Pod已经没有空间了。
PANIC: could not write to file "pg_xlog/xlogtemp.73": No space left on device
Kubernetes并不支持在PVC建立后进行修改。咱们在Portworx上用pxctl CLI工具来进行操做。
咱们来获取卷的名称,用pxctl工具来查看。
SSH到节点里,运行下面的命令
POD=`/opt/pwx/bin/pxctl volume list --label pvc=px-postgres-pvc | grep -v ID | awk '{print $1}'` $ /opt/pwx/bin/pxctl v i $POD
注意到卷还有10%就要满了。让咱们用下面的命令来扩充。
$ /opt/pwx/bin/pxctl volume update $POD --size=2 Update Volume: Volume update successful for volume 834897770479704521
为卷作快照,而且恢复数据库
Portworx支持为Kubernetes PVCs建立快照。让咱们为以前建立的Postgres PVC来建立一个快照。
$ kubectl create -f https://github.com/fmrtl73/katacoda-scenarios-1/raw/master/px-k8s-postgres-all-in-one/assets/px-snap.yaml volumesnapshot "px-postgres-snapshot" created
能够经过下面的命令来看全部的快照。
$ kubectl get volumesnapshot,volumesnapshotdata
有了快照,咱们来删掉数据库。
$ POD=`kubectl get pods -l app=postgres | grep Running | grep 1/1 | awk '{print $1}'` $ kubectl exec -it $POD bash $ psql drop database pxdemo; \l \q exit
快照就跟卷是同样的,咱们可使用它来建立一个新的PostgreSQL实例。让咱们恢复快照数据,来建立一个新的PostgreSQL实例。
$ kubectl create -f https://raw.githubusercontent.com/fmrtl73/katacoda-scenarios-1/master/px-k8s-postgres-all-in-one/assets/px-snap-pvc.yaml persistentvolumeclaim "px-postgres-snap-clone" created
重新的PVC,咱们建立一个PostgreSQL Pod,
$ kubectl create -f https://raw.githubusercontent.com/fmrtl73/katacoda-scenarios-1/master/px-k8s-postgres-all-in-one/assets/postgres-app-restore.yaml deployment "postgres-snap" created
确认这个pod是在运行状态。
$ kubectl get pods -l app=postgres-snap
最后,让咱们访问由benchmark工具建立的数据。
$ POD=`kubectl get pods -l app=postgres-snap | grep Running | grep 1/1 | awk '{print $1}'` $ kubectl exec -it $POD bash
$ psql pxdemo \dt select count(*) from pgbench_accounts; \q exit
咱们发现表和数据都是正常的。若是咱们想要在另外一个Amazon区域建立一个容灾备份,咱们能够把快照推送到Amazon S3。Portworx快照支持全部的S3兼容存储对象,因此备份也能够是其余的云或者是本地部署的数据中心。
_
小结Portworx能够经过RKE很容易的部署,用来运行Kubernetes上生产系统中有状态的工做负载。经过跟STORK的整合,DevOps和StorageOps团队可以无缝的在Kubernetes上运行数据库集群。他们也能够为云原生应用运行传统的操做,好比扩充卷,快照,备份,容灾恢复。