k8s学习-数据管理

在Docker中我们知道,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中,常用的手段就是Volume数据卷。在K8S中,也提供了存储模型Volume,支持我们将应用中的数据持久化存储到容器中。

(1)学习Volume,以及Kubernetes如何通过Volume为集群中的容器提供存储;

(2)实践几种常用的Volume类型并理解它们各自的应用场景;

(3)学习Kubernetes如何通过 PersistentVolume和PersistentVolumeClaim分离集群管理员与集群用户的职责,并实践Volume的静态供给和动态供给。

1.1 使用K8S Volume

(1)emptyDir

作为K8S最基础的Volume类型,emptyDir提供了最基础的持久化方案,但是这个方案不怎么好。因为,emptyDir对于Pod来说并非持久的(它对于容器来说是持久化的),因为当Pod从节点删除时,Volume的内容也会被删除。但如果只是容器被销毁而Pod还在,则Volume不会受影响。

换句话说:emptyDirVolume的生命周期与Pod一致。鉴于此特性,不建议在实际中使用此类型Volume。

vi volume-demo.yaml

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: producer-consumer
spec:
  containers:
    - image: busybox
      name: producer
      volumeMounts:
        - mountPath: /producer_dir
          name: shared-volume
      args:
        - "/bin/sh"
        - "-c"
        - "echo 'hello world' > /producer_dir/hello; sleep 30000"
    - image: busybox
      name: consumer
      volumeMounts:
        - mountPath: /consumer_dir
          name: shared-volume
      args:
        - "/bin/sh"
        - "-c"
        - "cat /consumer_dir/hello; sleep 30000"
  volumes:
    - name: shared-volume
      emptyDir: {}

这里我们模拟了⼀个producer-consumer场景。Pod有两个容器producer和consumer,它们共享⼀个Volume。producer负责往Volume中写数据,consumer则是从Volume读取数据。

①文件最底部volumes定义了⼀个emptyDir类型的Volume shared-volume。

②producer容器将shared-volumemount到/producer_dir目录。

③producer通过echo将数据写到文件hello里。

④consumer容器将shared-volumemount到/consumer_dir目录。

⑤consumer通过cat从文件hello读数据。

bash 复制代码
[root@k8s-master ~]# vi volume-demo.yaml
[root@k8s-master ~]#  kubectl apply -f volume-demo.yaml
pod/producer-consumer created
[root@k8s-master ~]# kubectl get pod
NAME                                READY   STATUS              RESTARTS   AGE
producer-consumer                   0/2     ContainerCreating   0          5s
[root@k8s-master ~]# kubectl logs producer-consumer consumer
hello world

kubectl logs显示容器consumer成功读到了producer写入的数据,验证了两个容器共享emptyDir Volume。

emptyDir是Host上创建的临时目录,其优点是能够方便地为Pod中的容器提供共享存储,不需要额外的配置。

1.2 hostPath

相对于emptyDir,hotPath则克服了其生命周期的弱点,如果Pod被销毁,hostPath对应的目录还是会被保留。不过,如果一旦Host崩溃,hostPath也就无法访问了。因为,hostPath是将DockerHost文件系统中已经存在的目录mount给Pod的容器,所以会依赖于Host。

大部分应用都不会使用hostPath Volume,因为这实际上增加了Pod与节点的耦合,限制了Pod的使用。不过那些需要访问Kubernetes或Docker内部数据(配置文件和⼆进制库)的应用则需要使用hostPath。

1.3 外部Storage Provider

如果Kubernetes部署在诸如AWS、GCE、Azure等公有云上,可以直接使用云硬盘作为Volume。下面给出⼀个AWSElasticBlockStore的例子。

vi volume-demo1.yaml

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: using-ebs
spec:
  containers:
    - image: busybox
      name: using-ebs
      volumeMounts:
        - mountPath: /test-ebs
          name: ebs-volume
  volumes:
    - name: ebs-volume
      awsElasticBlockStore:
        volumeID: <volume-id>  # Replace <volume-id> with the actual volume ID
        fsType: ext4

Kubernetes Volume也可以使用主流的分布式存储,比如Ceph、GlusterFS等。

1.4 PersistentVolume &PersistentVolumeClaim

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

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

与K8S Volume一样,K8S PersistentVolume也支持多种类型的存储,比如NFS、AWS EBS、Ceph等等。

1.5 NFS PV的使用

相关推荐
lichenyang4533 天前
Docker 学习笔记(四):Dockerfile,把项目打成自己的镜像
docker·容器
lichenyang4533 天前
Docker 学习笔记(三):Docker 网络、bridge、子网和容器互通
docker·容器
lichenyang4533 天前
Docker 学习笔记(二):docker run 的参数到底在控制什么?
docker·容器
运维开发故事6 天前
基于 Arthas 的多集群在线诊断系统设计与实现
kubernetes
Patrick_Wilson8 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
探索云原生8 天前
K8s 1.36 这个 GA 特性,把 initContainer 拉模型的 hack 干掉了
ai·云原生·kubernetes
云恒要逆袭8 天前
运行你的第一个Docker容器
后端·docker·容器
Java之美9 天前
一次k8s升级引发的DevicePlugin注册失败
云原生·kubernetes
程序员老赵10 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程