Kubernetes利用Patroni部署高可用PostgreSQL(3)-- 部署Haproxy

Kubernetes利用Patroni部署高可用PostgreSQL(3)-- 部署Haproxy

这里先说明一下,其实我们是可以利用Kubernetes的Service完成服务发现和负载均衡的,但是为什么要使用Haproxy呢?有以下几个原因:

  1. Haproxy可以提供更多负载均衡方法
  2. Haproxy有良好的监控界面和metrics
  3. Service方法在处理Kubernetes的node掉电时响应速度非常慢,默认是40s

我之前也实现了一版Service的方法,其实很简单,熟悉Kubernetes的结合官方文档,很快就可以配置出来。所以这里就只放出Haproxy的方法,你还可以使用PgbouncerPgpool这些L7的代理。

Dockerfile

同样需要Dockerfile和haproxy.cfg,当然相对于patroni来说很简单,而且体积还小。Dockerfile:

FROM haproxy:1.9-alpine
COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg

haproxy.cfg里面主要是开启了一个监控端口1000,write端口5432和read端口5433:

global
    maxconn 100

defaults
    log global
    mode tcp
    retries 2
    timeout client 30m
    timeout connect 4s
    timeout server 30m
    timeout check 5s

listen stats
    mode http
    bind *:1000
    stats enable
    stats uri /
    stats realm Haproxy\ Statistics
    stats auth admin:admin123
    stats admin if TRUE 

listen write
    bind *:5432
    option httpchk GET /master
    http-check expect status 200
    default-server inter 3s fall 2 rise 2 on-marked-down shutdown-sessions
    server write_server patronidemo-0.patronidemo:5432 maxconn 100 check port 8008
    server write_server patronidemo-1.patronidemo:5432 maxconn 100 check port 8008

listen read
    bind *:5433
    option httpchk GET /replica
    http-check expect status 200
    default-server inter 3s fall 2 rise 2 on-marked-down shutdown-sessions
    server read_server patronidemo-0.patronidemo:5432 maxconn 100 check port 8008
    server read_server patronidemo-1.patronidemo:5432 maxconn 100 check port 8008

build docker image:

docker build -t haproxy .

Deploy Haproxy

嗯,这里我只Deploy一个pod,毕竟本机资源有限啊,另外因为haproxy是部署成无状态的pod,所以一个pod,挂掉重启就行了, deploy.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: haproxy
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: haproxy
  template:
    metadata:
      labels:
        app: haproxy
    spec:
      containers:
      - name: container-haproxy
        image: haproxy
        ports:
        - name: write
          containerPort: 5432
        - name: read
          containerPort: 5433
        - name: admin
          containerPort: 1000
---
apiVersion: v1
kind: Service
metadata:
  name: haproxy-svc
  labels:
    app: haproxy
spec:
  ports:
  - port: 5432
    targetPort: 5432
    name: write-port
  - port: 5433
    targetPort: 5433
    name: read-port
  clusterIP: None
  selector:
    app: haproxy

---
apiVersion: v1
kind: Service
metadata:
  name: haproxy-admin-svc
  labels:
    app: haproxy
spec:
  type: NodePort
  ports:
  - port: 1000
    targetPort: 1000
    nodePort: 31000
    name: admin-port
  selector:
    app: haproxy

这里我们通过5432,5433分别暴露的写和读的端口,因为Patroni提供了restfulAPI用来分别检测master和replica,所以直接拿来做心跳检测即可。31000暴露了管理的端口,所以我们直接访问host:31000就可以看到haproxy的管理界面:


haproxy.png

这里可以看到haproxy提供了比较全面的端口信息啦,用于监控也是挺好的。

总结

通过这三篇blog我们就可以在Kubernetes上搭建一个高可用PostgreSQL集群。当然有一些坑和限制,我就不列出来了,大家亲自踩踩比较好。另外网上也有helm直接部署的,只是里面屏蔽了蛮多细节,如果只是使用也可以直接用helm。

总的来说没有什么代码,都是一些配置信息。看上去都是网上抄抄改改,说实话也挺花时间的,尤其是最开始对所用的工具和软件都不了解,毕竟自己也不是DevOps,而且还要跟各种global team的人review,还得写英文文档和走流程。
但是在各种debug的过程中对于K8S也越来越了解,所以实践出真知。并且其实写文档和走流程过程中也是对自己的行为进行约束也可以理清思路。

写这几篇blog的目的,一方面是为了记录自己的经验,以后可能还会再碰到;另一方面就是如果有相似需求的人看到这几篇blog,遇到问题以后好交流。所有的code都放在github了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容