Kubernetes(k8s)基础之四:k8s持久化实战

目录

1.背景

1.1 什么是持久化存储?

1.2 引入PV和PVC

1.3 通过NFS实现持久化存储

2. 持久化存储实战

2.1 NFS服务器搭建

2.2. 定义PV

 2.3. 定义PVC

 2.4. 创建pod

 2.5 验证PV-PVC-NFS存储结果

 2.5.1 pod中创建文件,NFS服务器查看文件

2.5.1 NFS数据存储目录里创建文件,在Pod中查看文件

2.5.3 删除Pod,NFS服务器查看文件


1.背景

1.1 什么是持久化存储?

使用K8S另一个绕不开的话题就是K8S持久化存储。

例如: 我们做系统迁移,要把原来的服务迁移到K8S中,系统用的Mysql数据库,也要迁移到K8S。我们知道,K8S运行的是一个一个Pod,K8S对Pod自动化管理,一个Pod挂了,另外一个Pod就会马上拉起来,假如运行Mysql的Pod挂了,马上重新拉起来,那原来Pod中存储的数据还会存在吗?或者说新拉起来的Pod会进行数据恢复吗?答案是:NO! 如果没有持久化存储,那兄弟,你真正的做到了从删库到跑路!从这样一个真实的场景,我们应该认识到K8S持久化存储的重要性,可以说,没有持久化技术,K8S就没有任何发展的前景!

1.2 引入PV和PVC

Volume挂载 提供了非常好的数据持久化方案,不过在可管理性上还有不足。

要使用 Volume,Pod 必须事先知道如下信息:

当前 Volume 来自哪一台机器。
EBS Volume 已经提前创建,并且知道确切的 volume-id
Pod 通常是由应用的开发人员维护,而 Volume 则通常是由存储系统的管理员维护。开发人员要获得上面的信息:

要么询问管理员。
要么自己就是管理员。

这样就带来一个管理上的问题:应用开发人员和系统管理员的职责耦合在一起了。如果系统规模较小或者对于开发环境这样的情况还可以接受。但当集群规模变大,特别是对于生成环境,考虑到效率和安全性,这就成了必须要解决的问题。

Kubernetes 给出的解决方案是 PersistentVolume (PV)PersistentVolumeClaim(PVC)

PersistentVolume (PV) 是外部存储系统中的一块存储空间,由管理员创建和维护。与 Volume 一样,PV 具有持久性,生命周期独立于 Pod。

PersistentVolumeClaim (PVC) 是对 PV 的申请 (Claim)。PVC 通常由普通用户创建和维护。需要为 Pod 分配存储资源时,用户可以创建一个 PVC,指明存储资源的容量大小和访问模式(比如只读)等信息,Kubernetes 会查找并提供满足条件的 PV。

有了 PersistentVolumeClaim,用户只需要告诉 Kubernetes 需要什么样的存储资源,而不必关心真正的空间从哪里分配,如何访问等底层细节信息。这些 Storage Provider 的底层信息交给管理员来处理,只有管理员才应该关心创建 PersistentVolume 的细节信息。
 

1.3 通过NFS实现持久化存储

在实际开发中通常使用 PV/PVC结合NFS来实现持久化。

简单来说,要使用持久化存储,就需要使用pvc去跟pv去申请,然后pv查看自己有没有合适的存储空间卷,有合适的就与pvc进行绑定。pv与pvc是一一对应绑定的。

其创建顺序:后端存储—pv—pvc—pod,其中为后端存储一般是搭建nfs服务器来实现。

NFS 是什么? nfs(network file system) 网络文件系统,是FreeBSD支持的文件系统中的一种,允许网络中的计算机之间通过TCP/IP网络共享资源。

2. 持久化存储实战

2.1 NFS服务器搭建

(1)找一台centos 7机器,执行以下脚本,搭建 NFS服务器:

# 1. 安装nfs
yum -y install nfs-utils rpcbind


