HostPath
在使用 EmptyDir 的时候,EmptyDir 中数据不会被持久化,它会随着 pod 的结束而销毁,如果想简单的将数据持久化到主机中,可以选择 HostPath
HostPath 就是将 Node 主机中一个实际目录挂载到 pod 中,以供容器使用,这样的设计就可以保证 pod 销毁了,但是数据依然可以存在于 Node 主机上
创建一个 volume-hostpath.yaml,内容如下
apiVersion: v1 kind: Pod # 类型为 pod metadata: name: volume-hostpath # pod 的名称 namespace: zouzou spec: containers: - name: nginx image: nginx:1.14 ports: - containerPort: 80 # 暴露容器的端口 volumeMounts: # 挂载 - name: logs-volume # 要和 volumes 的name 一致 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: /tmp/logs # 挂载到 node 主机上的 /tmp/log 目录下 type: DirectoryOrCreate # 目录存在就使用,不存在就先创建后使用
关于type的值的一点说明:
- DirectoryOrCreate:目录存在就使用,不存在就先创建后使用
- Directory:目录必须存在
- FileOrCreate:文件存在就使用,不存在就先创建后使用
- File:文件必须存在
- Socket:unix 套接字必须存在
- CharDevice:字符设备必须存在
- BlockDevice:块设备必须存在
创建 pod
# 创建 pod [root@dce-10-6-215-215 pod-dir]# kubectl apply -f volume-hostpath.yaml pod/volume-hostpath created
查看 pod
# pod 的 ip 地址为 172.29.35.63,并且在 dce-10-6-215-200 的节点上创建了 [root@dce-10-6-215-215 pod-dir]# kubectl get pod -n zouzou -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES volume-hostpath 2/2 Running 0 32s 172.29.35.63 dce-10-6-215-200 <none> <none>
我们登录到 dce-10-6-215-200 的 node 节点上,看 /tmp/logs 目录存在不
可以看到,目录自动创建了,并且创建了两个日志文件,我们打印下 access.log 文件里的内容
# 实时查看日志,在 node 节点上查看 tail -f access.log
因为 pod 是我们刚创建的,还没有访问 nginx,所以还没有日志产生,接下来,我们访问下 nginx
# ip 换成你自己的 ip curl 172.29.35.63:80
访问几次后,在 node 节点上去查看日志,这时候发现已经有日志输出了
然后我们删除 pod,查看文件里里面的内容是否还存在
# 删除 pod kubectl delete -f volume-hostpath.yaml
删除 pod 之前在去 dce-10-6-215-200 的 node 节点上查看,发现文件和文件里面的内容还是存在的。当我们重新创建 pod 时,在访问,日志会接着往里面写入,不会删除之前的日志
NFS
HostPath 可以解决数据持久化的问题,但是一旦 Node 节点故障了,pod 如果转移到了别的节点,又会出现问题了,此时需要准备单独的网络存储系统,比较常用的是 NFS、CIFS
NFS 是一个网络文件存储系统,可以搭建一台 NFS 服务器,然后将 pod 中的存储直接连接到 NFS 系统上,这样的话,无论 pod 在节点上怎么转移,只要 Node 跟 NFS 的对接没问题,数据就可以访问成功
首先要准备 nfs 的服务器,这里为了简单,直接是 master 节点做 nfs 服务器
在 master 机器上安装 nfs 服务
# 安装 nfs 服务 yum install nfs-utils -y
在 master 上准备一个共享目录
# 创建一个共享目录,-p 递归创建,-v 显示创建信息 [root@dce-10-6-215-215 ~]# mkdir /root/data/nfs -pv mkdir: created directory ‘/root/data’ mkdir: created directory ‘/root/data/nfs’
将共享目录以读写权限暴露给 10.6.215.0/24 网段中的所有主机(注意,网段要是你自己的网段,我这里 master 和 node 节点的 ip 都是 10.6.215.xxx)
# 在 /etc 创建个 exports 文件 vim /etc/exports
将下面内容写入到文件里
/root/data/nfs 10.6.215.0/24(rw,no_root_squash)
- rw :表示读写模式
- no_root_squash :登入 NFS 主机使用分享目录的使用者,如果是 root 的话,那么对于这个分享的目录来说,他就具有 root 的权限
启动 nfs 服务
systemctl restart nfs
接下来,要在每 个node 节点上都安装下 nfs,这样的目的是为了 node 节点可以驱动 nfs 设备。只安装就可以了,不需要启动 nfs 服务
# 在所有 node 节点上安装 nfs,不需要启动 yum install nfs-utils -y
接下来,就可以编写 pod 的配置文件了,创建 volume-nfs.yaml,内容如下
apiVersion: v1 kind: Pod # 类型为 pod metadata: name: volume-nfs # pod 的名称 namespace: zouzou spec: containers: - name: nginx image: nginx:1.14 ports: - containerPort: 80 # 暴露容器里面的 80 端口 volumeMounts: # 挂载 - name: logs-volume # 名字要和 volumes 里的一致 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: # nfs 类型 server: 10.6.215.215 # nfs 服务器地址 path: /root/data/nfs # 共享文件路径
创建 pod
# 创建 pod [root@dce-10-6-215-215 nfs]# kubectl apply -f volume-nfs.yaml pod/volume-nfs created
查看 pod
# 查看 pod,pod 的 ip 为 172.29.35.63 [root@dce-10-6-215-215 nfs]# kubectl get pods volume-nfs -n zouzou -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES volume-nfs 2/2 Running 0 98s 172.29.35.63 dce-10-6-215-200 <none> <none>
查看 nfs 服务器上的共享目录,发现已经有文件了
查看下 access.log 文件里的内容
tail -f access.log
刚开始是没有的,用 pod 的 ip 访问下 nginx
curl 172.29.35.63:80