Kubernetes-Volume

Volume

Container 中的文件在磁盘上是临时存放的,这给 Container 中运行的较重要的应用 程序带来一些问题。问题之一是当容器崩溃时文件丢失。kubelet 会重新启动容器, 但容器会以干净的状态重启。 第二个问题会在同一 Pod 中运行多个容器并共享文件时出现。 Kubernetes 卷(Volume)这一抽象概念能够解决这两个问题。

NFS

安装nfs,设置挂载路径

yum -y install nfs-utils

cat >>/etc/exports<<-EOF
/data/nfs *(rw,sync,no_root_squash)
EOF

在k8s集群部署引用nfs持久网络存储

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.19
        imagePullPolicy: Always
        name: nginx
        volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: wwwroot
          ports:
          - containerPort: 80
      volumes:
      - name: wwwroot
        nfs:
          server: 192.168.2.241
          path: /nfs/data
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30

hostPath

hostPath卷可将节点上的文件或目录挂载到Pod上,用于Pod自定义日志输出或访问Docker内部的容器等。

常用的type:

  • type为空白字符串: 默认选项,意味着挂载hostPath卷之前不会执行任何检查。
  • DirectroyOrCreate: 如果给定的path不存在任何东西,那么将根据需要创建一个权限为0755的空白目录,和kublet具有相同的组和权限。
  • Directory:目录必须存在于给定的路径下。
  • FileOrCreate: 如果给定的路径不存储任何东西,则会根据需要创建一个空白文件,权限设置为0644,和kubelet具有相同的组合权限。
  • File:文件,必须存在于给定的路径下。
  • Socket:UNIX套接字,必须存在于给定的路径下。
  • CharDevice:字符设备,必须存在于给定的路径下。
  • BlockDevice:块设备,必须存在于给定的路径下。
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.19
        imagePullPolicy: Always
        name: nginx
        volumeMounts:
        - mountPath: /mnt
          name: hosts
      volumes:
      - name: hosts
        hostPath:
          path: /etc/hosts
          type: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30

emptyDir

当 Pod 分派到某个 Node 上时,emptyDir 卷会被创建,并且在 Pod 在该节点上运行期间,卷一直存在。 就像其名称表示的那样,卷最初是空的。 尽管 Pod 中的容器挂载 emptyDir 卷的路径可能相同也可能不同,这些容器都可以读写 emptyDir 卷中相同的文件。 当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会被永久删除。

apiVersion: v1
kind: Pod
metadata:
  name: web
spec:
  containers:
  - image: nginx:1.19
    name: nginx
    volumeMounts:
    - mountPath: /opt
      name: share-volume
  - image: nginx:1.19
    name: nginx2
    command:
    - sh
    - -c
    - sleep 3600
    volumeMounts:
    - mountPath: /mnt
      name: share-volume
  volumes:
  - name: share-volume
    emptyDir: {}

当一个pod中运行两个容器,将/opt目录共享,在任一容器的opt目录下创建文件,另一个容器的opt目录下也能看见

posted @ 2021-09-02 16:07  Cai_HL  阅读(21)  评论(0编辑  收藏  举报
>