【k8s配置与存储--持久化存储(HostPath、EmptyDir、NFS)】

2024-02-28 11:12

本文主要是介绍【k8s配置与存储--持久化存储(HostPath、EmptyDir、NFS)】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、HostPath 持久化存储

1.1 持久卷 HostPath(节点上的文件或目录挂载到Pod上)

  • 将节点上的文件或目录挂载到Pod上,此时该目录会变成持久化存储目录,即使Pod被删除后重启,也可以重新加载到该目录,该目录下的文件不会丢失。

1.2 配置文件

  • volumes 中如何与node节点主机共享目录时,type类型有多种,如下类型:
    • 空字符串:默认类型,不做任何检查
    • DirectoryOrCreate:如果给定的path不存在,就创建一个755的空目录
    • Directory:这个目录必须存在
    • FileOrCreate:如果给定的文件不存在,则创建一个空文件,权限为644
    • File:这个文件必须存在
    • Socket:UNIX套接字,必须存在
    • CharDevice:字符设备,必须存在
    • BlockDevice:块设备,必须存在
apiVersion: v1
kind: Pod
metadata:name: test-host-volume-pod
spec:containers:- image: nginx:1.20name: nginx-volumevolumeMounts:- mountPath: /data    # 挂载到容器哪个目录name: host-volume    # 挂载的数据卷的名字volumes:- name: host-volumehostPath:   # 与主机共享目录path: /data   # node节点上的目录type: DirectoryOrCreate  #检查类型,在挂数前对挂载目录做什么检查操作,有多种选项,默认为空字符串,不做任何检查

1.3 创建这个pod资源

[root@k8s-master volume]# kubectl create  -f host-volume.yaml
pod/host-volume-pod created[root@k8s-master volume]# kubectl get po  -o wide
NAME                           READY   STATUS              RESTARTS      AGE     IP          NODE          NOMINATED NODE   READINESS GATES
configfile-po                  0/1     Completed           0             178m    10.2.1.69   k8s-node-02   <none>           <none>
dns-test                       1/1     Running             2 (12h ago)   2d21h   10.2.1.58   k8s-node-02   <none>           <none>
fluentd-59k8k                  1/1     Running             1 (12h ago)   2d4h    10.2.2.34   k8s-node-01   <none>           <none>
fluentd-hhtls                  1/1     Running             1 (12h ago)   2d4h    10.2.1.59   k8s-node-02   <none>           <none>
host-volume-pod                0/1     ContainerCreating   0             13s     <none>      k8s-node-02   <none>           <none>
nginx-deploy-6fb8d6548-8khhv   1/1     Running             6 (33m ago)   6h33m   10.2.1.67   k8s-node-02   <none>           <none>
nginx-deploy-6fb8d6548-fd9tx   1/1     Running             6 (33m ago)   6h33m   10.2.2.40   k8s-node-01   <none>           <none>[root@k8s-master volume]# kubectl get po  -o wide
NAME                           READY   STATUS      RESTARTS      AGE     IP          NODE          NOMINATED NODE   READINESS GATES
configfile-po                  0/1     Completed   0             179m    10.2.1.69   k8s-node-02   <none>           <none>
dns-test                       1/1     Running     2 (12h ago)   2d21h   10.2.1.58   k8s-node-02   <none>           <none>
fluentd-59k8k                  1/1     Running     1 (12h ago)   2d4h    10.2.2.34   k8s-node-01   <none>           <none>
fluentd-hhtls                  1/1     Running     1 (12h ago)   2d4h    10.2.1.59   k8s-node-02   <none>           <none>
host-volume-pod                1/1     Running     0             61s     10.2.1.71   k8s-node-02   <none>           <none>
nginx-deploy-6fb8d6548-8khhv   1/1     Running     6 (34m ago)   6h34m   10.2.1.67   k8s-node-02   <none>           <none>
nginx-deploy-6fb8d6548-fd9tx   1/1     Running     6 (34m ago)   6h34m   10.2.2.40   k8s-node-01   <none>           <none>

1.4 在容器中查看这个挂载的数据目录,并且在容器中创建文件

[root@k8s-master volume]# kubectl exec -it host-volume-pod  -- sh -c 'ls -l  /data/'
total 0[root@k8s-master volume]# kubectl exec -it host-volume-pod  -- sh -c 'cd  /data/  && echo "hello kubernetes..." > index.html'

1.5 刚才查到这个pod创建到了k8s-node-02节点上,查看这个文件内容

