当前位置: 首页 > news >正文

k8s之存储篇---数据卷-挂载

挂载是指将定义在 Pod 中的数据卷关联到容器,同一个 Pod 中的同一个数据卷可以被挂载到该 Pod 中的多个容器上。

数据卷内子路径

有时候我们需要在同一个 Pod 的不同容器间共享数据卷。使用 volumeMounts.subPath 属性,可以使容器在挂载数据卷时指向数据卷内部的一个子路径,而不是直接指向数据卷的根路径。

下面的例子中,一个 LAMP(Linux Apache Mysql PHP)应用的 Pod 使用了一个共享数据卷,HTML 内容映射到数据卷的 html 目录,数据库的内容映射到了 mysql 目录:

apiVersion: v1
kind: Pod
metadata:name: my-lamp-site
spec:containers:- name: mysqlimage: mysqlenv:- name: MYSQL_ROOT_PASSWORDvalue: "rootpasswd"volumeMounts:- mountPath: /var/lib/mysqlname: site-datasubPath: mysqlreadOnly: false- name: phpimage: php:7.0-apachevolumeMounts:- mountPath: /var/www/htmlname: site-datasubPath: htmlreadOnly: falsevolumes:- name: site-datapersistentVolumeClaim:claimName: my-lamp-site-data
  1. apiVersion: v1: 这指定了使用的 Kubernetes API 版本,表示该配置文件遵循的 Kubernetes API 的版本。
  2. kind: Pod: 这表明我们正在定义一个 Pod 对象。
  3. metadata: 这是 Pod 对象的元数据部分,包含关于该 Pod 的信息,比如名称(name)。
  4. name: my-lamp-site: 这是 Pod 对象的名称。在这个例子中,它命名为 “my-lamp-site”。
  5. spec: 这是 Pod 对象的规范部分,定义了实际的 Pod 规则。
  6. containers: 这是一个包含容器定义的列表。
    • name: mysql: 这是第一个容器的名称。
      • image: mysql: 这指定了该容器要使用的 Docker 镜像,这里使用的是 MySQL 官方镜像。
      • env: 这是一个环境变量列表。
        • name: MYSQL_ROOT_PASSWORD: 这是一个环境变量的名称,表示 MySQL 的 root 用户的密码。
        • value: "rootpasswd": 这是 MYSQL_ROOT_PASSWORD 环境变量的值,设置为 “rootpasswd”。
      • volumeMounts: 这是一个挂载卷的列表。
        • mountPath: /var/lib/mysql: 这是卷要挂载到容器中的路径,表示 MySQL 数据库文件将被存储在这个路径下。
        • name: site-data: 这是要挂载的卷的名称,与下面 volumes 中的定义对应。
        • subPath: mysql: 这是卷在容器中挂载的子路径,表示 MySQL 数据将存储在 /var/lib/mysql/mysql 路径下。
        • readOnly: false: 这表示卷是否以只读模式挂载。这里设置为 false,表示 MySQL 容器可以对卷进行读写操作。
    • name: php: 这是第二个容器的名称。
      • image: php:7.0-apache: 这指定了该容器要使用的 Docker 镜像,这里使用的是带有 Apache 的 PHP 7.0 镜像。
      • volumeMounts: 这是一个挂载卷的列表。
        • mountPath: /var/www/html: 这是卷要挂载到容器中的路径,表示 PHP 代码将被存储在这个路径下。
        • name: site-data: 这是要挂载的卷的名称,与下面 volumes 中的定义对应。
        • subPath: html: 这是卷在容器中挂载的子路径,表示 PHP 代码将存储在 /var/www/html/html 路径下。
        • readOnly: false: 这表示卷是否以只读模式挂载。这里设置为 false,表示 PHP 容器可以对卷进行读写操作。
  7. volumes: 这是一个包含持久化存储卷定义的列表。
    • name: site-data: 这是持久化存储卷的名称,与上面 containers 中的 volumeMounts 对应。
      • persistentVolumeClaim: 这是一个持久卷声明(PersistentVolumeClaim)的定义,它将请求一个已经存在的持久化存储资源,该资源必须事先在 Kubernetes 中定义。
        • claimName: my-lamp-site-data: 这是持久卷声明的名称,它表示这个 Pod 请求使用名称为 “my-lamp-site-data” 的持久化存储卷。

该 Pod 使用 subPathExpr 在 hostPath 数据卷 /var/log/pods 中创建了一个目录 pod1(该参数来自于Pod的名字)。此时,宿主机目录 /var/log/pods/pod1 挂载到了容器的 /logs 路径:

