最近想搞搞代码质量检查,因为之前搭建过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里就已经写好的。
具体请查看hub docker
所以如果以上环境变量PGDATA如果配置的是/var/lib/postgresql/data。 挂载目录mountPath配置的目录是: /var/lib/postgresql 。其实整个挂载是无效的。
小提示: 如果是默认挂载目录,宿主机的目录在哪里呢。其实是在docker的默认volumes目录下(/var/lib/docker/volumes),当然挂载的路径是随机的哦。一般数据库都有默认的挂载路径(想想为啥呢)
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看看吧。
最后提供一个完整的yaml文件,注意这个文件并没有创建Storage Classes