Kubernetes Volume 基本存储

发布于 2024-01-07 09:24:17 字数 5912 浏览 35 评论 0

1.1 EmptyDir

EmptyDir 是最基础的 Volume 类型,一个 EmptyDir 就是 Host 上的一个空目录。

EmptyDir 是在 Pod 被分配到 Node 时创建的,它的初始内容为空,并且无须指定宿主机上对应的目录文件,因为 Kubernetes 会自动分配一个目录,当 Pod 销毁时, EmptyDir 中的数据也会被永久删除。 EmptyDir 用途如下:

  • 临时空间,例如用于某些应用程序运行时所需的临时目录,且无须永久保留
  • 一个容器需要从另一个容器中获取数据的目录(多容器共享目录)

接下来,通过一个容器之间文件共享的案例来使用一下 EmptyDir。

在一个 Pod 中准备两个容器 nginx 和 busybox,然后声明一个 Volume 分别挂在到两个容器的目录中,然后 nginx 容器负责向 Volume 中写日志,busybox 中通过命令将日志内容读到控制台。

创建一个 volume-emptydir.yaml

apiVersion: v1
kind: Pod
metadata:
  name: volume-emptydir
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
    ports:
    - containerPort: 80
    volumeMounts:  # 将 logs-volume 挂在到 nginx 容器中,对应的目录为 /var/log/nginx
    - name: logs-volume
      mountPath: /var/log/nginx
  - name: busybox
    image: busybox:1.30
    command: ["/bin/sh","-c","tail -f /logs/access.log"] # 初始命令,动态读取指定文件中内容
    volumeMounts:  # 将 logs-volume 挂在到 busybox 容器中,对应的目录为 /logs
    - name: logs-volume
      mountPath: /logs
  volumes: # 声明 volume, name 为 logs-volume,类型为 emptyDir
  - name: logs-volume
    emptyDir: {}
# 创建 Pod
[root@k8s-master01 ~]# kubectl create -f volume-emptydir.yaml
pod/volume-emptydir created
​
# 查看 pod
[root@k8s-master01 ~]# kubectl get pods volume-emptydir -n dev -o wide
NAME                  READY   STATUS    RESTARTS   AGE      IP       NODE   ...... 
volume-emptydir       2/2     Running   0          97s   10.42.2.9   node1  ......
​
# 通过 podIp 访问 nginx
[root@k8s-master01 ~]# curl 10.42.2.9
......
​
# 通过 kubectl logs 命令查看指定容器的标准输出
[root@k8s-master01 ~]# kubectl logs -f volume-emptydir -n dev -c busybox
10.42.1.0 - - [27/Jun/2021:15:08:54 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"

1.2 HostPath

上节课提到,EmptyDir 中数据不会被持久化,它会随着 Pod 的结束而销毁,如果想简单的将数据持久化到主机中,可以选择 HostPath。

HostPath 就是将 Node 主机中一个实际目录挂在到 Pod 中,以供容器使用,这样的设计就可以保证 Pod 销毁了,但是数据依据可以存在于 Node 主机上。

创建一个 volume-hostpath.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: volume-hostpath
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
    ports:
    - containerPort: 80
    volumeMounts:
    - name: logs-volume
      mountPath: /var/log/nginx
  - name: busybox
    image: busybox:1.30
    command: ["/bin/sh","-c","tail -f /logs/access.log"]
    volumeMounts:
    - name: logs-volume
      mountPath: /logs
  volumes:
  - name: logs-volume
    hostPath: 
      path: /root/logs
      type: DirectoryOrCreate  # 目录存在就使用,不存在就先创建后使用
关于 type 的值的一点说明:
    DirectoryOrCreate 目录存在就使用,不存在就先创建后使用
    Directory   目录必须存在
    FileOrCreate  文件存在就使用,不存在就先创建后使用
    File 文件必须存在 
    Socket  unix 套接字必须存在
    CharDevice  字符设备必须存在
    BlockDevice 块设备必须存在
# 创建 Pod
[root@k8s-master01 ~]# kubectl create -f volume-hostpath.yaml
pod/volume-hostpath created
​
# 查看 Pod
[root@k8s-master01 ~]# kubectl get pods volume-hostpath -n dev -o wide
NAME                  READY   STATUS    RESTARTS   AGE   IP             NODE   ......
pod-volume-hostpath   2/2     Running   0          16s   10.42.2.10     node1  ......
​
#访问 nginx
[root@k8s-master01 ~]# curl 10.42.2.10
​
# 接下来就可以去 host 的/root/logs 目录下查看存储的文件了
###  注意: 下面的操作需要到 Pod 所在的节点运行(案例中是 node1)
[root@node1 ~]# ls /root/logs/
access.log  error.log
​
# 同样的道理,如果在此目录下创建一个文件,到容器中也是可以看到的

1.3 NFS

HostPath 可以解决数据持久化的问题,但是一旦 Node 节点故障了,Pod 如果转移到了别的节点,又会出现问题了,此时需要准备单独的网络存储系统,比较常用的用 NFS、CIFS。

NFS 是一个网络文件存储系统,可以搭建一台 NFS 服务器,然后将 Pod 中的存储直接连接到 NFS 系统上,这样的话,无论 Pod 在节点上怎么转移,只要 Node 跟 NFS 的对接没问题,数据就可以成功访问。

1)首先要准备 nfs 的服务器,这里为了简单,直接是 master 节点做 nfs 服务器

# 在 nfs 上安装 nfs 服务
[root@nfs ~]# yum install nfs-utils -y
​
# 准备一个共享目录
[root@nfs ~]# mkdir /root/data/nfs -pv
​
# 将共享目录以读写权限暴露给 192.168.5.0/24 网段中的所有主机
[root@nfs ~]# vim /etc/exports
[root@nfs ~]# more /etc/exports
/root/data/nfs     192.168.5.0/24(rw,no_root_squash)
​
# 启动 nfs 服务
[root@nfs ~]# systemctl restart nfs

2)接下来,要在的每个 node 节点上都安装下 nfs,这样的目的是为了 node 节点可以驱动 nfs 设备

# 在 node 上安装 nfs 服务,注意不需要启动
[root@k8s-master01 ~]# yum install nfs-utils -y

3)接下来,就可以编写 pod 的配置文件了,创建 volume-nfs.yaml

apiVersion: v1
kind: Pod
metadata:
  name: volume-nfs
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
    ports:
    - containerPort: 80
    volumeMounts:
    - name: logs-volume
      mountPath: /var/log/nginx
  - name: busybox
    image: busybox:1.30
    command: ["/bin/sh","-c","tail -f /logs/access.log"] 
    volumeMounts:
    - name: logs-volume
      mountPath: /logs
  volumes:
  - name: logs-volume
    nfs:
      server: 192.168.5.6  #nfs 服务器地址
      path: /root/data/nfs #共享文件路径

4)最后,运行下 pod,观察结果

# 创建 pod
[root@k8s-master01 ~]# kubectl create -f volume-nfs.yaml
pod/volume-nfs created

# 查看 pod
[root@k8s-master01 ~]# kubectl get pods volume-nfs -n dev
NAME                  READY   STATUS    RESTARTS   AGE
volume-nfs        2/2     Running   0          2m9s

# 查看 nfs 服务器上的共享目录,发现已经有文件了
[root@k8s-master01 ~]# ls /root/data/
access.log  error.log

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

离鸿

暂无简介

文章
评论
25 人气
更多

推荐作者

Promise

文章 0 评论 0

O昵称重要吗O

文章 0 评论 0

毁虫ゝ

文章 0 评论 0

leejubao

文章 0 评论 0

gaaas

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文