k8s部署单节点的pgsql

K8s数据库

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

picture.image 可以看到pod正常运行,且对外的service也已经创建成功。

3.检查存储数据

我们来到nfs所在的服务器,查看对应目录下面有没有pgsql的存储数据:

ls /var/nfs/general/postgres/

picture.image

可以看到下面新增了一个userdata目录,我们再看下userdata目录下面存放着什么数据。

ll /var/nfs/general/postgres/userdata/

picture.image 果然,pgsql的存储数据就在该目录下。
注意:不同版本的pgsql容器的存储目录可能不同,如果发现存储目录下没有数据,可以到容器里面找一下pgsql存储数据的目录在哪里,然后修改statefulSet声明文件中pgsql的数据存储目录。

4.测试pgsql连接

我们找一台装有pgsql client端的服务器,然后连接我们基于statefulSet部署的pgsql,看下是否可以正常访问。

psql -U postgres -h 10.173.198.30 -p 30432

picture.image 可以正常访问。

5.总结

基于statefulSet部署pgsql也并没有太大的难度,关键是数据存放的位置比较重要,大家注意这一点就好了。

0
0
0
0
关于作者
相关资源
vivo 容器化平台架构与核心能力建设实践
为了实现规模化降本提效的目标,vivo 确定了基于云原生理念构建容器化生态的目标。在容器化生态发展过程中,平台架构不断演进,并针对业务的痛点和诉求,持续完善容器化能力矩阵。本次演讲将会介绍 vivo 容器化平台及主要子系统的架构设计,并分享重点建设的容器化核心能力。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论