容器开启数据服务之旅系列(一):Kubernetes如何解自建PostgreSQL运维之痛

原创 2018年04月17日 13:38:06
摘要: 通过阿里云Kubernetes容器服务,开启你的数据服务之旅 (一)云上运维自建数据库之痛,使用容器服务自动恢复数据库postgresql实例 概述 本文为大家介绍一种容器化的数据服务 posgresql db on ACK,通过使用云盘自动挂载实现的块存储PVC来做到数据库的免运维恢复。

容器开启数据服务之旅系列(一):Kubernetes如何解自建PostgreSQL运维之痛

概述

本文为大家介绍一种容器化的数据服务 posgresql db on ACK,通过使用云盘自动挂载实现的块存储PVC来做到数据库的免运维恢复。借助阿里云Kubernetes服务与阿里云存储资源的深度整合,打造数据库实例的免运维异地(ECS)恢复的不死神话。

先决条件

1.你已经通过阿里云容器服务创建了一个Kubernetes集群,详细步骤参见创建Kubernetes集群
2.阿里云容器服务的存储插件(默认情况存储插件已经自动部署在阿里云Kubernetes容器服务)

从容器服务控制台创建一个posgresql实例

使用三次点击来创建一个postgresql的不死实例
2.点击 “应用目录”
3.选择 "postgresql"
4 (可选)选择你的Kubernetes集群. e.g. k8s-gpu
5 (可选)选择你的应用的命名空间。默认: default
6 给你的数据库应用取个容易记住的名字。 e.g. postgresql-online

7 (可选) 点击 “参数” 来定制你的数据库实例

1.修改 persistence.size: 20Gi 增加数据库云盘的容量2.修改 persistence.storageClass: alicloud-disk-efficiency 调整数据卷所在云盘的性能。比如改为alicloud-disk-ssd 挂载ssd类型的

## Persist data to a persitent volumepersistence: enabled: true ## A manually managed Persistent Volume and Claim ## Requires persistence.enabled: true ## If defined, PVC must be created manually before volume will be bound # existingClaim: ## database data Persistent Volume Storage Class ## if defined, user has to define storageClassName: alicloud-disk to support dynamic provision of alicloud-disk ## If defined, storageClassName: <storageClass> ## If set to "-", storageClassName: "", which disables dynamic provisioning ## If undefined (the default) or set to null, no storageClassName spec is ## set, choosing the default provisioner. (gp2 on AWS, standard on ## GKE, AWS & OpenStack) ## #storageClass: "alicloud-disk-ssd" storageClass: "alicloud-disk-efficiency" accessMode: ReadWriteOnce size: 20Gi subPath: "postgresql-db"
8 点击 “部署”, 完成数据发布
9 点击 “Kubernetes 控制台”,查看部署实例

10 点击容器组,点击 postgresql-online-postgresql 查看数据库实例密码。容器实例启动在节点:cn-hangzhou.i-bp1fazljd8u2ylk2otdo

11 测试postgresql数据库的异地(ECS)恢复

1.添加测试数据

