如果使用 k8s 部署 mysql、redis、minio等数据和文件存储服务,k8s 默认容器如果重建,则容器中的数据文件将会丢失,所以为了解决这些问题,通常就需要将容器中需要持久化的文件存储到其它可持久化存储目录中。
如果使用 k8s 部署 springboot 项目,那么项目的日志文件也是需要存储到其它可持久化存储目录中。
k8s存储支持多种模式,本地存储,传递网络存储,分布式网络存储,以及云存储等。
本章节是基于上一个章节 Springboot 项目通过 gitlab CI/CD 集成 k8s 自动部署,实现通过 nfs 挂载 springboot 项目的日志文件到外部目录。
在挂载的目标服务器上安装 nfs-utils(这里使用的 nfs 服务器ip是 192.168.1.28)
[root@node3 ~]# yum -y install nfs-utils
创建 nfs 目录并修改权限
[root@node3 ~]# mkdir -p /nfs/data/
[root@node3 ~]# chmod -R 777 /nfs/data
编辑 nfs 默认的配置文件 /etc/exports,写入如下内容
[root@node3 ~]# cat /etc/exports
/nfs/data *(rw,no_root_squash,sync)
配置生效并查看生效
[root@node3 ~]# exportfs -r
[root@node3 ~]# exportfs
/nfs/data <world>
启动rpcbind、nfs服务
[root@node3 ~]# systemctl restart rpcbind && systemctl enable rpcbind
[root@node3 ~]# systemctl restart nfs-server && systemctl enable nfs-server
查看 RPC 服务的注册状况
[root@node3 ~]# rpcinfo -p localhost
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
...
...
showmount测试
[root@node3 ~]# showmount -e 192.168.1.28
Export list for 192.168.1.28:
/nfs/data *
在 k8s 的所有节点下安装 nfs-utils
[root@node1 ~]# yum -y install nfs-utils
在 master 节点服务器上新建 用于创建 pv 和 pvc 的 yaml 文件 springboot-ci-cd-demo-pv.yaml,内容如下
apiVersion: v1
kind: PersistentVolume
metadata:
name: springboot-ci-cd-demo-pv
labels:
pv: springboot-ci-cd-demo-pv
spec:
capacity:
storage: 100Mi
accessModes:
- ReadWriteMany
nfs:
server: 192.168.1.28
path: "/nfs/data/logs/springboot-ci-cd-demo/" #NFS目录,需要该目录在NFS上存在,不存在需要先去创建目录
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: springboot-ci-cd-demo-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 100Mi #容量
执行创建 pv 和 pvc 命令
[root@master yaml]# kubectl apply -f springboot-ci-cd-demo-pv.yaml -n demo
persistentvolume/springboot-ci-cd-demo-pv created
persistentvolumeclaim/springboot-ci-cd-demo-pvc created
[root@master yaml]# kubectl get pv -n demo
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
springboot-ci-cd-demo-pv 100Mi RWX Retain Bound demo/springboot-ci-cd-demo-pvc 15s
[root@master yaml]# kubectl get pvc -n demo
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
springboot-ci-cd-demo-pvc Bound springboot-ci-cd-demo-pv 100Mi RWX 25s
pod 的 yaml 文件修改,即 gitlab variable 变量 K8S_DEMO_YAML 的内容修改如下
---
apiVersion: v1
kind: Service
metadata:
name: $DEPLOYMENT_NAME
namespace: demo
labels:
app: ci-cd-demo
spec:
type: NodePort
ports:
- name: ci-cd-demo
port: 8080
protocol: TCP
nodePort: 30080
selector:
app: ci-cd-demo
---
apiVersion: apps/v1
kind: Deployment #对象类型
metadata:
name: $DEPLOYMENT_NAME #名称
labels:
app: ci-cd-demo #标注
spec:
replicas: 1 #运行容器的副本数,修改这里可以快速修改分布式节点数量
selector:
matchLabels:
app: ci-cd-demo
template:
metadata:
labels:
app: ci-cd-demo
spec:
containers: #docker容器的配置
- name: $DEPLOYMENT_NAME
image: $PROJECT_IMAGE
imagePullPolicy: Always
ports:
- containerPort: 8080
protocol: TCP
env:
- name: JAVA_OPTS
value: -Xms256m -Xmx256m
volumeMounts:
- mountPath: /data/logs
name: logfile
volumes:
- name: logfile
persistentVolumeClaim:
claimName: springboot-ci-cd-demo-pvc
imagePullSecrets:
- name: regsecret
在 springboot 项目的 yml 配置文件里指定日志输出目录
logging:
file:
name: /data/logs/springboot-ci-cd-demo.log
删除 pod 原来的部署,重新跑 CI 部署
[root@master ~]# kubectl delete deployment springboot-ci-cd-demo -n demo
deployment.apps "springboot-ci-cd-demo" deleted
CI 跑完之后成功部署项目之后,在挂载的 nfs 目录 /nfs/data/logs/springboot-ci-cd-demo/ 下查看日志文件
[root@node3 ~]# cd /nfs/data/logs/springboot-ci-cd-demo
[root@node3 springboot-ci-cd-demo]# ls
springboot-ci-cd-demo.log
pod 重启之后日志输出会叠加到该日志文件上