[root@k8s-node-02 ~]# cd /data/
[root@k8s-node-02 data]# ll
总用量 4
-rw-r--r--. 1 root root 20 227 00:30 index.html
[root@k8s-node-02 data]# cat index.html
hello kubernetes...

2、临时卷 EmptyDir

2.1 EmptyDir 共享多个pod的数据共享,但是数据不能做之久话存储

  • EmptyDir主要用于一个Pod中不同的Container共享致据使用的,由于只是在Pod内部使用,因此与英他volume比较大的区别是,当Pod如果被除了,那么emptyDir也会被除。
  • 存价质可以是任意类型,如SSD、磁盈或网焰存储。可以将emptyDir.medium设置为Memory让k8s使用tmpfs(内存支待文件系统),速度比较快,但是里启tmp形节点时,数据会被清除,且设旦的大小会计入到Container的内存限制中.

2.2 配置文件

apiVersion: v1
kind: Pod
metadata:name: emptydir-volume-pod
spec:containers:- image: alpinename: alpine-volume-01command: ['/bin/sh', '-c', 'sleep 3600;']volumeMounts:- mountPath: /emptydir-1    # 挂载到容器哪个目录name: emptydir-volume    # 挂载的数据卷的名字- image: alpinename: alpine-volume-02command: ['/bin/sh', '-c', 'sleep 3600;']volumeMounts:- mountPath: /emptydir-2    # 挂载到容器哪个目录name: emptydir-volume    # 挂载的数据卷的名字 volumes:- name: emptydir-volumeemptyDir: {}

2.3 创建这个pod资源

[root@k8s-master volume]# kubectl create -f emptydir-volume.yaml
pod/emptydir-volume-pod created
[root@k8s-master volume]#
[root@k8s-master volume]# kubectl get po
NAME                           READY   STATUS              RESTARTS      AGE
configfile-po                  0/1     Completed           0             3h15m
dns-test                       1/1     Running             2 (13h ago)   2d21h
emptydir-volume-pod            0/2     ContainerCreating   0             5s
fluentd-59k8k                  1/1     Running             1 (13h ago)   2d4h
fluentd-hhtls                  1/1     Running             1 (13h ago)   2d4h
host-volume-pod                1/1     Running             0             17m
nginx-deploy-6fb8d6548-8khhv   1/1     Running             6 (50m ago)   6h50m
nginx-deploy-6fb8d6548-fd9tx   1/1     Running             6 (50m ago)   6h50m
[root@k8s-master volume]# kubectl get po
NAME                           READY   STATUS      RESTARTS      AGE
configfile-po                  0/1     Completed   0             3h17m
dns-test                       1/1     Running     2 (13h ago)   2d22h
emptydir-volume-pod            2/2     Running     0             81s
fluentd-59k8k                  1/1     Running     1 (13h ago)   2d4h
fluentd-hhtls                  1/1     Running     1 (13h ago)   2d4h
host-volume-pod                1/1     Running     0             18m
nginx-deploy-6fb8d6548-8khhv   1/1     Running     6 (51m ago)   6h52m
nginx-deploy-6fb8d6548-fd9tx   1/1     Running     6 (51m ago)   6h52m

2.4 emptydir 共享数据测试

2.4.1 在 alpine-volume-01 容器内创建文件

[root@k8s-master volume]# kubectl exec -it emptydir-volume-pod  -c  alpine-volume-01 -- sh  -c 'cd  /emptydir-1  &&  touch  test.log '

2.4.2 在 alpine-volume-02 容器内查看这个文件

[root@k8s-master volume]# kubectl exec -it emptydir-volume-pod  -c  alpine-volume-02 -- sh  -c 'cd  /emptydir-2  &&  ls -l '
total 0
-rw-r--r--    1 root     root             0 Feb 26 16:48 test.log

2.4.3 在 alpine-volume-02 容器内创建文件

[root@k8s-master volume]# kubectl exec -it emptydir-volume-pod  -c  alpine-volume-02 -- sh  -c 'cd  /emptydir-2  &&  touch aaa.txt  '

2.4.4 在 alpine-volume-01 容器内查看文件


[root@k8s-master volume]# kubectl exec -it emptydir-volume-pod  -c  alpine-volume-01 -- sh  -c 'cd  /emptydir-1  &&  ls -l '
total 0
-rw-r--r--    1 root     root             0 Feb 26 16:50 aaa.txt
-rw-r--r--    1 root     root             0 Feb 26 16:48 test.log

