k8s数据管理

| 标签 kubernetes  volume  浏览次数: -

Volume

Volume的生命周期独立于容器,Pod的容器可能被销毁和重建,但Volume会被保留

emptyDir

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

emptyDir Volume的生命周期和Pod一致。

模拟场景

apiVersion: v1
kind: Pod
metadata:
  name: producer-consumer
spec:
  containers:
  - image: busybox
    name: producer
    volumeMounts:
    - mountPath: /producer_dir  # mount到指定目录
      name: shared-volume
    args:
    - /bin/sh
    - -c
    - echo "hello world" > /producer_dir/hello; sleep 30000
  - image: busybox
    name: consumer
    volumeMounts:
    - mountPath: /consumer_dir  # mount到指定目录
      name: shared-volume
    args:
    - /bin/sh
    - -c
    - cat /consumer_dir/hello; sleep 30000
  volumes:
  - name: shared-volume  # 定义 `emptyDir` 类型的 Volume
    emptyDir: {}

  • 创建Pod
ubuntu2@root  ~ kubectl apply -f emptyDir.yml
pod/producer-consumer created
ubuntu2@root  ~ kubectl get pod
NAME                READY   STATUS    RESTARTS   AGE
producer-consumer   2/2     Running   0          79s
ubuntu2@root  ~ kubectl logs producer-consumer consumer
hello world
ubuntu2@root  ~

小结

emptyDir 是 Host 上创建的临时目录,其优点是能够方便地为 Pod 中的容器提供共享存储,不需要额外的配置。但它不具备持久性,如果 Pod 不存在了,emptyDir 也就没有了。根据这个特性,emptyDir 特别适合 Pod 中的容器需要临时共享存储空间的场景

hostPath Volume

hostPath Volume 的作用是将 Docker Host 文件系统中已经存在的目录 mount 给 Pod 的容器。大部分应用都不会使用 hostPath Volume,因为这实际上增加了 Pod 与节点的耦合,限制了 Pod 的使用。不过那些需要访问 Kubernetes 或 Docker 内部数据(配置文件和二进制库)的应用则需要使用 hostPath。

PV & PVC

PersistentVolume (PV) 是外部存储系统中的一块存储空间,由管理员创建和维护。与 Volume 一样,PV 具有持久性,生命周期独立于 Pod。

PersistentVolumeClaim (PVC) 是对 PV 的申请 (Claim)。PVC 通常由普通用户创建和维护。需要为 Pod 分配存储资源时,用户可以创建一个 PVC,指明存储资源的容量大小和访问模式(比如只读)等信息,Kubernetes 会查找并提供满足条件的 PV。

NFS PersistentVolume

  • ubuntu1 安装nfs
sudo apt-get install -y nfs-kernel-server

mkdir -p /tmp/nfsdata/pv1

echo "/tmp/nfsdata   *(rw,sync,no_subtree_check,no_root_squash)" >> /etc/exports

/etc/init.d/rpcbind restart

/etc/init.d/nfs-kernel-server restart

# 查看 RPC 服务的注册状况
rpcinfo -p localhost

# showmount测试
showmount -e localhost
  • 编写 nfs-pv1.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mypv1
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: nfs
  nfs:
    path: /tmp/nfsdata/pv1
    server: 192.168.1.6

  • 创建pv
ubuntu2@root  ~ kubectl apply -f nfs-pv1.yml
persistentvolume/mypv1 created
ubuntu2@root  ~ kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
mypv1   1Gi        RWO            Recycle          Available           nfs                     56s
  • 编写 nfs-pvc1.yml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mypvc1
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: nfs

  • 创建pvc
ubuntu2@root  ~ kubectl apply -f nfs-pvc1.yml
persistentvolumeclaim/mypvc1 created
ubuntu2@root  ~ kubectl get pvc
NAME     STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mypvc1   Bound    mypv1    1Gi        RWO            nfs            7s
  • Pod使用存储
kind: Pod
apiVersion: v1
metadata:
  name: mypod1
spec:
  containers:
    - name: mypod1
      image: busybox
      args:
      - /bin/sh
      - -c
      - sleep 30000
      volumeMounts:
      - mountPath: "/mydata"
        name: mydata
  volumes:
    - name: mydata
      persistentVolumeClaim:
        claimName: mypvc1

上一篇 kubernetes service     下一篇 开发环境搭建
目录导航