Kubernetes(k8s)持久化存储PV和PVC

2024-06-14 13:18

本文主要是介绍Kubernetes(k8s)持久化存储PV和PVC,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、K8s为什么要使用存储?

答:k8s中的副本控制器保证了pod的始终存储,却保证不了Pod中的数据。只有启动一个新pod的,之前pod中的数据会随着容器的删掉而丢失。k8s中的rc启动指定数量的Pod,当某个Pod死掉了,会在新的节点启动新的Pod,k8s中想要实现数据持久化,需要使用一个叫做共享存储的,让Pod里面的数据挂载到这个共享存储上面,就算在新的节点启动新的Pod,依然可以保证数据不丢失。

 

2、k8s中的PV和PVC的概念。

答:PersistentVolume(简称为PV,持久化存储),由管理员添加的一个存储的描述,是一个全局资源,没有namespace的限制,包含存储的类型,存储的大小和访问模式等等。它的生命周期独立于Pod,例如当使用它的Pod销毁时对PV没有影响。
  PersistentVolumeClaim(简称为PVC),是Namespace里面的资源,描述对PV的一个请求。请求信息包含存储大小,访问模式等等。注意,PV和PVC是一一绑定的。

3、首先这里创建PV使用到的是NFS,这里首先安装一下NFS,如下所示:

需要Master主节点先安装NFS服务端,在所有Node节点安装NFS客户端,不然Pod无法使用,因为挂载不上,在三台机器都执行下面的命令即可。

 1 [root@k8s-master ~]# yum install nfs-utils.x86_64 2 Loaded plugins: fastestmirror, langpacks, product-id, search-disabled-repos, subscription-manager3 4 This system is not registered with an entitlement server. You can use subscription-manager to register.5 6 Loading mirror speeds from cached hostfile7  * base: mirrors.tuna.tsinghua.edu.cn8  * extras: mirrors.bfsu.edu.cn9  * updates: mirrors.bfsu.edu.cn
10 base                                                                                                                                                                                      | 3.6 kB  00:00:00     
11 extras                                                                                                                                                                                    | 2.9 kB  00:00:00     
12 updates                                                                                                                                                                                   | 2.9 kB  00:00:00     
13 Resolving Dependencies
14 --> Running transaction check
15 ---> Package nfs-utils.x86_64 1:1.3.0-0.61.el7 will be updated
16 ---> Package nfs-utils.x86_64 1:1.3.0-0.66.el7 will be an update
17 --> Finished Dependency Resolution
18 
19 Dependencies Resolved
20 
21 =================================================================================================================================================================================================================
22  Package                                           Arch                                           Version                                                     Repository                                    Size
23 =================================================================================================================================================================================================================
24 Updating:
25  nfs-utils                                         x86_64                                         1:1.3.0-0.66.el7                                            base                                         412 k
26 
27 Transaction Summary
28 =================================================================================================================================================================================================================
29 Upgrade  1 Package
30 
31 Total size: 412 k
32 Is this ok [y/d/N]: y
33 Downloading packages:
34 Running transaction check
35 Running transaction test
36 Transaction test succeeded
37 Running transaction
38   Updating   : 1:nfs-utils-1.3.0-0.66.el7.x86_64                                                                                                                                                             1/2 
39   Cleanup    : 1:nfs-utils-1.3.0-0.61.el7.x86_64                                                                                                                                                             2/2 
40   Verifying  : 1:nfs-utils-1.3.0-0.66.el7.x86_64                                                                                                                                                             1/2 
41   Verifying  : 1:nfs-utils-1.3.0-0.61.el7.x86_64                                                                                                                                                             2/2 
42 
43 Updated:
44   nfs-utils.x86_64 1:1.3.0-0.66.el7                                                                                                                                                                              
45 
46 Complete!
47 [root@k8s-master ~]# 

在三台机器都要安装nfs-utils的包的,然后在服务器端,开始配置配置文件/etc/exports,如下所示:

1 [root@k8s-master ~]# vim /etc/exports

配置内容,如下所示:

1 # 共享data目录,允许192.168.110.*访问,即允许110段ip地址访问。读写权限,同步,不做root用户、所有用户的UID映射
2 /data 192.168.110.0/24(rw,async,no_root_squash,no_all_squash)

创建/data/目录下面的一个目录,如下所示:

1 [root@k8s-master ~]# cat /etc/exports
2 # 共享data目录,允许192.168.110.*访问,即允许110段ip地址访问。读写权限,同步,不做root用户、所有用户的UID映射
3 /data 192.168.110.0/24(rw,async,no_root_squash,no_all_squash)
4 
5 
6 [root@k8s-master ~]# mkdir /data/k8s
7 mkdir: cannot create directory ‘/data/k8s’: No such file or directory
8 [root@k8s-master ~]# mkdir /data/k8s -p
9 [root@k8s-master ~]# 

然后重启nfs、rpcbind,如下所示:

1 [root@k8s-master ~]# systemctl restart rpcbind.service          
2 [root@k8s-master ~]# systemctl restart nfs.service 
3 [root@k8s-master ~]# 

在另外两个节点查看是否可以查看到nfs,如下所示:

 1 [root@k8s-node2 ~]# showmount -e 192.168.110.1332 Export list for 192.168.110.133:3 /data 192.168.110.0/244 [root@k8s-node2 ~]# 5 6 7 [root@k8s-node3 ~]# showmount -e 192.168.110.1338 Export list for 192.168.110.133:9 /data 192.168.110.0/24
10 [root@k8s-node3 ~]# 

下面开始创建一个PV,如下所示:

1 [root@k8s-master ~]# cd k8s/
2 [root@k8s-master k8s]# ls
3 book-master.war  dashboard  dashboard.zip  deploy  health  heapster  hpa  metrics  namespace  pod  rc  skydns  skydns.zip  svc  tomcat_demo  tomcat_demo.zip
4 [root@k8s-master k8s]# mkdir volume
5 [root@k8s-master k8s]# cd volume/
6 [root@k8s-master volume]# vim test-pv.yaml

配置内容,如下所示:

 1 apiVersion: v12 kind: PersistentVolume3 metadata:4   name: testpv5   labels:6     type: testpv7 spec:8   capacity:9     storage: 10Gi
10   accessModes:
11     - ReadWriteMany
12   persistentVolumeReclaimPolicy: Recycle
13   nfs:
14     path: "/data/k8s"
15     server: 192.168.110.133
16     readOnly: false

开始创建这个PV,并进行查看,如下所示:

1 [root@k8s-master volume]# kubectl create -f test-pv.yaml 
2 persistentvolume "testpv" created
3 [root@k8s-master volume]# kubectl get pv -o wide
4 NAME      CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS      CLAIM     REASON    AGE
5 testpv    10Gi       RWX           Recycle         Available                       10s
6 [root@k8s-master volume]# 

再创建一个5Gi的PV,修改一下配置文件,然后进行创建,名称必须不一样,标签可以一样的,如下所示:

1 [root@k8s-master volume]# vim test-pv.yaml 
2 [root@k8s-master volume]# kubectl create -f test-pv.yaml 
3 persistentvolume "testpv2" created
4 [root@k8s-master volume]# kubectl get pv -o wide
5 NAME      CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS      CLAIM     REASON    AGE
6 testpv    10Gi       RWX           Recycle         Available                       3m
7 testpv2   5Gi        RWX           Recycle         Available                       3s
8 [root@k8s-master volume]# 

开始创建PVC,如下所示:

 1 apiVersion: v12 kind: PersistentVolumeClaim3 kind: PersistentVolumeClaim4 apiVersion: v15 metadata:6   name: nfs7 spec:8   accessModes:9     - ReadWriteMany
10   resources:
11     requests:
12       storage: 1Gi
1 [root@k8s-master volume]# kubectl create -f test-pvc.yaml 
2 persistentvolumeclaim "nfs" created
3 [root@k8s-master volume]# kubectl get pvc -o wide
4 NAME      STATUS    VOLUME    CAPACITY   ACCESSMODES   AGE
5 nfs       Bound     testpv2   5Gi        RWX           9s
6 [root@k8s-master volume]# 

此时,可以发现pvc已经绑定到了testpv2这个PV上面了,pvc优先绑定到容量小的pv上面的。自己也可以再创建一个6G的PV,然后再创建一个7G的PVC,可以发现这个PVC会绑定到10G的这个PV上面了的。

 

4、K8s持久化实战,自己可以参考一下这篇https://www.cnblogs.com/wangxu01/articles/11411113.html。

这里首先引用一下https://www.cnblogs.com/biehongli/p/13150609.html,使用k8s运行Java Web项目,这里紧接着这个链接的操作,创建一个mysql,如下所示:

 1 [root@k8s-master tomcat_demo]# kubectl create -f mysql-rc.yml 2 replicationcontroller "mysql" created3 [root@k8s-master tomcat_demo]# kubectl create -f mysql-svc.yml 4 service "mysql" created5 [root@k8s-master tomcat_demo]# kubectl get all -o wide6 NAME       DESIRED   CURRENT   READY     AGE       CONTAINER(S)   IMAGE(S)                            SELECTOR7 rc/mysql   1         1         1         14s       mysql          192.168.110.133:5000/mysql:5.7.30   app=mysql8 9 NAME             CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE       SELECTOR