apiVersion: v1
kind: Pod
metadata:name: pod1
spec:containers:- name: container1env:- name: POD_NAMEvalueFrom:fieldRef:apiVersion: v1fieldPath: metadata.nameimage: busyboxcommand: [ "sh", "-c", "while [ true ]; do echo 'Hello'; sleep 10; done | tee -a /logs/hello.txt" ]volumeMounts:- name: workdir1mountPath: /logssubPathExpr: $(POD_NAME)readOnly: falserestartPolicy: Nevervolumes:- name: workdir1hostPath:path: /var/log/pods

容器内路径

mountPath 数据卷被挂载到容器的路径,不能包含 :

权限

容器对挂载的数据卷是否具备读写权限,如果 readOnlytrue,则只读,否则可以读写(为 false 或者不指定)。默认为 false

挂载传播

数据卷的挂载传播(Mount Propagation)由 Pod 的 spec.containers[*].volumeMounts.mountPropagation 字段控制。可选的取值有:

  • None: 默认值。在数据卷被挂载到容器之后,此数据卷不会再接受任何后续宿主机或其他容器挂载到该数据卷对应目录下的子目录的挂载。同样的,在容器中向该数据卷对应目录挂载新目录时,宿主机也不能看到。对应 Linux 的 private mount propagation 选项 Linux内核文档(opens new window)
  • HostToContainer:在数据卷被挂载到容器之后,宿主机向该数据卷对应目录添加挂载时,对容器是可见的。对应 Linux 的 rslave mount propagation 选项 Linux内核文档(opens new window)
  • Bidirectional:在数据卷被挂载到容器之后,宿主机向该数据卷对应目录添加挂载时,对容器是可见的;同时,从容器中向该数据卷创建挂载,同样也对宿主机可见。对应 Linux 的 rshared mount propagation 选项 Linux内核文档

Bidirectional mount propagation 选项隐藏风险。如果在容器内进行不合适的挂载,可能影响宿主机的操作系统正常执行,因此,只有 privileged 容器才可以使用该选项。使用此选项时,建议对 Linux 内核的行为有所熟悉。此外,使用 Bidirectional 选项时,任何由 Pod 中容器在对应数据卷目录创建的挂载必须在容器终止时销毁(umounted)。

额外配置

在部分系统中(CoreOS、RedHat/Centos、Ubuntu),Docker 的 mount share 选项必须事先配置好,步骤如下:

  • 编辑 Docker 的 systemd service 文件,将 MountFlags 设定如下:

    MountFlags=shared
    

    或者移除 MountFlags=slave

  • 重启 Docker 守护进程:

    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
http://www.lryc.cn/news/151583.html

相关文章:

  • 无涯教程-JavaScript - TDIST函数
  • IP子网的划分
  • 弹性盒子的使用
  • 软件测试/测试开发丨Selenium 网页frame与多窗口处理
  • MySQL高阶语句(三)
  • 链表OJ练习(2)
  • ssh常用操作
  • 从AD迁移至AAD,看体外诊断领军企业如何用网络准入方案提升内网安全基线
  • Flutter系列文章-Flutter在实际业务中的应用
  • FPGA | Verilog仿真VHDL文件
  • 微服务--Gatway:网关
  • Django传递dataframe对象到前端网页
  • iOS swift5 弹出提示文字(停留1~2s)XHToastSwift
  • Spring Bean 的生命周期,如何被管理的
  • MATLAB算法实战应用案例精讲-【概念篇】量子机器学习
  • 【kubernetes】Argo Rollouts -- k8s下的自动化蓝绿部署
  • vue Cesium接入在线地图
  • OBS Studio 30.0 承诺在 Linux 上支持英特尔 QSV,为 DeckLink 提供 HDR 回放功能
  • springboot整合SpringSecurity
  • 最近在搭建ELK日志平台时,logstash报错JSON parse error
  • 某次护网红队getshell的经历
  • C#实现日期选择器、显示当地时间、跑马灯等功能
  • 如何让看书变听书?
  • pytorch异常——loss异常,不断增大,并且loss出现inf
  • Lua学习(一)
  • Python:列表推导式
  • 应急三维电子沙盘数字孪生系统
  • LeetCode每日一题:1654. 到家的最少跳跃次数(2023.8.30 C++)
  • 数据结构例题代码及其讲解-栈与队列
  • 【Spark】Pyspark RDD