k8s 文件持久化

容器中的文件是临时存储的,重启容器数据会丢失。 在 docker 里面,我们会用 volumne, 不过 docker中 volume是磁盘上或者理你个容器内的一个目录。 后来 docker才支持对基于本地磁盘的 volumne的生存期进行管理。 虽然 docker 提供 volumne 的功能,但是目前功能非常邮箱,每个容器只允许一个volumne 驱动程序,并未无法将参数传给卷。

而 k8s 卷有明确的什么周期,【与包裹它的 pod相同】。 卷比 Pod中运行的任何容器存活期长,在容器重新启动时候数据会得到保留。 当然,当一个 pod不存在时候,卷也会不再存在。 k8s 可以支持许多类型的卷, Pod也能同时使用任意数量的卷。

使用卷时,Pod什么中需要提供卷类型 (.spec.volumes字段) 和卷挂载位置 (.spec.containers.volumneMounts字段)。

k8s 提供众多的volumne 类型,包括 emptyDir, hostPath、nfs,glusterfs,cephfs、ceph。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
apiVersion:V1
kind: Pod
meadata:
    name: myapp
    labels:
      name: myapp
spec:
    containers:
    - name: test-container:
      image: nginx
      volumeMounts:
      - mountPath: /test-nginx
        name: myHostPath
    volumnes:
    - name: myhostPath:
      hostPath:
        path: /tmp/nginx
        type: DirectoryOrCreate
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 在宿主机上创建 /tmp/nginx 目录
mkdir /tmp/nginx -p
k create -f hostPath.yaml

# 进入k8s 文件
k exec -it myapp sh
cd test-nginx
# 将文件写入 a.txt
echo "aa" >> a.txt
# 退出 k8s 容器
exit

cd /tmp/nginx
# 查看宿主机文件
cat a.txt

挂载 NFS卷

很多应用中,集群内部有一个统一的地方存储文件,图片,日志等,使用hostPath不灵活,因为你要指定 host地址 挂载 NFS卷

  1. 在 master和 worker node 安装 nfs服务:

master node 装 NFS ,worker node 装 nfs服务,文件可能是上传到 master节点上。

1
yum install -y nfs-utils
1
2
3
4
5
6
spec:
  volumes:
    -name: test-nfs
    nfs:
      server: master
      path: /nfsdata

PVC原理

pvc原理