ssh <public ip of kubernetes master node >`# kubectl run my-pg-postgresql-client --rm --tty -i --image postgres \--env "PGPASSWORD=$PGPASSWORD" \--command -- psql -U postgres \-h postgresql-online-postgresql postgresIf you don't see a command prompt, try pressing enter.postgres=# create table t1 (id int);CREATE TABLEpostgres=# insert into t1 values(10);INSERT 0 1postgres=# select * from t1; id---- 10(1 row)

1.驱逐数据库实例从ECS节点 i-bp1fazljd8u2ylk2otdo 到 i-bp1fazljd8u2ylk2otdp

#kubectl get pod -o wide | grep postgresql-online-postgresqlpostgresql-online-postgresql-78884fbcf6-6mfzz 1/1 Running 0 36m 172.30.4.4 cn-hangzhou.i-bp1fazljd8u2ylk2otdo#kubectl cordon cn-hangzhou.i-bp1fazljd8u2ylk2otdo #kubectl delete pod postgresql-online-postgresql-78884fbcf6-6mfzzpod "postgresql-online-postgresql-78884fbcf6-6mfzz" deleted# kubectl get pod -o wide|grep postgresql-online-postgresql#postgresql-online-postgresql-78884fbcf6-87ttg 0/1 Running 0 15s 172.30.3.5 cn-hangzhou.i-bp1fazljd8u2ylk2otdp

1.检验数据,实例迁移, 数据库实例自动化恢复, 数据不丢失。

# kubectl get pod -o wide|grep postgresql-online-postgresql#postgresql-online-postgresql-78884fbcf6-87ttg 0/1 Running 0 15s 172.30.3.5 cn-hangzhou.i-bp1fazljd8u2ylk2otdpkubectl run my-pg-postgresql-client --rm --tty -i --image postgres \> --env "PGPASSWORD=$PGPASSWORD" \> --command -- psql -U postgres \> -h postgresql-online-postgresql postgresIf you don't see a command prompt, try pressing enter.postgres=# select * from t1; id---- 10(1 row)

CLI控: 使用命令行完成postgresql实例的创建,迁移验证

login k8s master and deploy an postgresql db in seconds.

ssh <public ip of kubernetes master node >helm install -n postgresql-online --set 'persistence.size=30Gi,persistence.storageClass=alicloud-disk-ssd' stable/postgresql

To get your user password run:

PGPASSWORD=$(kubectl get secret --namespace default my-pg-postgresql -o jsonpath="{.data.postgres-password}" | base64 --decode; echo)
To connect to your database run the following command (using the env variable from above):
kubectl run my-pg-postgresql-client --rm --tty -i --image postgres \ --env "PGPASSWORD=$PGPASSWORD" \ --command -- psql -U postgres \ -h postgresql-online-postgresql postgres

To connect to your database directly from outside the K8s cluster:

PGHOST=127.0.0.1 PGPORT=5432 # Execute the following commands to route the connection: export POD_NAME=$(kubectl get pods --namespace default -l "app=my-pg-postgresql" -o jsonpath="{.items[0].metadata.name}") kubectl port-forward $POD_NAME 5432:5432#kubectl get pod -o wide | grep postgresql-online-postgresqlpostgresql-online-postgresql-78884fbcf6-6mfzz 1/1 Running 0 36m 172.30.4.4 cn-hangzhou.i-bp1fazljd8u2ylk2otdo#kubectl cordon cn-hangzhou.i-bp1fazljd8u2ylk2otdo #kubectl delete pod postgresql-online-postgresql-78884fbcf6-6mfzzpod "postgresql-online-postgresql-78884fbcf6-6mfzz" deleted# kubectl get pod -o wide|grep postgresql-online-postgresql#postgresql-online-postgresql-78884fbcf6-87ttg 0/1 Running 0 15s 172.30.3.5 cn-hangzhou.i-bp1fazljd8u2ylk2otdp

Test original postgresql db could be recovered on different node.

#kubectl get pod -o wide|grep postgresql-online-postgresql#postgresql-online-postgresql-78884fbcf6-87ttg 0/1 Running 0 15s 172.30.3.5 cn-hangzhou.i-bp1fazljd8u2ylk2otdpkubectl run my-pg-postgresql-client --rm --tty -i --image postgres \> --env "PGPASSWORD=$PGPASSWORD" \> --command -- psql -U postgres \> -h postgresql-online-postgresql postgresIf you don't see a command prompt, try pressing enter.postgres=# select * from t1; id---- 10(1 row)

阅读更多干货好文,请关注扫描以下二维码: 

Kubernetes从部署到运维详解

Kubernetes是Google开源的Docker容器集群编排管理系统,为容器化的应用提供自动部署,弹性伸缩,资源调度,负载均衡和服务发现等应用云平台所需的管理功能体系。Kubernetes 的灵感...
  • qjx1208
  • qjx1208
  • 2016-11-20 22:41:23
  • 407

如何在Kubernetes中部署一个高可用的PostgreSQL集群环境

【编者的话】本文主要介绍了如何在Kubernetes环境中用Stolon去部署高可用的PostgreSQL,本文从Stolon的结构组成开始,由浅入深介绍原理,从开始安装到最后对其进行failover...
  • qq_34463875
  • qq_34463875
  • 2017-03-22 21:08:00
  • 784

基于docker+kubernetes的一站式运维管理实践

2015年下半年,搜狐北京研发中心基于docker和kubernetes开发了一套企业级的一站式运维管理系统——DomeOS。该系统是一个持续交付和自动运维平台,解决用户从代码自动编译打包,到线上运行...
  • horsefoot
  • horsefoot
  • 2016-06-06 10:09:26
  • 19243

就业感言:痛并快乐的4个月,圆梦之旅

在华清的学习结束了,这四个月是痛并快乐着。四个月每天都是紧张的,每天都是充实的,每天感觉自己都有新的收获。...
  • farsight2009
  • farsight2009
  • 2010-08-17 18:47:00
  • 487

kubernetes1.2如何操作Docker

本次分析的kubernetes版本号:v1.2.1-beta.0。 Kubernetes对Docker的管理是通过一个第三方组件实现的,这个第三方组件就是go-dockerclient,这是一个GO...
  • horsefoot
  • horsefoot
  • 2016-04-27 18:09:17
  • 20394

《Kubernetes与云原生应用》系列之五——容器设计模式实践案例:多节点选举模式

多节点选举在分布式系统中是一种重要的模式,特别是对有状态服务来说。在分布式系统中,一般来说,无状态服务,可以随意的水平伸缩,只要把运行业务逻辑的实例复制出去运行就可以,这也就是K8s里Replicat...
  • yjk13703623757
  • yjk13703623757
  • 2016-11-15 21:52:27
  • 586

应用容器化之Kubernetes实践

主要以ZooKeeper、Redis、Kafka、MongoDB等应用容器化在Kubernetes平台上面实践。从计算、网络、存储方面解析应用在集成中的问题,以及部分传统应用在容器化过程中设计的应用二...
  • horsefoot
  • horsefoot
  • 2016-08-15 08:34:09
  • 15234

Kubernetes系统常见运维技巧

本文节选自龚正等编著的《Kubernetes权威指南》,该节主要对常用的Kubernetes系统运维操作和技巧进行详细说明。...
  • horsefoot
  • horsefoot
  • 2016-06-06 13:23:40
  • 7311

kubernetes单个pod运行两个容器yaml文件实践

kubernetes单个pod运行两个容器yaml文件实践-1. rc的yaml文件 apiVersion: v1 kind: Replicationtroller ...
  • zhangxiangui40542
  • zhangxiangui40542
  • 2017-03-18 20:31:14
  • 1415

postgresql日常运维

1.启停 postgres –D $PGDATA start pg_ctl -D $PGDATA start 三种关机模式: pg_ctl –D $PGDATA stop -m smart 不允许...
  • jing_flower
  • jing_flower
  • 2017-11-06 15:53:38
  • 378
收藏助手
不良信息举报
您举报文章:容器开启数据服务之旅系列(一):Kubernetes如何解自建PostgreSQL运维之痛
举报原因:
原因补充:

(最多只允许输入30个字)