10 svc/kubernetes   10.254.0.1      <none>        443/TCP    24d       <none>
11 svc/mysql        10.254.234.52   <none>        3306/TCP   11s       app=mysql
12 
13 NAME             READY     STATUS    RESTARTS   AGE       IP            NODE
14 po/mysql-4j7qk   1/1       Running   0          14s       172.16.16.3   k8s-node3
15 [root@k8s-master tomcat_demo]# 

下面是mysql-rc.yaml的配置文件,如下所示:

 1 [root@k8s-master tomcat_demo]# cat mysql-rc.yml 2 apiVersion: v13 kind: ReplicationController4 metadata:5   name: mysql6 spec:7   replicas: 18   selector:9     app: mysql
10   template:
11     metadata:
12       labels:
13         app: mysql
14     spec:
15       containers:
16         - name: mysql
17           image: 192.168.110.133:5000/mysql:5.7.30
18           ports:
19           - containerPort: 3306
20           env:
21           - name: MYSQL_ROOT_PASSWORD
22             value: '123456'
23 [root@k8s-master tomcat_demo]# 

下面是mysql-svc.yaml的配置文件,如下所示:

 1 [root@k8s-master tomcat_demo]# cat mysql-svc.yml 2 apiVersion: v13 kind: Service4 metadata:5   name: mysql6 spec:7   ports:8     - port: 33069       targetPort: 3306
10   selector:
11     app: mysql
12 [root@k8s-master tomcat_demo]# 

下面是tomcat-rc.yml的配置文件,如下所示:

 1 [root@k8s-master tomcat_demo]# kubectl get all -o wide2 NAME       DESIRED   CURRENT   READY     AGE       CONTAINER(S)   IMAGE(S)                                  SELECTOR3 rc/mysql   1         1         1         2h        mysql          192.168.110.133:5000/mysql:5.7.30         app=mysql4 rc/myweb   1         1         1         11m       myweb          192.168.110.133:5000/tomcat-book:latest   app=myweb5 6 NAME             CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE       SELECTOR7 svc/kubernetes   10.254.0.1      <none>        443/TCP          24d       <none>8 svc/mysql        10.254.234.52   <none>        3306/TCP         2h        app=mysql9 svc/myweb        10.254.14.249   <nodes>       8080:30008/TCP   10m       app=myweb
10 
11 NAME             READY     STATUS    RESTARTS   AGE       IP            NODE
12 po/mysql-4j7qk   1/1       Running   0          2h        172.16.16.3   k8s-node3
13 po/myweb-f2dqn   1/1       Running   0          11m       172.16.16.5   k8s-node3
14 [root@k8s-master tomcat_demo]# vim tomcat-rc.yml 
15 [root@k8s-master tomcat_demo]# cat tomcat-rc.yml 
16 apiVersion: v1
17 kind: ReplicationController
18 metadata:
19   name: myweb
20 spec:
21   replicas: 1
22   selector:
23     app: myweb
24   template:
25     metadata:
26       labels:
27         app: myweb
28     spec:
29       containers:
30         - name: myweb
31           # image: 192.168.110.133:5000/tomcat:lates

这篇关于Kubernetes(k8s)持久化存储PV和PVC的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1060517

相关文章

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

k8s部署MongDB全过程

《k8s部署MongDB全过程》文章介绍了如何在Kubernetes集群中部署MongoDB,包括环境准备、创建Secret、创建服务和Deployment,并通过Robo3T工具测试连接... 目录一、环境准备1.1 环境说明1.2 创建 namespace1.3 创建mongdb账号/密码二、创建Sec

centos7基于keepalived+nginx部署k8s1.26.0高可用集群

《centos7基于keepalived+nginx部署k8s1.26.0高可用集群》Kubernetes是一个开源的容器编排平台,用于自动化地部署、扩展和管理容器化应用程序,在生产环境中,为了确保集... 目录一、初始化(所有节点都执行)二、安装containerd(所有节点都执行)三、安装docker-

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

使用JavaScript操作本地存储

《使用JavaScript操作本地存储》这篇文章主要为大家详细介绍了JavaScript中操作本地存储的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录本地存储:localStorage 和 sessionStorage基本使用方法1. localStorage

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

90、k8s之secret+configMap

一、secret配置管理 配置管理: 加密配置:保存密码,token,其他敏感信息的k8s资源 应用配置:我们需要定制化的给应用进行配置,我们需要把定制好的配置文件同步到pod当中容器 1.1、加密配置: secret: [root@master01 ~]# kubectl get secrets ##查看加密配置[root@master01 ~]# kubectl get se