3、NFS(网络文件系统)持久化存储

  • nfs卷能将NFS(网络文件系统挂载到你的Pod中。不像emptyDir那样会在删除Pod的同时也会被除,nfs卷的内容在删除Pod时会被保存,卷只是被卸载。这意味着fs卷可以被预先填充数据,并且这些数据可以在Pod之间共享

3.1 安装nfs服务

3.1.1 k8s 3台节点都安装nfs服务

yum install -y nfs-utils

3.1.2 节点都启动nfs服务

systemctl start nfs

3.1.3 在master节点创建nfs的共享目录

mkdir -p  /data/nfs/{ro,rw} 

3.1.4 设置共享目录

echo "/data/nfs/rw 10.10.10.0/24(rw,sync,no_subtree_check,no_root_squash)"  >> /etc/exportsecho  "/data/nfs/ro 10.10.10.0/24(ro,sync,no_subtree_check,no_root_squash)"  >> /etc/exports 

3.1.5 重新加载配置并重启nfs服务

exportfs -fsystemctl restart nfs

3.1.6 挂载nfs共享目录

[root@k8s-node-01 ~]# mkdir -p /data/nfs/{ro,rw}
[root@k8s-node-01 ~]# mount -t nfs 10.10.10.100:/data/nfs/rw     /data/nfs/rw/
[root@k8s-node-01 ~]# mount -t nfs 10.10.10.100:/data/nfs/ro     /data/nfs/ro/

3.1.7 测试挂载目录是否成功

master 上在ro目录创建一个文件

[root@k8s-master ~]# cd /data/nfs/ro/
[root@k8s-master ro]# echo  "这是一个只读目录"  >  Readme.md
[root@k8s-master ro]# ll
总用量 4
-rw-r--r--. 1 root root 25 227 01:39 Readme.md

在node-01节点上查看这个ro目录中的文件内容,并且确认是否可写

[root@k8s-node-01 ~]# cd /data/nfs/ro
[root@k8s-node-01 ro]# ll
总用量 4
-rw-r--r--. 1 root root 25 227 01:39 Readme.md
[root@k8s-node-01 ro]# cat Readme.md
这是一个只读目录
[root@k8s-node-01 ro]# touch node.md
touch: 无法创建"node.md": 只读文件系统

在node-01节点上rw目录创建一个文件

[root@k8s-node-01 ro]# cd ../rw/
[root@k8s-node-01 rw]# echo "这个是可读可写目录"  > Readme.md
[root@k8s-node-01 rw]#

我们在master节点上看是否有这个文件

[root@k8s-master ro]# cd ../rw/
[root@k8s-master rw]# cat Readme.md
这个是可读可写目录

3.2 创建配置文件

apiVersion: v1
kind: Pod
metadata:name: nfs-volume-pod 
spec:containers:- image: nginx:1.20name: nfs-nginxcommand: ['/bin/sh', '-c', 'sleep 3600;']volumeMounts:- mountPath: /usr/share/nginx/html   # 挂载到容器哪个目录name: nfs-volume    # 挂载的数据卷的名字volumes:- name: nfs-volumenfs:server: "10.10.10.100"path: "/data/nfs/rw"readOnly: false 

3.3 提前在rw目录中创建一个index.html文件

[root@k8s-master ~]# echo "k8s-master: 10.10.10.100  "  > /data/nfs/rw/index.html

3.4 创建pod

[root@k8s-master nfs]# kubectl create  -f nfs-volume.yaml
pod/nfs-volume-pod-1 created[root@k8s-master nfs]# kubectl get po  -owide
NAME                           READY   STATUS      RESTARTS        AGE     IP          NODE          NOMINATED NODE   READINESS GATES
configfile-po                  0/1     Completed   0               4h30m   10.2.1.69   k8s-node-02   <none>           <none>
dns-test                       1/1     Running     2 (14h ago)     2d23h   10.2.1.58   k8s-node-02   <none>           <none>
emptydir-volume-pod            2/2     Running     2 (14m ago)     74m     10.2.1.72   k8s-node-02   <none>           <none>
fluentd-59k8k                  1/1     Running     1 (14h ago)     2d5h    10.2.2.34   k8s-node-01   <none>           <none>
fluentd-hhtls                  1/1     Running     1 (14h ago)     2d5h    10.2.1.59   k8s-node-02   <none>           <none>
host-volume-pod                1/1     Running     0               92m     10.2.1.71   k8s-node-02   <none>           <none>
nfs-volume-pod-1               1/1     Running     0               64s     10.2.2.41   k8s-node-01   <none>           <none>
nginx-deploy-6fb8d6548-8khhv   1/1     Running     8 (5m27s ago)   8h      10.2.1.67   k8s-node-02   <none>           <none>
nginx-deploy-6fb8d6548-fd9tx   1/1     Running     8 (5m26s ago)   8h      10.2.2.40   k8s-node-01   <none>           <none>

3.5 使用curl访问这个nginx服务

刚才我创建的index.html文件在访问nginx的时候生效,也就是说通过nfs网络挂成功。

[root@k8s-master nfs]# curl 10.2.2.41
k8s-master: 10.10.10.100

3.6 使用配置文件再创建一个pod,需要修改pod名字

[root@k8s-master nfs]# kubectl create -f nfs-volume2.yaml
pod/nfs-volume-pod-2 created
[root@k8s-master nfs]# kubectl get po
NAME                           READY   STATUS      RESTARTS      AGE
configfile-po                  0/1     Completed   0             4h36m
dns-test                       1/1     Running     2 (14h ago)   2d23h
emptydir-volume-pod            2/2     Running     2 (19m ago)   80m
fluentd-59k8k                  1/1     Running     1 (14h ago)   2d5h
fluentd-hhtls                  1/1     Running     1 (14h ago)   2d5h
host-volume-pod                1/1     Running     0             97m
nfs-volume-pod-1               1/1     Running     0             6m19s
nfs-volume-pod-2               1/1     Running     0             6s
nginx-deploy-6fb8d6548-8khhv   1/1     Running     8 (10m ago)   8h
nginx-deploy-6fb8d6548-fd9tx   1/1     Running     8 (10m ago)   8h
[root@k8s-master nfs]# kubectl get po  -o wide
NAME                           READY   STATUS      RESTARTS      AGE     IP          NODE          NOMINATED NODE   READINESS GATES
configfile-po                  0/1     Completed   0             4h36m   10.2.1.69   k8s-node-02   <none>           <none>
dns-test                       1/1     Running     2 (14h ago)   2d23h   10.2.1.58   k8s-node-02   <none>           <none>
emptydir-volume-pod            2/2     Running     2 (19m ago)   80m     10.2.1.72   k8s-node-02   <none>           <none>
fluentd-59k8k                  1/1     Running     1 (14h ago)   2d5h    10.2.2.34   k8s-node-01   <none>           <none>
fluentd-hhtls                  1/1     Running     1 (14h ago)   2d5h    10.2.1.59   k8s-node-02   <none>           <none>
host-volume-pod                1/1     Running     0             97m     10.2.1.71   k8s-node-02   <none>           <none>
nfs-volume-pod-1               1/1     Running     0             6m25s   10.2.2.41   k8s-node-01   <none>           <none>
nfs-volume-pod-2               1/1     Running     0             12s     10.2.2.42   k8s-node-01   <none>           <none>
nginx-deploy-6fb8d6548-8khhv   1/1     Running     8 (10m ago)   8h      10.2.1.67   k8s-node-02   <none>           <none>
nginx-deploy-6fb8d6548-fd9tx   1/1     Running     8 (10m ago)   8h      10.2.2.40   k8s-node-01   <none>           <none>

3.7 访问这个新的pod上的nginx服务

[root@k8s-master nfs]# curl 10.2.2.42
k8s-master: 10.10.10.100

3.8 小结

通过刚才创建的两个nginx-pod资源,我们使用nfs共享目录到两个pod中,通过访问nginx服务,可以看到两个pod资源显示的结果都是一致的。

这篇关于【k8s配置与存储--持久化存储(HostPath、EmptyDir、NFS)】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

CentOS7安装配置mysql5.7 tar免安装版

一、CentOS7.4系统自带mariadb # 查看系统自带的Mariadb[root@localhost~]# rpm -qa|grep mariadbmariadb-libs-5.5.44-2.el7.centos.x86_64# 卸载系统自带的Mariadb[root@localhost ~]# rpm -e --nodeps mariadb-libs-5.5.44-2.el7

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

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储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

hadoop开启回收站配置

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。 开启回收站功能参数说明 (1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。 (2)默认值fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

wolfSSL参数设置或配置项解释

1. wolfCrypt Only 解释:wolfCrypt是一个开源的、轻量级的、可移植的加密库,支持多种加密算法和协议。选择“wolfCrypt Only”意味着系统或应用将仅使用wolfCrypt库进行加密操作,而不依赖其他加密库。 2. DTLS Support 解释:DTLS(Datagram Transport Layer Security)是一种基于UDP的安全协议,提供类似于

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

90、k8s之secret+configMap

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

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP