k8s部署高可用postgresql

本文选着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
也可以将一个节点设置不可调度,在删除其中一个pod,再将其一个节点关机,观察服务状态
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值