12-存储卷

Overview

根据应用是否需要持久存储数据以及某一次请求与当前请求是否具有关联性。

可以分为四类应用:

  1. 有状态有持久存储

  2. 有状态无持久存储

  3. 无状态无持久存储

  4. 无状态有持久存储

容器有生命周期,意味着数据若存放在容器自有名称中,随着pod的终结数据会被销毁。为此,需要将数据存放在pod自有的文件系统之外的地方。

为了能够将数据安全地持久化存储,则需要存在一个脱离节点的存储设备来存放数据,该存储设备应该被共享。

存储卷并不属于容器, 而属于pod。

docker image ls查看镜像。

pod为什么能拥有存储卷和命名空间,pod底层有一个基础容器pause。在pod中运行的主容器是共享pause的命名空间的,属于基础架构容器。容器挂载存储卷实际是挂载pause的存储卷的。

容器的存储卷挂载宿主机的存储卷,宿主机的存储卷挂载外部的存储卷。 3级存储关系。

kubernetes 的存储卷

  1. emptyDir 临时目录, 随着pod删除emptyDir也随之删除,当做缓存用。

  2. hostPath 本地目录, 也不是持久性的存储。

  3. SAN,NAS脱离主机节点的存储设备, NAS网络存储, SAN存储区域网络。 NAS中常见的协议nfs, cifs, http. SAN常见的协议, iSCSI.

  4. 分布式存储: glusterfs, rbd(ceph的块存储), cephfs

  5. 云存储: EBS(弹性块存储), Azure Disk

kubernetes 使用存储卷

清单1

apiVersion: v1
kind: Pod
metadata:
    name: pod-demo
    namespace: default
    labels:
        app: myapp
        tier: frontend
    annotations:
        sky.com/create-by: "cluster admin"
spec:
    containers:
    -   name: myapp
        image: ikubernetes/myapp:v1
        ports:
        -   name: http
            containerPort: 80
        -   name: https
            containerPort: 443
    volumeMounts:   
    -   name: html
        MountPath: /data/web/html/              # 挂载点
    -   name: busybox
        image: busybox:latest
        imagePullPolicy: IfNotPresent
        volumeMounts:
        -   name: html
            mountPath: /data/                   # 挂载点
        command:
        -   "/bin/sh"
        -   "-c"
        -   "sleep 7200"
    volumes:
    -   name:   html                            # 配置的卷
        emptyDir:   {}

清单2

第一个主容器向web端提供服务,第二个pod生成新的网页。

apiVersion: v1
kind: Pod
metadata: 
    name:   pod-demo
    namespace:  default
    labels:
        app:    myapp
        tier:   frontend
    annotations:
        sky.com/created.by: "cluster admin"
spec:
    containers:
    -   name: myapp
        image: ikubernetes/myapp:v1
        imagePullPolicy: IfNotPresent
        ports:
        -   name: http
            containerPort: 80
        volumeMounts:
        -   name: html
            mountPath: /usr/share/nginx/html/
        -   name: busybox
            image:  busybox:latest
            imagePullPolicy: IfNotPresent
            volumeMounts:
            -   name: html
                mountPath:  /data/
            command: ['/bin/sh']
            args: ['-c', 'while true; do echo $(date) >> /data/index.html; sleep 2; done']
        volumes:
            - name: html
              empdir: {}

示例应用

  1. 示例1, 查看kubernetes支持哪几种方式的存储。kubectl explain pods.spec.volumes

  2. 示例2, 创建清单1的示例, kubectl apply -f pod-vol-demo.yaml

  3. 示例3, 连接pod-demo容器, kubectl exec -it pod-demo -c busybox -- /bin/sh

ls
mount #
echo $(date) >> /data/index.html

  1. 示例4, 连接pod-demo容器, kubectl exec -it pod-demo -c myapp -- /bin/sh

ls /data/web/html # 检查是否是共享的文件

  1. 示例5, 创建清单2的示例, kubectl apply -f pod-vol-demo.yaml
发布了21 篇原创文章 · 获赞 0 · 访问量 2611

猜你喜欢

转载自blog.csdn.net/u012720518/article/details/105449186
今日推荐