# 2.创建nfs目录
mkdir -p /opt/nfs/data/
mkdir -p /opt/nfs/data/k8s

# 3.授予权限
chmod -R 777 /opt/nfs/data

# 4.编辑export文件
# vim /etc/exports
/opt/nfs/data *(rw,no_root_squash,sync)  # 这里给的是root权限---生产环境不推荐
# 或者/nfs/data   0.0.0.0/0(rw,sync,all_squash)  # 所有用户权限被映射成服务端上的普通用户nobody,权限被压缩


# 5.使得配置生效
exportfs -r

# 6.查看生效
exportfs

# 7.启动rpcbind、nfs服务
systemctl start rpcbind && systemctl enable rpcbind   #端口是111
systemctl start nfs && systemctl enable nfs           # 端口是 2049 

# 8.查看rpc服务的注册情况
rpcinfo -p localhost

# 9.showmount测试
showmount -e ip(ip地址)

执行完成:


[root@localhost /]# mkdir -p /opt/nfs/data/
[root@localhost /]# mkdir -p /opt/nfs/data/k8s
[root@localhost /]# cd /opt/nfs

[root@localhost nfs]# chmod -R 777 /opt/nfs/data
[root@localhost nfs]# ll
total 0
drwxrwxrwx 3 root root 17 Oct  3 14:02 data

[root@localhost nfs]# exportfs
/opt/nfs/data   <world>

[root@localhost nfs]# showmount -e
Export list for localhost.localdomain:
/opt/nfs/data *

(2)在K8S集群所有node节点上安装NFS客户端

# 1.操作节点为k8s集群所有node节点
yum -y install nfs-utils  rpcbind

# 2.启动并注册为开机自启动
systemctl start nfs && systemctl enable nfs

由于本文测试环境是单节点master,且宿主机和nfs服务器为同一台虚拟机,故跳过此操作。

2.2. 定义PV

PV也作为一种K8S的资源,被K8S管理,下面的代码我们定义了一个nginx-pv。

# 定义PV
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nginx-pv    # pv的名称
spec:
  accessModes:      # 访问模式
    - ReadWriteMany # PV以read-write挂载到多个节点
  capacity:  # 容量
    storage: 2Gi    # pv可用的大小   
  persistentVolumeReclaimPolicy:  #指定当 PV 的回收策略为 Recycle
    - Recycle
  nfs:
    path: /opt/nfs/data/     # NFS的挂载路径
    server: 192.168.79.138    # NFS服务器地址,这里由于是单机部署的,填写宿主机

其中:

(1)capacity 指定 PV 的容量为 2G。

(2)accessModes 指定访问模式为 ReadWriteOnce,支持的访问模式有:

  • -ReadWriteOnce:PV 能以 read-write 模式 mount 到单个节点。
  • ReadOnlyMany:PV 能以 read-only 模式 mount 到多个节点。
  • ReadWriteMany :PV 能以 read-write 模式 mount 到多个节点。

