本文选着stolon
环境准备
192.168.253. 110 master
192.168.253. 111 node1
192.168.253. 112 node2
192.168.253. 50 nfs
下载项目
[root@master ~]# git clone https://github.com/sorintlab/stolon.git
进入/examples/kubernetes
[root@master kubernetes]# /root/k8s/pgsql/master-salve/stolon/examples/kubernetes
创建pv数据盘(nfs)
git上默认是利用了本地存储,这里我们使用nfs去保存数据
在nfs服务器上安装nfs
[root@nfs ~]# yum install nfs-utils
创建exports文件
vim /etc/exports
/home/nfs 192.168.1.0/24(rw,sync,no_root_squash)
启动服务
systemctl enable rpcbind.service
systemctl enable nfs-server.service
systemctl start rpcbind.service
systemctl start nfs-server.service
showmount -e 192.168,253,50 //nfs地址
创建pv1,pv2,pv3 目录
创建pv1, pv2,pv3 的yaml
vim pv1.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pg-pv1
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
path: /home/nfs/pv1 //挂载路劲
server: 192.168,253.50 //nfs服务器地址
[root@master kubernetes]# kubectl apply -f pv1.yaml
重复以上 依次创建 2,3作为冗余备份数据
原则上一个pv就对应一个pvc,有兴趣可以查询
修改密码文件
vim secret.yaml
---
apiVersion: v1
kind: Secret
metadata:
name: stolon
type: Opaque
data:
password: eGlhbm52
由于secret里面只能保存Base64的字符,请自行转换,在linux/mac上用 echo -n ‘你的密码’ | base64 来转换base64的密码。 或者自己着base64转换网站自行转换。 比如
[root@master kubernetes]# echo -n 'xiannv' |base64
eGlhbm52
修改stolon-keeper deployment文件
...
- name: STKEEPER_PG_SU_USERNAME
value: "postgres"
...
volumeClaimTemplates:
- metadata:
name: data
# annotations:
# volume.alpha.kubernetes.io/storage-class: standard
spec:
accessModes: ["ReadWriteMany"]
resources:
requests:
storage: 512Mi
storageClassName: nfs
修改stolon-proxy-service.yaml
NodePort的方式开放服务
apiVersion: v1
kind: Service
metadata:
name: stolon-proxy-service
spec:
ports:
- port: 5432
targetPort: 5432
nodePort: 30000
type: NodePort
selector:
component: stolon-proxy
stolon-cluster: kube-stolon
执行项目下下所有的yaml文件
kubectl apply -f role-binding.yaml
kubectl apply -f role.yaml
kubectl apply -f secret.yaml
kubectl apply -f stolon-keeper.yaml
kubectl apply -f stolon-proxy-service.yaml
kubectl apply -f stolon-proxy.yaml
kubectl apply -f stolon-sentinel.yaml
初始化数据库
kubectl run -i -t stolonctl --image=sorintlab/stolon:master-pg10 --restart=Never --rm -- /usr/local/bin/stolonctl --cluster-name=kube-stolon --store-backend=kubernetes --kube-resource-kind=configmap init
测试数据库是否启动正常,使用Navicat连接测试
灾备模拟
#创建测试数据库
create database liu;
#创建表
create table persons(name varchar(10));
#插入数据
insert into persons values('chao');
查看数据库节点
[root@ kubernetes]# kubectl get pods -o wide
模拟删除 pods,服务,代理
[root@master kubernetes]# kubectl delete -f stolon-keeper.yaml
[root@master kubernetes]# kubectl delete -f stolon-proxy.yaml
[root@master kubernetes]# kubectl delete -f stolon-sentinel.yaml
[root@master kubernetes]# kubectl delete -f stolon-proxy-service.yaml
查看数据库无法连接
重新建立pod,service
[root@master kubernetes]# kubectl create -f stolon-keeper.yaml
[root@master kubernetes]# kubectl create -f stolon-proxy.yaml
[root@master kubernetes]# kubectl create -f stolon-sentinel.yaml
[root@master kubernetes]# kubectl create -f stolon-proxy-service.yaml
查看服务正常
[root@master ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
stolon-keeper-0 1/1 Running 1 2d21h
stolon-keeper-1 1/1 Running 1 2d21h
stolon-proxy-96b67f797-5rl9h 1/1 Running 1 2d22h
stolon-proxy-96b67f797-6l9vp 1/1 Running 1 2d22h
stolon-sentinel-64bd98489b-82pb8 1/1 Running 1 2d22h
stolon-sentinel-64bd98489b-d4z8l 1/1 Running 2 2d22h
客户端连接数据库, 查看数据库表,数据,都在
模拟删除 pod/stolon-keeper-0
[root@master kubernetes]# kubectl delete pod stolon-keeper-0
pod "stolon-keeper-0" deleted
发现单机的速度太快,删除完之后系统自动重新创建 stolon-keeper-0,系统还没来得及主备切换
调整策略
将两个副本调度在不同节点上,可以添加硬策略
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: component
operator: In
values:
- stolon-keeper
topologyKey: app