0.前言
之前在k8s集群中部署过单节点的mysql,但是是基于deployment部署的,正常情况下这种有状态的服务应该用statefulSet类型的资源部署,并且没有将数据存储到存储系统中,这次我们重新基于statefulSet部署一个pgsql服务,并且将数据存储到nfs存储系统中。
1.准备阶段
在开始部署之前,我们需要准备以下资源:
(1) k8s集群
(2) nfs服务
以上两样准备完成之后,我们就可以开始着手部署了。
2.编写声明文件
(1)configmap
我们用configmap存储部署pgsql必须要的配置项,信息如下:
cd /root/pgsql
cat pg-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: postgres-config-map
data:
POSTGRESQL_ADMIN_PASSWORD: 'xxxxxx' // 用户根据需要自定义admin密码
(2)pv
我们创建一个pv资源,用于存储pgsql的数据,信息如下:
cd /root/pgsql
cat pg-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv-data-postgres
spec:
capacity:
storage: 1Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs-client
nfs:
server: 10.173.198.17
path: /var/nfs/general/postgres
其中需要注意的是nfs的信息,server是nfs服务器IP,path是nfs存储数据的目录,该目录需要提前创建出来,并且最好附上777权限。
(3)statefulSet
基于statefulSet创建一个pgsql服务,信息如下:
cd /root/pgsql
cat pg-ss.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgres
spec:
replicas: 1
serviceName: postgres-service
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/quay.io/sclorg/postgresql-15-c9s:latest
imagePullPolicy: IfNotPresent
ports:
- name: postgres
containerPort: 5432
protocol: TCP
envFrom:
- configMapRef:
name: postgres-config-map
resources:
requests:
cpu: 1
memory: 512Mi
limits:
cpu: 1
memory: 512Mi
volumeMounts:
- name: postgres-data
mountPath: /var/lib/pgsql/data/ // 容器中存储数据的目录
imagePullSecrets:
- name: k8s-auth
volumeClaimTemplates:
- metadata:
name: postgres-data
spec:
accessModes: ["ReadWriteOnce"]
volumeMode: Filesystem
resources:
requests:
storage: 1Gi
storageClassName: nfs-client
(4)service外部访问
最后我们创建一个可以让外部访问的service资源,信息如下:
cd /root/pgsql
cat pg-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: postgres-external-service
spec:
selector:
app: postgres
ports:
- name: postgres
protocol: TCP
port: 5432
targetPort: 5432
nodePort: 30432
type: NodePort
可以看到pgsql内部端口是5432,对外端口是30432
(5)执行声明文件
我们依次执行声明文件,命令如下:
cd /root/pgsql
kubectl apply -f pg-cm.yaml
kubectl apply -f pg-pv.yaml
kubectl apply -f pg-ss.yaml
kubectl apply -f pg-svc.yaml
(6)查看资源情况
kubectl get pod,svc |grep postgres
可以看到pod正常运行,且对外的service也已经创建成功。
3.检查存储数据
我们来到nfs所在的服务器,查看对应目录下面有没有pgsql的存储数据:
ls /var/nfs/general/postgres/
可以看到下面新增了一个userdata目录,我们再看下userdata目录下面存放着什么数据。
ll /var/nfs/general/postgres/userdata/
果然,pgsql的存储数据就在该目录下。
注意:不同版本的pgsql容器的存储目录可能不同,如果发现存储目录下没有数据,可以到容器里面找一下pgsql存储数据的目录在哪里,然后修改statefulSet声明文件中pgsql的数据存储目录。
4.测试pgsql连接
我们找一台装有pgsql client端的服务器,然后连接我们基于statefulSet部署的pgsql,看下是否可以正常访问。
psql -U postgres -h 10.173.198.30 -p 30432
可以正常访问。
5.总结
基于statefulSet部署pgsql也并没有太大的难度,关键是数据存放的位置比较重要,大家注意这一点就好了。