K8S使用NFS完成数据持久化

为什么我们需要将数据持久化

  • 假如现在我们在整个集群环境,有一个3副本的nginx服务,我们将我们的前端代码放到了html文件下面,这里我们使用111来代表我们的前端资源,可以看到,可以正常访问到111
    正常访问到前端资源
  • 但是我们在重启了服务,或者重启了pod之后,发现我们的资源丢失,资源不存在了,只能访问到nginx的默认界面
    在这里插入图片描述
    所以我们需要将数据和外部的目录文件进行映射,但是呢,假如我们按照docker的方式进行挂载,如果有一台节点上面的nginx的服务宕机了,本来服务是在节点3上面,现在重启过后,由于调度问题,我们的资源被重启在了节点2上面,就访问不到之前的资源了,所以这里我们需要抽象出一层存储层,来实现数据持久化,无论是采用Glustrtfs,NFS,还是CephFS都可以,本文选择NFS作为数据持久化的文件系统
    在这里插入图片描述

NFS环境搭建

节点信息

主机IP地址
master192.168.229.135
node1192.168.229.136
node2192.168.229.137
  • 所有节点进行NFS的工具安装
yum install -y nfs-utils
  • 主节点配置
#nfs主节点
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports

mkdir -p /nfs/data
systemctl enable rpcbind --now
systemctl enable nfs-server --now
#配置生效
exportfs -r
  • 从节点配置
#这里为你主节点的IP地址,主要是为了查看有哪些目录可以挂载
showmount -e 192.168.229.135


#执行以下命令挂载 nfs 服务器上的共享目录到本机路径 /root/nfsmount
mkdir -p /nfs/data

mount -t nfs 192.168.229.135:/nfs/data /nfs/data
# 写入一个测试文件
echo "hello nfs server" > /nfs/data/test.txt
  • 这里我们就完成了挂载,可以写入一个文件到主节点来查看是否完成同步,我们在主节点写入一个文件,可以查看到node1文件也有,文件同步是没问题的
    在这里插入图片描述
    在这里插入图片描述

原生方式数据挂载

  • 编写yaml文件通过原生方式挂载
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-pv-demo
  name: nginx-pv-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-pv-demo
  template:
    metadata:
      labels:
        app: nginx-pv-demo
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html
      volumes:
        - name: html
          nfs:
            server: 172.31.0.4
            path: /nfs/data/nginx-pv
kubectl apply -f depoly.yaml 
  • 通过在外部目录编辑文件,查看是否完成同步
    在这里插入图片描述
    在这里插入图片描述

PV&PVC

PV:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置
PVC:持久卷申明(Persistent Volume Claim),申明需要使用的持久卷规格
可以做到数据的弹性缩放,要多少给多少,要是pod被删除了的话还可以回收空间
在这里插入图片描述

  • 创建PV池
#nfs主节点
mkdir -p /nfs/data/01
mkdir -p /nfs/data/02
mkdir -p /nfs/data/03
  • 编写pv.yaml文件
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv01-10m
spec:
  capacity:
    storage: 10M
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/01
    server: 192.168.229.135
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv02-1gi
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/02
    server: 192.168.229.135
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv03-3gi
spec:
  capacity:
    storage: 3Gi
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/03
    server: 192.168.229.135
  • 执行文件
kubectl apply -f pv.yaml
  • 创建pvc,编写pvc的yaml文件,申请200M空间的
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nginx-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 200Mi
  storageClassName: nfs
  • 我们执行yaml文件,然后查看pv池的状态,发现1g的状态变成了bound状态
  • 创建pod绑定pvc
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-deploy-pvc
  name: nginx-deploy-pvc
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-deploy-pvc
  template:
    metadata:
      labels:
        app: nginx-deploy-pvc
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html
      volumes:
        - name: html
          persistentVolumeClaim:
            claimName: nginx-pvc
  • 查看绑定情况
    在这里插入图片描述

ConfigMap

抽取配置文件,并且可以自动更新
在这里插入图片描述

-编写一个redis.conf

vim redis.conf
appendonly yes
  • 将之前的配置创建为配置集,配置集的位置保存在etcd里面
kubectl create cm redis-conf --from-file=redis.conf
  • 创建pod,编写redis.yaml文件
apiVersion: v1
kind: Pod
metadata:
  name: redis
spec:
  containers:
  - name: redis
    image: redis
    command:
      - redis-server
      - "/redis-master/redis.conf"  #指的是redis容器内部的位置
    ports:
    - containerPort: 6379
    volumeMounts:
    - mountPath: /data
      name: data
    - mountPath: /redis-master
      name: config
  volumes:
    - name: data
      emptyDir: {}
    - name: config
      configMap:
        name: redis-conf
        items:
        - key: redis.conf
          path: redis.conf
kubectl apply -f redis.yaml 

进入容器查看可以看到redis的配置文件已经更新并且修改
在这里插入图片描述

如果大家想了解更多信息可以查看官方文档,如果这篇博客有帮到你,麻烦给个三连鼓励一下,谢谢!!!!
K8S官网文档地址link

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值