LOADING

Follow me

【转载】使用 StatefulSets 开发 PostgreSQL 集群
五月 4, 2017|DockerPaaS

【转载】使用 StatefulSets 开发 PostgreSQL 集群

【转载】使用 StatefulSets 开发 PostgreSQL 集群

使用 StatefulSets 开发 PostgreSQL 集群

导读:

今天的嘉宾是 Jeff McCormick。 Crunchy Data 的开发人员,展示如何使用新 Kubernetes 的 StatefulSet 功能建立 PostgreSQL 集群。

1
编者按

在早前的一篇文章( http://blog.kubernetes.io/2016/09/creating-postgresql-cluster-using-helm.html )中,我描述了如何使用 Helm ( https://github.com/kubernetes/helm,一个Kubernetes包管理工具 )部署 PostgreSQL 集群,下面的例子提供了使用新的 Kubernetes StatefulSet ( https://kubernetes.io/docs/concepts/abstractions/controllers/statefulsets )功能建立 PostgreSQL 集群的步骤。

2
 StatefulSets 示例

A

创建 Kubernetes 环境

StatefulSets 是在 Kubernetes 1.5 ( http://blog.kubernetes.io/2016/12/kubernetes-1.5-supporting-production-workloads.html ,以前的版本,它被称为 PetSets )中实现的一个新的功能。因此,运行此示例将需要一个基于 Kubernetes 1.5.0 或更高版本的环境。

本博客中的示例使用 Kubeadm ( https://kubernetes.io/docs/admin/kubeadm/ )在 Centos7 上部署。 有关 Kubeadm 提供的一些说明以及如何部署 Kubernetes 集群位于此处( http://linoxide.com/containers/setup-kubernetes-kubeadm-centos )。



B

安装 NFS

这个博客中的示例使用 NFS 作为持久卷,但其他共享文件系统也可以工作(例如:ceph,gluster)。示例脚本是假定你的 NFS 服务正在本地运行,并且你的主机名解析为已知的 IP 地址。

总而言之,使 NFS 在 Centos 7 主机上工作的步骤如下:

sudo setsebool -P virt_use_nfs 1 sudo yum -y install nfs-utils libnfsidmap sudo systemctl enable rpcbind nfs-server sudo systemctl start rpcbind nfs-server rpc-statd nfs-idmapd sudo mkdir /nfsfileshare sudo chmod 777 /nfsfileshare/ sudo vi /etc/exports sudo exportfs -r

/etc/exports 文件应包含类似下面的命令,除非指定了适用的 IP 地址:

/nfsfileshare 192.168.122.9(rw,sync)

在这些步骤后,NFS 便可以在测试环境中运行。



C

克隆 Crunchy PostgreSQL 容器套件

本博客中使用的的示例在 Crunchy 容器 GitHub 库( https://github.com/CrunchyData/crunchy-containers )中。克隆它到你测试 Kubernertes 的主机上。

cd $HOMEgit clone https://github.com/CrunchyData/crunchy-containers.git
cd crunchy-containers/examples/kube/statefulset

接下来,拉取 Crunchy PostgreSQL 容器镜像:

docker pull crunchydata/crunchy-postgres:centos7-9.5-1.2.6

D

运行示例

首先,在示例中需要设置一些使用的环境变量:

export BUILDBASE=$HOME/crunchy-containers
export CCP_IMAGE_TAG=centos7-9.5-1.2.6

BUILDBASE 是克隆库的位置,CCP_IMAGE_TAG 是我们要使用的容器镜像版本。

 

接下来,运行示例:

./run.sh

该脚本将创建几个 Kubernetes 对象,包括:

  • 持久卷(pv1,pv2,pv3)

  • 持久卷请求(pgset-pvc)

  • 服务账户(pgset-sa)

  • 服务(pgset,pgset-master,pgset-replica)

  • 状态集(pgset)

  • Pods (pgset-0, pgset-1)


此时,Kubernetes 环境中将运行两个 pod:

$ kubectl get pod NAME      READY     STATUS    RESTARTS   AGE pgset-0   1/1       Running   0          2m pgset-1   1/1       Running   1          2m

在 pod 被创建之后,部署将如下所示:


使用 StatefulSets 开发 PostgreSQL 集群



E

刚刚发生了什么?

此示例将在部署 StatefulSet ,并在其中又创建两个 pod。

这两个 pod 中的容器运行 PostgreSQL 数据库。 对于 PostgreSQL 集群,我们需要一个容器来承担 master 角色,而其他容器承担副本角色。

那么,容器如何确定谁是 master,谁是副本?

这里新的 StateSet 机制发挥了作用,StateSet 机制为集合中的每个 pod 分配一个唯一的序数值。

StatefulSet 提供了从 0 开始唯一的序号值。在容器初始化时,每个容器检查其指定的序号值。序号值为 0 的容器承担 PostgreSQL 集群内的 master 角色。对于其他序列值的容器则承担副本的角色。StatefulSet 机制是一个很简单的发现形式。

PostgreSQL 的副本配置通过专有服务连接到 master 数据库。为了支持副本,示例为每个 master 角色和副本角色创建一个单独的服务。一旦副本连接成功,它将会从 master 变为复制状态。

在容器初始化期间,master 容器将使用服务账号( pgset-sa )去改变它标签的值去匹配 master 服务选择器。

默认情况下,在集合内的所有其他 pods 都被设定为副本服务标签。



F

部署图

下面是示例部署的结果:


使用 StatefulSets 开发 PostgreSQL 集群


在此部署中,有一个 master 服务和一个单独的副本服务。当副本连接到 master 服务时,复制状态便开启。

Crunchy PostgreSQL 容器支持其他形式的集群部署,部署的形式由容器设置的 PG_MODE 环境变量所决定。在 StatefulSet 部署的情况下,该值设置为:PG_MODE = set。



F

测试示例


下面的测试,假设 psql 客户端( psql 是 PostgreSQL 自身提供的一款强大的查询和脚本工具)已经安装在测试系统上。如果没有的话,预先安装 psql 客户端,安装步骤如下:

sudo yum -y install postgresql

此外,下面测试假设,测试环境的 DNS 解析为 Kube DNS,并指定测试的环境 DNS 搜索路径以匹配适用的 Kube 命名空间和域。 master 服务被命名为 pgset-master,副本服务被命名为 pgset-replica。

测试master服务如下( 密码是 password ):

psql -h pgset-master -U postgres postgres -c 'table pg_stat_replication'

如果成功,上面的命令返回的输出表示单个副本连接到主机。

接下来,测试副本:

psql -h pgset-replica -U postgres postgres  -c 'create table foo (id int)'

在 PostgreSQL 集群中副本如果是只读模式,那么上面的命令可能会失败。

接下来,

kubectl scale statefulset pgset --replicas=3

上面的命令成功的创建了一个名为 pgcet-2 的新副本 pod,如下所示:


使用 StatefulSets 开发 PostgreSQL 集群




F

持久性的解释

在 NFS 的安装路径下,查看持久化的 PostgreSQL 数据文件:

$ ls -l /nfsfileshare/ total 12 drwx------ 20   26   26 4096 Jan 17 16:35 pgset-0 drwx------ 20   26   26 4096 Jan 17 16:35 pgset-1 drwx------ 20   26   26 4096 Jan 17 16:48 pgset-2

在 StatefulSet 中的每个容器都会绑定到示例脚本中创建的单个 NFS 持久卷请求( pgcet-pvc )。

由于 NFS 和 PVC 可以共享,因此每个 pod 都可以写入此 NFS 的路径。

该容器旨在使用 pod 主机名为该唯一性创建该路径上的子目录。


3
 总结

StatefulSet 是 Kubernetes 为容器构建者实施集群添加的一个令人兴奋的功能。当部署 PostgreSQL 集群时,序号值分配给集合为建立集群决策提供了非常简单的机制。


原文链接:http://blog.kubernetes.io/2017/02/postgresql-clusters-kubernetes-statefulsets.html

原文作者Jeff McCormick, Developer, Crunchy Data( http://crunchydata.com/ )
本文转载自公众号“容器时代”。

使用 StatefulSets 开发 PostgreSQL 集群

no comments
Share

发表评论