(3)persistentVolumeReclaimPolicy 指定当 PV 的回收策略为 Recycle,支持的策略有:

  • Retain: 需要管理员手工回收。
  • Recycle:清除 PV 中的数据,效果相当于执行 rm -rf /thevolume/*。
  • Delete: 删除 Storage Provider 上的对应存储资源,例如 AWS EBS、GCE PD、Azure Disk、- OpenStack Cinder Volume 等。

(4)nfs:path 指定 PV 在 NFS 服务器上对应的目录。

 2.3. 定义PVC

---
# 定义PVC,用于消费PV
apiVersion: v1
kind: PersistentVolumeClaim  # 类型
metadata:
  name: nginx-pvc  # PVC 的名字
  namespace: dev   # 命名空间
spec:
  accessModes:    # 访问模式
    - ReadWriteMany   # PVC以read-write挂载到多个节点
  resources:
    requests:   
      storage: 2Gi    # PVC允许申请的大小

  定义一个名字叫 nginx-pvc的PVC,权限是ReadWriteMany读写权限,需要的存储空间是 2G。

 2.4. 创建pod

下面我们再来定义一个Nginx Pod,使用PV,PVC,NFS来做持久化存储的综合实例。(注意顺序,先搭建NFS服务器--定义PV-定义PVC-定义Pod)

# vim nginx-pv-demo.yaml 
# 定义PV
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nginx-pv    # pv的名称
spec:
  accessModes:      # 访问模式
    - ReadWriteMany # PV以read-write挂载到多个节点
  capacity:  # 容量
    storage: 2Gi    # pv可用的大小   
  persistentVolumeReclaimPolicy:  #指定当 PV 的回收策略为 Recycle
    - Recycle
  nfs:
    path: /opt/nfs/data/     # NFS的挂载路径
    server: 192.168.79.138    # NFS服务器地址,这里由于是单机部署的,填写宿主机

---
# 定义PVC,用于消费PV
apiVersion: v1
kind: PersistentVolumeClaim  # 类型
metadata:
  name: nginx-pvc  # PVC 的名字
  namespace: dev   # 命名空间
spec:
  accessModes:    # 访问模式
    - ReadWriteMany   # PVC以read-write挂载到多个节点
  resources:
    requests:   
      storage: 2Gi    # PVC允许申请的大小

---
# 定义Pod,指定需要使用的PVC
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-pvc
  namespace: dev   # 如果前面的PVC指定了命名空间这里必须指定与PVC一致的命名空间,否则PVC不可用
spec:
  selector:
    matchLabels: 
      app: nginx-pvc
  template:
    metadata:
      labels:
        app: nginx-pvc
    spec:
      containers:
      - name: nginx-test-pvc
        image: nginx:latest
        imagePullPolicy: IfNotPresent
        ports:
        - name: web-port
          containerPort: 80
          protocol: TCP
        volumeMounts:
        - name: nginx-persistent-storage    # 取个名字,与下面的volumes的名字要一致
          mountPath: /usr/share/nginx/html  # 容器中的路径
      volumes:
      - name: nginx-persistent-storage   
        persistentVolumeClaim:
          claimName: nginx-pvc  # 引用前面声明的PVC

可以看到 使用 persistentVolumeClaim:claimName: nginx-pvc 定义了我我们要使用名字为nginx-pvc的 PVC。 注意:如果在NFS服务器上定义的路径是/opt/nfs/data/nginx 首先我们需要去 /opt/nfs/data下创建 nginx的文件夹,不然你的pod是启动不起来的。

接下来,在master节点上启动。

# 执行启动命令 kubectl apply -f nginx-pv-demo.yaml
[root@localhost yaml]# kubectl apply -f nginx-pv-demo.yaml
persistentvolume/nginx-pv created
persistentvolumeclaim/nginx-pvc created
deployment.apps/nginx-pvc created

查看pv,pvc 


[root@localhost yaml]# kubectl get pv,pvc -n dev -o wide
NAME                                CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                    STORAGECLASS   REASON   AGE   VOLUMEMODE
persistentvolume/harbor-pv-volume   10Gi       RWX            Retain           Bound    harbor/harbor-pv-claim                           11d   Filesystem
persistentvolume/nginx-pv           2Gi        RWX            Retain           Bound    dev/nginx-pvc                                    59s   Filesystem

NAME                              STATUS   VOLUME     CAPACITY   ACCESS MODES   STORAGECLASS   AGE   VOLUMEMODE
persistentvolumeclaim/nginx-pvc   Bound    nginx-pv   2Gi        RWX                           59s   Filesystem

# STATUS状态都是绑定状态了

# 查看pod,
[root@localhost yaml]# kubectl get pods -n dev -o wide
NAME                         READY   STATUS    RESTARTS   AGE   IP               NODE                    NOMINATED NODE   READINESS GATES
nginx-pvc-84db64b59b-fw8v5   1/1     Running   0          92s   10.244.102.175   localhost.localdomain   <none>           <none>

 2.5 验证PV-PVC-NFS存储结果

 2.5.1 pod中创建文件,NFS服务器查看文件

我在pod中数据存储目录创建一个index.html,然后到nfs服务器上看有没有。

# 查询容器
[root@localhost yaml]# docker ps -a | grep nginx-test-pvc
0f66bc2e2e8f        4cdc5dd7eaad             "/docker-entrypoint.…"   3 minutes ago       Up 3 minutes                                      k8s_nginx-test-pvc_nginx-pvc-84db64b59b-fw8v5_dev_4272519d-da0d-4cd8-995e-a4324afb1763_0

#  进入容器
[root@localhost yaml]# docker exec -it 0f66bc2e2e8f /bin/bash
# 在容器中,挂载目录创建一个index.html文件,我这里容器中挂载路径是/usr/share/nginx/html
root@nginx-pvc-84db64b59b-fw8v5:/# echo "`date` test pv-pvc-nfs storage" > /usr/share/nginx/html/index.html
root@nginx-pvc-84db64b59b-fw8v5:/#

# 在NFS服务器/opt/nfs/data  目录下查看文件是否存在
[root@localhost /]# ls  /opt/nfs/data/
index.html  k8s

# 查看文件内容
[root@localhost data]# cat index.html
Mon Oct  3 06:23:27 UTC 2022 test pv-pvc-nfs storage

2.5.1 NFS数据存储目录里创建文件,在Pod中查看文件

# nfs服务器
[root@localhost /]# cd /opt/nfs/data/

# 进入文件共享目录,创建一个新的文件test.html
[root@localhost data]# echo "add another file to /nfs/data path " >  test.html

# 节点容器里查看文件
root@nginx-pvc-84db64b59b-fw8v5:/# cd /usr/share/nginx/html/

# 进入容器中挂载路径查看文件
root@nginx-pvc-84db64b59b-fw8v5:/usr/share/nginx/html# ls
index.html  k8s  test.html
root@nginx-pvc-84db64b59b-fw8v5:/usr/share/nginx/html# cat test.html
add another file to /nfs/data path

2.5.3 删除Pod,NFS服务器查看文件

把pod删了,重新拉起之后看有没有index.html,hello.html文件。

# master节点操作
# 手动删除之前的pod,k8s会自动再创建一个pod
[root@localhost yaml]# kubectl delete pod/nginx-pvc-84db64b59b-fw8v5 -n dev
pod "nginx-pvc-84db64b59b-fw8v5" deleted

[root@localhost yaml]# kubectl get pods -n dev -o wide
NAME                         READY   STATUS    RESTARTS   AGE   IP               NODE                    NOMINATED NODE   READINESS GATES
nginx-pvc-84db64b59b-k59cn   1/1     Running   0          71s   10.244.102.176   localhost.localdomain   <none>           <none>
You have new mail in /var/spool/mail/root

# 这里验证有两种方式;
# 方式一,直接访问pod的ip地址  curl   10.244.102.176/index.html
[root@localhost yaml]# curl   10.244.102.176/index.html
Mon Oct  3 06:23:27 UTC 2022 test pv-pvc-nfs storage
[root@localhost yaml]# curl   10.244.102.176/test.html
add another file to /nfs/data path
#  能够访问到文件,说明验证成功

# 方式二,是进入容器中查看文件
[root@localhost yaml]# docker ps -a | grep nginx-test-pvc
2cad1e6653eb        4cdc5dd7eaad             "/docker-entrypoint.…"   3 minutes ago       Up 3 minutes                                   k8s_nginx-test-pvc_nginx-pvc-84db64b59b-k59cn_dev_23db138e-5a44-4362-a933-3915843eafca_0

#  进入容器
[root@localhost yaml]# docker exec -it 2cad1e6653eb /bin/bash

# 查看文件
root@nginx-pvc-84db64b59b-k59cn:/# ls /usr/share/nginx/html/
index.html  k8s  test.html

参考:

K8S实战进阶篇:深入了解K8S持久化存储解决方案(五)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值