Kubernetes利用Patroni部署高可用PostgreSQL(3)-- 部署Haproxy
这里先说明一下,其实我们是可以利用Kubernetes的Service完成服务发现和负载均衡的,但是为什么要使用Haproxy呢?有以下几个原因:
- Haproxy可以提供更多负载均衡方法
- Haproxy有良好的监控界面和metrics
- Service方法在处理Kubernetes的node掉电时响应速度非常慢,默认是40s。
我之前也实现了一版Service的方法,其实很简单,熟悉Kubernetes的结合官方文档,很快就可以配置出来。所以这里就只放出Haproxy的方法,你还可以使用Pgbouncer和Pgpool这些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提供了比较全面的端口信息啦,用于监控也是挺好的。
总结
通过这三篇blog我们就可以在Kubernetes上搭建一个高可用PostgreSQL集群。当然有一些坑和限制,我就不列出来了,大家亲自踩踩比较好。另外网上也有helm直接部署的,只是里面屏蔽了蛮多细节,如果只是使用也可以直接用helm。
总的来说没有什么代码,都是一些配置信息。看上去都是网上抄抄改改,说实话也挺花时间的,尤其是最开始对所用的工具和软件都不了解,毕竟自己也不是DevOps,而且还要跟各种global team的人review,还得写英文文档和走流程。
但是在各种debug的过程中对于K8S也越来越了解,所以实践出真知。并且其实写文档和走流程过程中也是对自己的行为进行约束也可以理清思路。
写这几篇blog的目的,一方面是为了记录自己的经验,以后可能还会再碰到;另一方面就是如果有相似需求的人看到这几篇blog,遇到问题以后好交流。所有的code都放在github了。