postgresql 安装

最近想搞搞代码质量检查,因为之前搭建过sonarqube,包括和gitlab集成,和maven直接集成等。sonarqube还是非常好用的, 全面的代码规范以及质量检查,再加上人工的代码审核。只要在小组团队内部建设好技术氛围,大家都真正关注到代码质量的重要性,那么对于项目或者产品来说,不论质量、稳定性、后期维护都是非常有帮助的,其实作为技术经理以及项目经理,对我而言,人才才是根本。怎么建设一只优良的精英团队才是我的初衷。

言归正传,之前安装的sonarqube比较老数据库还是依赖mysql,随着sonarqube版本的迭代,sonarqube默认的数据库采用的是postgresql,postgresql也是非常好用的一款数据库,之前也学习使用过,但是项目中使用的还是比较少。近期由于一直在学习使用k8s,所以想着使用k8s来安装postgresql。

本文中其实主要是讲postgresql在k8s中的挂载问题。因为没有足够的机器,不想搭建NFS,而且数据库个人觉得还是采用local-storage更加合适,当然k8s关于持久卷的挂载存储有很多方式,本文并不是主要介绍这点,所以这里不做描述。

进入正题,安装postgresql,使用docker image直接安装。

新增Storage Classes

因为本文中使用的挂载方式是local storage所以这里新增一种存储类,过程也是通过kubectl create -f yaml文件来创建的。

  • yaml 文件内容如下
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
  • 执行安装脚本
kubectl create -f  local-storage.yaml

创建PV

PV标识物理存储资源,为PVC提供物理存储服务。PVC为容器提供volumesumes服务。

  • yaml文件内容
apiVersion: v1
kind: PersistentVolume
metadata:
  name: postgresql-pv
spec:
  capacity:
    storage: 100Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /home/postgresql
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - k8s-node2

注意以上内容中,k8s-node2制定了我们的容器要创建的节点,因为是本地挂载所以没有集群共享的概念只能指定固定的计算节点。local.path目录要在节点中提前创建好,这里和host挂载方式是有区别的。

执行命令类似:kubectl create -f yaml文件位置

创建 PVC

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: postgresql-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 100Gi
  storageClassName: local-storage
  volumeName: postgresql-pv

执行命令这里不说了。

创建 Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgresql       # pod 名称
  labels:
    app: postgres       # 定义容器标签 app=postgres
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
        - name: postgres
          image: postgres:12.3   # 可从docker hub 官网拉取
          imagePullPolicy: IfNotPresent   # 设置镜像拉取策略
          env:
            - name: POSTGRES_PASSWORD  #初始化数据库用户kong的密码
              value: admin
            - name: POSTGRES_USER     #初始化数据库用户kong
              value: admin
            - name: PGDATA
              value: /var/lib/postgresql/pgdata
          volumeMounts:
            - name: postgre-data
              mountPath: /var/lib/postgresql  # 选择要挂载到nfs的容器存储路径
      volumes:
        - name: postgre-data
          persistentVolumeClaim:
            claimName: postgresql-pvc      # 定义指向pvc的名称

**注意:**postgresql默认会有一个挂载目录/var/lib/postgresql/data。是在创建镜像的dockerfile里就已经写好的。
image.png
具体请查看hub docker

所以如果以上环境变量PGDATA如果配置的是/var/lib/postgresql/data。 挂载目录mountPath配置的目录是: /var/lib/postgresql 。其实整个挂载是无效的。

小提示: 如果是默认挂载目录,宿主机的目录在哪里呢。其实是在docker的默认volumes目录下(/var/lib/docker/volumes),当然挂载的路径是随机的哦。一般数据库都有默认的挂载路径(想想为啥呢)
image.png

yaml文件中指定了数据库的默认用户名以及密码admin/admin 。如果不指定的应该是postgres/postgres(我没有试过)。

注意 这里执行命令创建pod其实postgres就已经安装好了,但是不要想着进入容器修改配置文件,或者连接数据库。首先配置文件已经挂载到宿主机上了,另外容器中是没法连接数据库进入postgres控制台的。因为我们没有安装客户端

创建service验证

apiVersion: v1
kind: Service
metadata:
  name: postgresql
spec:
  ports:
    - protocol: TCP
      port: 5432
      targetPort: 5432
      nodePort: 30032
  type: NodePort
  selector:
    app: postgres  # 容器标签选择器

使用navicat连接 postgres看看吧。
image.png

最后提供一个完整的yaml文件,注意这个文件并没有创建Storage Classes

postgresql.yaml

# postgreSql  

评论

公众号:mumuser

企鹅群:932154986

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×