5.3. 使用卷来持久保留容器数据
容器中的文件是临时的。因此,当容器崩溃或停止时,其数据就会丢失。您可以使用卷来持久保留 pod 中容器使用的数据。卷是在 pod 的生命周期内保存数据的一个目录,可供 Pod 中的容器访问。
5.3.1. 了解卷
卷是挂载的文件系统,供 pod 及其容器使用,可以通过多个主机上本地或网络附加存储端点来支持。默认情况下,容器不具持久性;重启之后,其中的内容会被清除。
为确保卷上的文件系统不包含任何错误,并在出现错误时尽可能进行修复,OpenShift Container Platform 在调用 mount
实用程序之前会先调用 fsck
。在添加卷或更新现有卷时会出现这种情况。
最简单的卷类型是 emptyDir
,这是单一机器上的一个临时目录。管理员也可以允许您请求自动附加到 pod 的持久性卷。
如果集群管理员启用了 FSGroup 参数,则 emptyDir
卷存储可能会受到基于 pod FSGroup 的配额的限制。
5.3.2. 使用 OpenShift Container Platform CLI 操作卷
您可以使用 CLI 命令 oc set volume
,为任何使用 pod 模板的对象(如复制控制器或 DeploymentConfig)添加和移除卷和卷挂载。您还可以列出 pod 中的卷,或列出使用 pod 模板的任何对象。
oc set volume
命令使用以下通用语法:
$ oc set volume <object_selection> <operation> <mandatory_parameters> <options>
- 对象选择
-
在
oc set volume
命令中为object_seletion
指定以下值之一:
语法 | 描述 | 示例 |
---|---|---|
|
选择类型为 |
|
|
选择类型为 |
|
|
选择与给定标签选择器匹配且类型为 |
|
|
选择类型为 |
|
| 用于编辑资源的文件名、目录或文件 URL。 |
|
- 操作
-
为
oc set volume
命令中的operation
指定--add
、--remove
或--list
。 - 必要参数
-
所有
<mandatory_parameters>
都特定于所选操作,并在后续小节中阐述。 - 选项
-
所有
<options>
都特定于所选操作,并在后续小节阐述。
5.3.3. 列出 pod 中的卷和卷挂载
您可以列出 pod 或 pod 模板中的卷和卷挂载:
流程
列出卷:
$ oc set volume <object_type>/<name> --list [options]
列出卷支持的选项:
选项 | 描述 | 默认 |
---|---|---|
| 卷的名称。 | |
|
按名称选择容器。它还可以使用通配符 |
|
例如:
列出 pod p1 的所有卷:
$ oc set volume pod/p1 --list
列出在所有 DeploymentConfig 中定义的卷 v1:
$ oc set volume dc --all --name=v1
5.3.4. 将卷添加到 pod
您可以将卷和卷挂载添加到 pod。
流程
将卷和/或卷挂载添加到 pod 模板中:
$ oc set volume <object_type>/<name> --add [options]
选项 | 描述 | 默认 |
---|---|---|
| 卷的名称。 | 若未指定,则自动生成。 |
|
卷源的名称。支持的值有 |
|
|
按名称选择容器。它还可以使用通配符 |
|
| 所选容器内的挂载路径。 | |
|
主机路径。 | |
|
secret 的名称。 | |
|
configmap 的名称。 | |
|
持久性卷声明的名称。 | |
|
以 JSON 字符串表示的卷源详情。如果 | |
|
显示修改后的对象,而不在服务器上更新它们。支持的值有 | |
| 输出给定版本的修改后对象。 |
|
例如:
将新卷源 emptyDir 添加到 DeploymentConfig 注册表 中:
$ oc set volume dc/registry --add
为复制控制器 r1 添加含有 secret secret1 的卷 v1 并挂载到容器中的 /data:
$ oc set volume rc/r1 --add --name=v1 --type=secret --secret-name='secret1' --mount-path=/data
使用声明名称 pvc1 将现有持久性卷 v1 添加到磁盘上的部署配置 dc.json,将该卷挂载到容器 c1 中的 /data 并更新服务器上的 DeploymentConfig:
$ oc set volume -f dc.json --add --name=v1 --type=persistentVolumeClaim \ --claim-name=pvc1 --mount-path=/data --containers=c1
为所有复制控制器添加基于 Git 存储库 https://github.com/namespace1/project1 且具有修订 5125c45f9f563 的卷 v1:
$ oc set volume rc --all --add --name=v1 \ --source='{"gitRepo": { "repository": "https://github.com/namespace1/project1", "revision": "5125c45f9f563" }}'
5.3.5. 更新 pod 中的卷和卷挂载
您可以修改 pod 中的卷和卷挂载。
流程
使用 --overwrite
选项更新现有卷:
$ oc set volume <object_type>/<name> --add --overwrite [options]
例如:
使用现有持久性卷声明 pvc1 替换复制控制器 r1 的现有卷 v1:
$ oc set volume rc/r1 --add --overwrite --name=v1 --type=persistentVolumeClaim --claim-name=pvc1
将卷 v1 的 DeploymentConfig d1 挂载点更改为 /opt:
$ oc set volume dc/d1 --add --overwrite --name=v1 --mount-path=/opt
5.3.6. 从 pod 中删除卷和卷挂载
您可以从 pod 中移除卷或卷挂载。
流程
从 pod 模板中移除卷:
$ oc set volume <object_type>/<name> --remove [options]
选项 | 描述 | 默认 |
---|---|---|
| 卷的名称。 | |
|
按名称选择容器。它还可以使用通配符 |
|
| 指定您想要一次性移除多个卷。 | |
|
显示修改后的对象,而不在服务器上更新它们。支持的值有 | |
| 输出给定版本的修改后对象。 |
|
例如:
从 DeploymentConfig d1 中移除卷 v1:
$ oc set volume dc/d1 --remove --name=v1
从 DeploymentConfig d1 的容器 c1 卸载卷 v1,并在卷 v1 未被 d1 上的任何容器引用时将它移除:
$ oc set volume dc/d1 --remove --name=v1 --containers=c1
移除复制控制器 r1 的所有卷:
$ oc set volume rc/r1 --remove --confirm
5.3.7. 配置卷以在 pod 中用于多种用途
您可以使用 volumeMounts.subPath
属性来指定卷中的 subPath
而非卷的根目录,将卷配置为允许在一个 pod 中多处使用这个卷。
流程
运行
oc rsh
命令来查看卷中的文件列表:$ oc rsh <pod> sh-4.2$ ls /path/to/volume/subpath/mount example_file1 example_file2 example_file3
指定
subPath
:subPath 用法示例
apiVersion: v1 kind: Pod metadata: name: my-site spec: containers: - name: mysql image: mysql volumeMounts: - mountPath: /var/lib/mysql name: site-data subPath: mysql 1 - name: php image: php volumeMounts: - mountPath: /var/www/html name: site-data subPath: html 2 volumes: - name: site-data persistentVolumeClaim: claimName: my-site-data