From 23e5c44cf9e1bf823abd0c11cca07fc3b5eb0f9d Mon Sep 17 00:00:00 2001 From: Song Shukun Date: Wed, 16 Mar 2022 02:27:11 +0900 Subject: [PATCH 1/3] [zh] Update storage pages in concepts --- .../concepts/storage/persistent-volumes.md | 36 +- content/zh/docs/concepts/storage/volumes.md | 377 +++++++----------- 2 files changed, 169 insertions(+), 244 deletions(-) diff --git a/content/zh/docs/concepts/storage/persistent-volumes.md b/content/zh/docs/concepts/storage/persistent-volumes.md index 34341afd97..fdf9e6ee50 100644 --- a/content/zh/docs/concepts/storage/persistent-volumes.md +++ b/content/zh/docs/concepts/storage/persistent-volumes.md @@ -666,7 +666,7 @@ size that is within the capacity limits of underlying storage provider. You can @@ -810,7 +810,7 @@ Helper programs relating to the volume type may be required for consumption of a @@ -818,9 +818,9 @@ Currently, storage size is the only resource that can be set or requested. Futu 一般而言,每个 PV 卷都有确定的存储容量。 容量属性是使用 PV 对象的 `capacity` 属性来设置的。 -参考 Kubernetes -[资源模型(Resource Model)](https://git.k8s.io/community/contributors/design-proposals/scheduling/resources.md) -设计提案,了解 `capacity` 字段可以接受的单位。 +参考词汇表中的 +[量纲(Quantity)](/zh/docs/reference/glossary/?all=true#term-quantity) +词条,了解 `capacity` 字段可以接受的单位。 目前,存储大小是可以设置和请求的唯一资源。 未来可能会包含 IOPS、吞吐量等属性。 @@ -1038,19 +1038,19 @@ The following volume types support mount options: --> 以下卷类型支持挂载选项: -* AWSElasticBlockStore -* AzureDisk -* AzureFile -* CephFS -* Cinder (OpenStack 块存储) -* GCEPersistentDisk -* Glusterfs -* NFS -* Quobyte 卷 -* RBD (Ceph 块设备) -* StorageOS -* VsphereVolume -* iSCSI +* `awsElasticBlockStore` +* `azureDisk` +* `azureFile` +* `cephfs` +* `cinder` (**已弃用**于 v1.18) +* `gcePersistentDisk` +* `glusterfs` +* `iscsi` +* `nfs` +* `quobyte` (**已弃用**于 v1.22) +* `rbd` +* `storageos` (**已弃用**于 v1.22) +* `vsphereVolume` 阅读本文前建议你熟悉一下 [Pods](/zh/docs/concepts/workloads/pods)。 @@ -59,8 +59,8 @@ Docker 提供卷驱动程序,但是其功能非常有限。 Kubernetes supports many types of volumes. A {{< glossary_tooltip term_id="pod" text="Pod" >}} can use any number of volume types simultaneously. Ephemeral volume types have a lifetime of a pod, but persistent volumes exist beyond -the lifetime of a pod. When a pod ceases to exist, Kubernetes destroys ephemeral volumes; -however, Kubernetes does not destroy persistent volumes. +the lifetime of a pod. When a pod ceases to exist, Kubernetes destroys ephemeral volumes; +however, Kubernetes does not destroy persistent volumes. For any kind of volume in a given pod, data is preserved across container restarts. --> Kubernetes 支持很多类型的卷。 @@ -82,21 +82,36 @@ volume type used. 使用卷时, 在 `.spec.volumes` 字段中设置为 Pod 提供的卷,并在 `.spec.containers[*].volumeMounts` 字段中声明卷在容器中的挂载位置。 -容器中的进程看到的是由它们的 Docker 镜像和卷组成的文件系统视图。 -[Docker 镜像](https://docs.docker.com/userguide/dockerimages/) -位于文件系统层次结构的根部。各个卷则挂载在镜像内的指定路径上。 -卷不能挂载到其他卷之上,也不能与其他卷有硬链接。 +容器中的进程看到的文件系统视图是由它们的 {{< glossary_tooltip text="容器镜像" term_id="image" >}} +的初始内容以及挂载在容器中的卷(如果定义了的话)所组成的。 +其中根文件系统同容器镜像的内容相吻合。 +任何在该文件系统下的写入操作,如果被允许的话,都会影响接下来容器中进程访问文件系统时所看到的内容。 + + +卷中 [指定的路径](#using-subpath) 将会被挂载。 Pod 配置中的每个容器必须独立指定各个卷的挂载位置。 +卷不能挂载到其他卷之上(不过存在一种相关的机制 [使用 subPath](#using-subpath)),也不能与其他卷有硬链接。 + -`projected` 卷类型能将若干现有的卷来源映射到同一目录上。 - -目前,可以映射的卷来源类型如下: - -- [`secret`](#secret) -- [`downwardAPI`](#downwardapi) -- [`configMap`](#configmap) -- `serviceAccountToken` - - -所有的卷来源需要和 Pod 处于相同的命名空间。 -更多详情请参考[一体化卷设计文档](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/node/all-in-one-volume.md)。 - - - -#### 包含 Secret、downwardAPI 和 configMap 的 Pod 示例 {#example-configuration-secret-downwardapi-configmap} - -```yaml -apiVersion: v1 -kind: Pod -metadata: - name: volume-test -spec: - containers: - - name: container-test - image: busybox - volumeMounts: - - name: all-in-one - mountPath: "/projected-volume" - readOnly: true - volumes: - - name: all-in-one - projected: - sources: - - secret: - name: mysecret - items: - - key: username - path: my-group/my-username - - downwardAPI: - items: - - path: "labels" - fieldRef: - fieldPath: metadata.labels - - path: "cpu_limit" - resourceFieldRef: - containerName: container-test - resource: limits.cpu - - configMap: - name: myconfigmap - items: - - key: config - path: my-group/my-config -``` - - - -下面是一个带有非默认访问权限设置的多个 secret 的 Pod 示例: - -```yaml -apiVersion: v1 -kind: Pod -metadata: - name: volume-test -spec: - containers: - - name: container-test - image: busybox - volumeMounts: - - name: all-in-one - mountPath: "/projected-volume" - readOnly: true - volumes: - - name: all-in-one - projected: - sources: - - secret: - name: mysecret - items: - - key: username - path: my-group/my-username - - secret: - name: mysecret2 - items: - - key: password - path: my-group/my-password - mode: 511 -``` - -每个被投射的卷来源都在规约中的 `sources` 内列出。参数几乎相同,除了两处例外: - -* 对于 `secret`,`secretName` 字段已被变更为 `name` 以便与 ConfigMap 命名一致。 -* `defaultMode` 只能在整个投射卷级别指定,而无法针对每个卷来源指定。 - 不过,如上所述,你可以显式地为每个投射项设置 `mode` 值。 - - - -当开启 `TokenRequestProjection` 功能时,可以将当前 -[服务帐号](/zh/docs/reference/access-authn-authz/authentication/#service-account-tokens) -的令牌注入 Pod 中的指定路径。 -下面是一个例子: - -```yaml -apiVersion: v1 -kind: Pod -metadata: - name: sa-token-test -spec: - containers: - - name: container-test - image: busybox - volumeMounts: - - name: token-vol - mountPath: "/service-account" - readOnly: true - volumes: - - name: token-vol - projected: - sources: - - serviceAccountToken: - audience: api - expirationSeconds: 3600 - path: token -``` - - -示例 Pod 具有包含注入服务帐户令牌的映射卷。 -该令牌可以被 Pod 中的容器用来访问 Kubernetes API 服务器。 -`audience` 字段包含令牌的预期受众。 -令牌的接收者必须使用令牌的受众中指定的标识符来标识自己,否则应拒绝令牌。 -此字段是可选的,默认值是 API 服务器的标识符。 - - -`expirationSeconds` 是服务帐户令牌的有效期时长。 -默认值为 1 小时,必须至少 10 分钟(600 秒)。 -管理员还可以通过设置 API 服务器的 `--service-account-max-token-expiration` 选项来 -限制其最大值。 -`path` 字段指定相对于映射卷的挂载点的相对路径。 - -{{< note >}} - -使用投射卷源作为 [subPath](#using-subpath) 卷挂载的容器将不会接收这些卷源的更新。 -{{< /note >}} +投射卷能将若干现有的卷来源映射到同一目录上。更多详情请参考 [投射卷](/zh/docs/concepts/storage/projected-volumes/)。 ### quobyte (已弃用) {#quobyte} @@ -1542,11 +1378,11 @@ Quobyte 的 GitHub 项目包含以 CSI 形式部署 Quobyte 的 `rbd` 卷允许将 [Rados 块设备](https://docs.ceph.com/en/latest/rbd/) 卷挂载到你的 Pod 中. 不像 `emptyDir` 那样会在删除 Pod 的同时也会被删除,`rbd` 卷的内容在删除 Pod 时 @@ -1554,20 +1390,21 @@ be shared between pods. 这意味着 `rbd` 卷可以被预先填充数据,并且这些数据可以在 Pod 之间共享。 -{{< caution >}} +{{< note >}} 在使用 RBD 之前,你必须安装运行 Ceph。 -{{< /caution >}} +{{< /note >}} RBD 的一个特性是它可以同时被多个用户以只读方式挂载。 这意味着你可以用数据集预先填充卷,然后根据需要在尽可能多的 Pod 中并行地使用卷。 @@ -1576,6 +1413,59 @@ RBD 的一个特性是它可以同时被多个用户以只读方式挂载。 更多详情请参考 [RBD 示例](https://github.com/kubernetes/examples/tree/master/volumes/rbd)。 + +#### RBD CSI 迁移 {#rbd-csi-migration} + +{{< feature-state for_k8s_version="v1.23" state="alpha" >}} + + +启用 RBD 的 `CSIMigration` 功能后,所有插件操作从现有的树内插件重定向到 +`rbd.csi.ceph.com` {{}} 驱动程序。 +要使用该功能,必须在集群内安装 [Ceph CSI driver](https://github.com/ceph/ceph-csi) +并启用 `CSIMigration` 和 `csiMigrationRBD` +[特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/)。 + + +{{< note >}} +作为一位管理存储的 Kubernetes 集群操作者,在尝试迁移到 RBD CSI 驱动前,你必须完成下列先决事项: + +* 你必须在集群中安装 v3.5.0 或更高版本的 Ceph CSI 驱动(`rbd.csi.ceph.com`)。 +* 因为 `clusterID` 是 CSI 驱动程序必需的参数,而树内存储类又将 `monitors` 作为一个必需的参数, + 所以 Kubernetes 存储管理者需要根据 `monitors` 的哈希值 + (例:`#echo -n '' | md5sum`)来创建 `clusterID`, + 并保持该 `monitors` 存在于该 `clusterID` 的配置中。 +* 同时,如果树内存储类的 `adminId` 的值与 `admin` 不同,那么其 `adminSecretName` 就需要 + 被修改成 `adminId` 的 base64 编码后的值。 +{{< /note >}} + ### secret +#### Portworx CSI 迁移 + +{{< feature-state for_k8s_version="v1.23" state="alpha" >}} + + +Kubernetes 1.23 中加入了 Portworx 的 `CSIMigration` 功能,但默认不会启用,因为该功能仍处于 alpha 阶段。 +该功能会将所有的插件操作从现有的树内插件重定向到 +`pxd.portworx.com` 容器存储接口(Container Storage Interface, CSI)驱动程序。 +集群中必须安装 +[Portworx CSI Driver](https://docs.portworx.com/portworx-install-with-kubernetes/storage-operations/csi/)。 +要启用此功能,请在 kube-controller-manager 和 kubelet 中设置 `CSIMigrationPortworx=true`。 + -## 使用 subPath {#using-path} +## 使用 subPath {#using-subpath} 有时,在单个 Pod 中共享卷以供多方使用是很有用的。 `volumeMounts.subPath` 属性可用于指定所引用的卷内的子路径,而不是其根路径。 @@ -1934,6 +1846,7 @@ spec: volumeMounts: - name: workdir1 mountPath: /logs + # 包裹变量名的是小括号,而不是大括号 subPathExpr: $(POD_NAME) restartPolicy: Never volumes: @@ -1970,16 +1883,15 @@ To learn about requesting space using a resource specification, see ## Out-of-Tree Volume Plugins The out-of-tree volume plugins include -{{< glossary_tooltip text="Container Storage Interface" term_id="csi" >}} (CSI) -and FlexVolume. They enable storage vendors to create custom storage plugins -without adding them to the Kubernetes repository. +{{< glossary_tooltip text="Container Storage Interface" term_id="csi" >}} (CSI), and also FlexVolume (which is deprecated). These plugins enable storage vendors to create custom storage plugins +without adding their plugin source code to the Kubernetes repository. --> ## 树外(Out-of-Tree)卷插件 {#out-of-tree-volume-plugins} Out-of-Tree 卷插件包括 {{< glossary_tooltip text="容器存储接口(CSI)" term_id="csi" >}} (CSI) -和 FlexVolume。 -它们使存储供应商能够创建自定义存储插件,而无需将它们添加到 Kubernetes 代码仓库。 +和 FlexVolume (已弃用)。 +它们使存储供应商能够创建自定义存储插件,而无需将插件源码添加到 Kubernetes 代码仓库。 -FlexVolume 是一个自 1.2 版本(在 CSI 之前)以来在 Kubernetes 中一直存在的树外插件接口。 -它使用基于 exec 的模型来与驱动程序对接。 -用户必须在每个节点(在某些情况下是主控节点)上的预定义卷插件路径中安装 -FlexVolume 驱动程序可执行文件。 +FlexVolume 是一个使用基于 exec 的模型来与驱动程序对接的树外插件接口。 +用户必须在每个节点上的预定义卷插件路径中安装FlexVolume 驱动程序可执行文件, +在某些情况下,控制平面节点中也要安装。 Pod 通过 `flexvolume` 树内插件与 Flexvolume 驱动程序交互。 -更多详情请参考 [FlexVolume](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-storage/flexvolume.md) 示例。 +更多详情请参考 FlexVolume [README](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-storage/flexvolume.md#readme) 文档。 + + +{{< note >}} +FlexVolume 已弃用。推荐使用树外 CSI 驱动来将外部存储整合进 Kubernetes。 + +FlexVolume 驱动的维护者应开发一个 CSI 驱动并帮助用户从 FlexVolume 驱动迁移到 CSI。 +FlexVolume 用户应迁移工作负载以使用对等的 CSI 驱动。 +{{< /note >}} -Container 中的文件在磁盘上是临时存放的,这给 Container 中运行的较重要的应用 -程序带来一些问题。问题之一是当容器崩溃时文件丢失。kubelet 会重新启动容器, -但容器会以干净的状态重启。 +Container 中的文件在磁盘上是临时存放的,这给 Container 中运行的较重要的应用程序带来一些问题。 +问题之一是当容器崩溃时文件丢失。 +kubelet 会重新启动容器,但容器会以干净的状态重启。 第二个问题会在同一 `Pod` 中运行多个容器并共享文件时出现。 Kubernetes {{< glossary_tooltip text="卷(Volume)" term_id="volume" >}} 这一抽象概念能够解决这两个问题。 @@ -66,8 +66,8 @@ For any kind of volume in a given pod, data is preserved across container restar Kubernetes 支持很多类型的卷。 {{< glossary_tooltip term_id="pod" text="Pod" >}} 可以同时使用任意数目的卷类型。 临时卷类型的生命周期与 Pod 相同,但持久卷可以比 Pod 的存活期长。 -当 Pod 不再存在时,Kubernetes 也会销毁临时卷;不过 Kubernetes 不会销毁 -持久卷。对于给定 Pod 中任何类型的卷,在容器重启期间数据都不会丢失。 +当 Pod 不再存在时,Kubernetes 也会销毁临时卷;不过 Kubernetes 不会销毁持久卷。 +对于给定 Pod 中任何类型的卷,在容器重启期间数据都不会丢失。 卷的核心是一个目录,其中可能存有数据,Pod 中的容器可以访问该目录中的数据。 -所采用的特定的卷类型将决定该目录如何形成的、使用何种介质保存数据以及目录中存放 -的内容。 +所采用的特定的卷类型将决定该目录如何形成的、使用何种介质保存数据以及目录中存放的内容。 `awsElasticBlockStore` 卷将 Amazon Web服务(AWS)[EBS 卷](https://aws.amazon.com/ebs/) -挂载到你的 Pod 中。与 `emptyDir` 在 Pod 被删除时也被删除不同,EBS 卷的内容在删除 Pod 时 -会被保留,卷只是被卸载掉了。 +挂载到你的 Pod 中。与 `emptyDir` 在 Pod 被删除时也被删除不同,EBS 卷的内容在删除 Pod +时会被保留,卷只是被卸载掉了。 这意味着 EBS 卷可以预先填充数据,并且该数据可以在 Pod 之间共享。 -如果启用了对 `awsElasticBlockStore` 的 `CSIMigration` 特性支持,所有插件操作都 -不再指向树内插件(In-Tree Plugin),转而指向 `ebs.csi.aws.com` 容器存储接口 -(Container Storage Interface,CSI)驱动。为了使用此特性,必须在集群中安装 +如果启用了对 `awsElasticBlockStore` 的 `CSIMigration` +特性支持,所有插件操作都不再指向树内插件(In-Tree Plugin),转而指向 +`ebs.csi.aws.com` 容器存储接口(Container Storage Interface,CSI)驱动。 +为了使用此特性,必须在集群中安装 [AWS EBS CSI 驱动](https://github.com/kubernetes-sigs/aws-ebs-csi-driver), 并确保 `CSIMigration` 和 `CSIMigrationAWS` Beta 功能特性被启用。 @@ -323,8 +323,9 @@ that data can be shared between Pods. The `cephfs` can be mounted by multiple writers simultaneously. --> `cephfs` 卷允许你将现存的 CephFS 卷挂载到 Pod 中。 -不像 `emptyDir` 那样会在 Pod 被删除的同时也会被删除,`cephfs` 卷的内容在 Pod 被删除 -时会被保留,只是卷被卸载了。这意味着 `cephfs` 卷可以被预先填充数据,且这些数据可以在 +不像 `emptyDir` 那样会在 Pod 被删除的同时也会被删除,`cephfs` +卷的内容在 Pod 被删除时会被保留,只是卷被卸载了。 +这意味着 `cephfs` 卷可以被预先填充数据,且这些数据可以在 Pod 之间共享。同一 `cephfs` 卷可同时被多个写者挂载。 -[`configMap`](/zh/docs/tasks/configure-pod-container/configure-pod-configmap/) 卷 -提供了向 Pod 注入配置数据的方法。 -ConfigMap 对象中存储的数据可以被 `configMap` 类型的卷引用,然后被 Pod 中运行的 -容器化应用使用。 +[`configMap`](/zh/docs/tasks/configure-pod-container/configure-pod-configmap/) +卷提供了向 Pod 注入配置数据的方法。 +ConfigMap 对象中存储的数据可以被 `configMap` 类型的卷引用,然后被 Pod 中运行的容器化应用使用。 -`log-config` ConfigMap 以卷的形式挂载,并且存储在 `log_level` 条目中的所有内容 -都被挂载到 Pod 的 `/etc/config/log_level` 路径下。 +`log-config` ConfigMap 以卷的形式挂载,并且存储在 `log_level` +条目中的所有内容都被挂载到 Pod 的 `/etc/config/log_level` 路径下。 请注意,这个路径来源于卷的 `mountPath` 和 `log_level` 键对应的 `path`。 {{< note >}} -当启用 `SizeMemoryBackedVolumes` [特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/)时, -你可以为基于内存提供的卷指定大小。 +当启用 `SizeMemoryBackedVolumes` [特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/) +时,你可以为基于内存提供的卷指定大小。 如果未指定大小,则基于内存的卷的大小为 Linux 主机上内存的 50%。 {{< /note>}} @@ -604,8 +604,8 @@ targetWWNs expect that those WWNs are from multi-path connections. You must configure FC SAN Zoning to allocate and mask those LUNs (volumes) to the target WWNs beforehand so that Kubernetes hosts can access them. --> {{< note >}} -你必须配置 FC SAN Zoning,以便预先向目标 WWN 分配和屏蔽这些 LUN(卷), -这样 Kubernetes 主机才可以访问它们。 +你必须配置 FC SAN Zoning,以便预先向目标 WWN 分配和屏蔽这些 LUN(卷),这样 +Kubernetes 主机才可以访问它们。 {{< /note >}} -[区域持久盘](https://cloud.google.com/compute/docs/disks/#repds) 功能允许你创建能在 -同一区域的两个可用区中使用的持久盘。 -要使用这个功能,必须以持久卷(PersistentVolume)的方式提供卷;直接从 Pod 引用这种卷 -是不可以的。 +[区域持久盘](https://cloud.google.com/compute/docs/disks/#repds) +功能允许你创建能在同一区域的两个可用区中使用的持久盘。 +要使用这个功能,必须以持久卷(PersistentVolume)的方式提供卷;直接从 +Pod 引用这种卷是不可以的。 #### 手动供应基于区域 PD 的 PersistentVolume {#manually-provisioning-regional-pd-pv} -使用[为 GCE PD 定义的存储类](/zh/docs/concepts/storage/storage-classes/#gce) 可以 -实现动态供应。在创建 PersistentVolume 之前,你首先要创建 PD。 +使用[为 GCE PD 定义的存储类](/zh/docs/concepts/storage/storage-classes/#gce) +可以实现动态供应。在创建 PersistentVolume 之前,你首先要创建 PD。 ```shell gcloud beta compute disks create --size=500GB my-data-disk @@ -839,8 +839,8 @@ and the kubelet, set the `InTreePluginGCEUnregister` flag to `true`. {{< feature-state for_k8s_version="v1.21" state="alpha" >}} -要禁止控制器管理器和 kubelet 加载 `gcePersistentDisk` 存储插件, -请将 `InTreePluginGCEUnregister` 标志设置为 `true`。 +要禁止控制器管理器和 kubelet 加载 `gcePersistentDisk` 存储插件,请将 +`InTreePluginGCEUnregister` 标志设置为 `true`。 {{< warning >}} `gitRepo` 卷类型已经被废弃。如果需要在容器中提供 git 仓库,请将一个 -[EmptyDir](#emptydir) 卷挂载到 InitContainer 中,使用 git 命令完成仓库的克隆操作, -然后将 [EmptyDir](#emptydir) 卷挂载到 Pod 的容器中。 +[EmptyDir](#emptydir) 卷挂载到 InitContainer 中,使用 git +命令完成仓库的克隆操作,然后将 [EmptyDir](#emptydir) 卷挂载到 Pod 的容器中。 {{< /warning >}} 当使用这种类型的卷时要小心,因为: -* HostPath 卷可能会暴露特权系统凭据(例如 Kubelet)或特权 API(例如容器运行时套接字), - 可用于容器逃逸或攻击集群的其他部分。 -* 具有相同配置(例如基于同一 PodTemplate 创建)的多个 Pod 会由于节点上文件的不同 - 而在不同节点上有不同的行为。 +* HostPath 卷可能会暴露特权系统凭据(例如 Kubelet)或特权 + API(例如容器运行时套接字),可用于容器逃逸或攻击集群的其他部分。 +* 具有相同配置(例如基于同一 PodTemplate 创建)的多个 Pod + 会由于节点上文件的不同而在不同节点上有不同的行为。 * 下层主机上创建的文件或目录只能由 root 用户写入。你需要在 [特权容器](/zh/docs/tasks/configure-pod-container/security-context/) 中以 root 身份运行进程,或者修改主机上的文件权限以便容器能够写入 `hostPath` 卷。 @@ -1093,8 +1093,8 @@ unmounted. This means that an iscsi volume can be pre-populated with data, and that data can be shared between pods. --> `iscsi` 卷能将 iSCSI (基于 IP 的 SCSI) 卷挂载到你的 Pod 中。 -不像 `emptyDir` 那样会在删除 Pod 的同时也会被删除,`iscsi` 卷的内容在删除 Pod 时 -会被保留,卷只是被卸载。 +不像 `emptyDir` 那样会在删除 Pod 的同时也会被删除,`iscsi` +卷的内容在删除 Pod 时会被保留,卷只是被卸载。 这意味着 `iscsi` 卷可以被预先填充数据,并且这些数据可以在 Pod 之间共享。 然而,`local` 卷仍然取决于底层节点的可用性,并不适合所有应用程序。 -如果节点变得不健康,那么`local` 卷也将变得不可被 Pod 访问。使用它的 Pod 将不能运行。 -使用 `local` 卷的应用程序必须能够容忍这种可用性的降低,以及因底层磁盘的耐用性特征 -而带来的潜在的数据丢失风险。 +如果节点变得不健康,那么 `local` 卷也将变得不可被 Pod 访问。使用它的 Pod 将不能运行。 +使用 `local` 卷的应用程序必须能够容忍这种可用性的降低,以及因底层磁盘的耐用性特征而带来的潜在的数据丢失风险。 下面是一个使用 `local` 卷和 `nodeAffinity` 的持久卷示例: @@ -1213,9 +1212,8 @@ such as node resource requirements, node selectors, Pod affinity, and Pod anti-a 使用 `local` 卷时,建议创建一个 StorageClass 并将其 `volumeBindingMode` 设置为 `WaitForFirstConsumer`。要了解更多详细信息,请参考 [local StorageClass 示例](/zh/docs/concepts/storage/storage-classes/#local)。 -延迟卷绑定的操作可以确保 Kubernetes 在为 PersistentVolumeClaim 作出绑定决策时, -会评估 Pod 可能具有的其他节点约束,例如:如节点资源需求、节点选择器、Pod -亲和性和 Pod 反亲和性。 +延迟卷绑定的操作可以确保 Kubernetes 在为 PersistentVolumeClaim 作出绑定决策时,会评估 +Pod 可能具有的其他节点约束,例如:如节点资源需求、节点选择器、Pod亲和性和 Pod 反亲和性。 -`persistentVolumeClaim` 卷用来将[持久卷](/zh/docs/concepts/storage/persistent-volumes/)(PersistentVolume) -挂载到 Pod 中。 -持久卷申领(PersistentVolumeClaim)是用户在不知道特定云环境细节的情况下"申领"持久存储 -(例如 GCE PersistentDisk 或者 iSCSI 卷)的一种方法。 +`persistentVolumeClaim` 卷用来将 +[持久卷](/zh/docs/concepts/storage/persistent-volumes/)(PersistentVolume)挂载到 Pod 中。 +持久卷申领(PersistentVolumeClaim)是用户在不知道特定云环境细节的情况下“申领”持久存储(例如 +GCE PersistentDisk 或者 iSCSI 卷)的一种方法。 `portworxVolume` 是一个可伸缩的块存储层,能够以超融合(hyperconverged)的方式与 Kubernetes 一起运行。 -[Portworx](https://portworx.com/use-case/kubernetes-storage/) 支持对服务器上存储的指纹处理、 -基于存储能力进行分层以及跨多个服务器整合存储容量。 +[Portworx](https://portworx.com/use-case/kubernetes-storage/) +支持对服务器上存储的指纹处理、基于存储能力进行分层以及跨多个服务器整合存储容量。 Portworx 可以以 in-guest 方式在虚拟机中运行,也可以在裸金属 Linux 节点上运行。 -`rbd` 卷允许将 [Rados 块设备](https://docs.ceph.com/en/latest/rbd/) 卷挂载到你的 Pod 中. -不像 `emptyDir` 那样会在删除 Pod 的同时也会被删除,`rbd` 卷的内容在删除 Pod 时 -会被保存,卷只是被卸载。 +`rbd` 卷允许将 [Rados 块设备](https://docs.ceph.com/en/latest/rbd/) 卷挂载到你的 Pod 中。 +不像 `emptyDir` 那样会在删除 Pod 的同时也会被删除,`rbd` 卷的内容在删除 Pod 时会被保存,卷只是被卸载。 这意味着 `rbd` 卷可以被预先填充数据,并且这些数据可以在 Pod 之间共享。 启用 RBD 的 `CSIMigration` 功能后,所有插件操作从现有的树内插件重定向到 `rbd.csi.ceph.com` {{}} 驱动程序。 -要使用该功能,必须在集群内安装 [Ceph CSI driver](https://github.com/ceph/ceph-csi) -并启用 `CSIMigration` 和 `csiMigrationRBD` +要使用该功能,必须在集群内安装 +[Ceph CSI driver](https://github.com/ceph/ceph-csi),并启用 `CSIMigration` 和 `csiMigrationRBD` [特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/)。 `secret` 卷用来给 Pod 传递敏感信息,例如密码。你可以将 Secret 存储在 Kubernetes API 服务器上,然后以文件的形式挂在到 Pod 中,无需直接与 Kubernetes 耦合。 -`secret` 卷由 tmpfs(基于 RAM 的文件系统)提供存储,因此它们永远不会被写入非易失性 -(持久化的)存储器。 +`secret` 卷由 tmpfs(基于 RAM 的文件系统)提供存储,因此它们永远不会被写入非易失性(持久化的)存储器。 ## 资源 {#resources} -`emptyDir` 卷的存储介质(磁盘、SSD 等)是由保存 kubelet 数据的根目录 -(通常是 `/var/lib/kubelet`)的文件系统的介质确定。 -Kubernetes 对 `emptyDir` 卷或者 `hostPath` 卷可以消耗的空间没有限制, -容器之间或 Pod 之间也没有隔离。 +`emptyDir` 卷的存储介质(磁盘、SSD 等)是由保存 kubelet +数据的根目录(通常是 `/var/lib/kubelet`)的文件系统的介质确定。 +Kubernetes 对 `emptyDir` 卷或者 `hostPath` 卷可以消耗的空间没有限制,容器之间或 Pod 之间也没有隔离。 -CSI 和 FlexVolume 都允许独立于 Kubernetes 代码库开发卷插件,并作为扩展部署 -(安装)在 Kubernetes 集群上。 +CSI 和 FlexVolume 都允许独立于 Kubernetes 代码库开发卷插件,并作为扩展部署(安装)在 Kubernetes 集群上。 对于希望创建树外(Out-Of-Tree)卷插件的存储供应商,请参考 [卷插件常见问题](https://github.com/kubernetes/community/blob/master/sig-storage/volume-plugin-faq.md)。 @@ -1965,8 +1959,8 @@ A `csi` volume can be used in a Pod in three different ways: * with a [CSI ephemeral volume](/docs/concepts/storage/ephemeral-volumes/#csi-ephemeral-volume) if the driver supports that (beta feature) --> -一旦在 Kubernetes 集群上部署了 CSI 兼容卷驱动程序,用户就可以使用 `csi` 卷类型来 -挂接、挂载 CSI 驱动所提供的卷。 +一旦在 Kubernetes 集群上部署了 CSI 兼容卷驱动程序,用户就可以使用 +`csi` 卷类型来挂接、挂载 CSI 驱动所提供的卷。 `csi` 卷可以在 Pod 中以三种方式使用: @@ -1990,10 +1984,10 @@ persistent volume: CSI driver components to identify which PV objects belong to the CSI driver. --> - `driver`:指定要使用的卷驱动名称的字符串值。 - 这个值必须与 CSI 驱动程序在 `GetPluginInfoResponse` 中返回的值相对应; - 该接口定义在 [CSI 规范](https://github.com/container-storage-interface/spec/blob/master/spec.md#getplugininfo)中。 - Kubernetes 使用所给的值来标识要调用的 CSI 驱动程序;CSI 驱动程序也使用该值来辨识 - 哪些 PV 对象属于该 CSI 驱动程序。 + 这个值必须与 CSI 驱动程序在 `GetPluginInfoResponse` 中返回的值相对应;该接口定义在 + [CSI 规范](https://github.com/container-storage-interface/spec/blob/master/spec.md#getplugininfo)中。 + Kubernetes 使用所给的值来标识要调用的 CSI 驱动程序;CSI + 驱动程序也使用该值来辨识哪些 PV 对象属于该 CSI 驱动程序。 - `volumeHandle`:唯一标识卷的字符串值。 - 该值必须与 CSI 驱动在 `CreateVolumeResponse` 的 `volume_id` 字段中返回的值相对应; - 接口定义在 [CSI spec](https://github.com/container-storage-interface/spec/blob/master/spec.md#createvolume) 中。 + 该值必须与 CSI 驱动在 `CreateVolumeResponse` 的 `volume_id` 字段中返回的值相对应;接口定义在 + [CSI spec](https://github.com/container-storage-interface/spec/blob/master/spec.md#createvolume) 中。 在所有对 CSI 卷驱动程序的调用中,引用该 CSI 卷时都使用此值作为 `volume_id` 参数。 -- `readOnly`:一个可选的布尔值,指示通过 `ControllerPublished` 关联该卷时是否设置 - 该卷为只读。默认值是 false。 +- `readOnly`:一个可选的布尔值,指示通过 `ControllerPublished` 关联该卷时是否设置该卷为只读。默认值是 false。 该值通过 `ControllerPublishVolumeRequest` 中的 `readonly` 字段传递给 CSI 驱动。 -启用 `CSIMigration` 功能后,针对现有树内插件的操作会被重定向到相应的 CSI 插件 -(应已安装和配置)。 -因此,操作员在过渡到取代树内插件的 CSI 驱动时,无需对现有存储类、PV 或 PVC -(指树内插件)进行任何配置更改。 +启用 `CSIMigration` 功能后,针对现有树内插件的操作会被重定向到相应的 CSI 插件(应已安装和配置)。 +因此,操作员在过渡到取代树内插件的 CSI 驱动时,无需对现有存储类、PV 或 PVC(指树内插件)进行任何配置更改。 所支持的操作和功能包括:配备(Provisioning)/删除、挂接(Attach)/解挂(Detach)、 挂载(Mount)/卸载(Unmount)和调整卷大小。 @@ -2175,8 +2167,8 @@ Pods interact with FlexVolume drivers through the `flexVolume` in-tree volume pl For more details, see the FlexVolume [README](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-storage/flexvolume.md#readme) document. --> FlexVolume 是一个使用基于 exec 的模型来与驱动程序对接的树外插件接口。 -用户必须在每个节点上的预定义卷插件路径中安装FlexVolume 驱动程序可执行文件, -在某些情况下,控制平面节点中也要安装。 +用户必须在每个节点上的预定义卷插件路径中安装 FlexVolume +驱动程序可执行文件,在某些情况下,控制平面节点中也要安装。 Pod 通过 `flexvolume` 树内插件与 Flexvolume 驱动程序交互。 更多详情请参考 FlexVolume [README](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-storage/flexvolume.md#readme) 文档。 @@ -2205,8 +2197,7 @@ Its values are: --> ## 挂载卷的传播 {#mount-propagation} -挂载卷的传播能力允许将容器安装的卷共享到同一 Pod 中的其他容器, -甚至共享到同一节点上的其他 Pod。 +挂载卷的传播能力允许将容器安装的卷共享到同一 Pod 中的其他容器,甚至共享到同一节点上的其他 Pod。 卷的挂载传播特性由 `Container.volumeMounts` 中的 `mountPropagation` 字段控制。 它的值包括: @@ -2245,8 +2236,8 @@ Its values are: 换句话说,如果主机在此挂载卷中挂载任何内容,容器将能看到它被挂载在那里。 - 类似的,配置了 `Bidirectional` 挂载传播选项的 Pod 如果在同一卷上挂载了内容, - 挂载传播设置为 `HostToContainer` 的容器都将能看到这一变化。 + 类似的,配置了 `Bidirectional` 挂载传播选项的 Pod 如果在同一卷上挂载了内容,挂载传播设置为 + `HostToContainer` 的容器都将能看到这一变化。 该模式等同于 [Linux 内核文档](https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt) 中描述的 `rslave` 挂载传播选项。 @@ -2291,8 +2282,7 @@ Docker as shown below. --> ### 配置 {#configuration} -在某些部署环境中,挂载传播正常工作前,必须在 Docker 中正确配置挂载共享(mount share), -如下所示。 +在某些部署环境中,挂载传播正常工作前,必须在 Docker 中正确配置挂载共享(mount share),如下所示。 -卷中 [指定的路径](#using-subpath) 将会被挂载。 +卷挂载在镜像中的[指定路径](#using-subpath)下。 Pod 配置中的每个容器必须独立指定各个卷的挂载位置。 -卷不能挂载到其他卷之上(不过存在一种相关的机制 [使用 subPath](#using-subpath)),也不能与其他卷有硬链接。 +卷不能挂载到其他卷之上(不过存在一种[使用 subPath](#using-subpath) 的相关机制),也不能与其他卷有硬链接。 -`persistentVolumeClaim` 卷用来将 -[持久卷](/zh/docs/concepts/storage/persistent-volumes/)(PersistentVolume)挂载到 Pod 中。 +`persistentVolumeClaim` 卷用来将[持久卷](/zh/docs/concepts/storage/persistent-volumes/)(PersistentVolume)挂载到 Pod 中。 持久卷申领(PersistentVolumeClaim)是用户在不知道特定云环境细节的情况下“申领”持久存储(例如 GCE PersistentDisk 或者 iSCSI 卷)的一种方法。 @@ -1343,7 +1342,7 @@ For more details, see the [Portworx volume](https://github.com/kubernetes/exampl A projected volume maps several existing volume sources into the same directory. For more details, see [projected volumes](/docs/concepts/storage/projected-volumes/). --> -投射卷能将若干现有的卷来源映射到同一目录上。更多详情请参考 [投射卷](/zh/docs/concepts/storage/projected-volumes/)。 +投射卷能将若干现有的卷来源映射到同一目录上。更多详情请参考[投射卷](/zh/docs/concepts/storage/projected-volumes/)。 ### quobyte (已弃用) {#quobyte} @@ -1382,7 +1381,7 @@ contents of an `rbd` volume are preserved and the volume is unmounted. This means that a RBD volume can be pre-populated with data, and that data can be shared between pods. --> -`rbd` 卷允许将 [Rados 块设备](https://docs.ceph.com/en/latest/rbd/) 卷挂载到你的 Pod 中。 +`rbd` 卷允许将 [Rados 块设备](https://docs.ceph.com/en/latest/rbd/)卷挂载到你的 Pod 中。 不像 `emptyDir` 那样会在删除 Pod 的同时也会被删除,`rbd` 卷的内容在删除 Pod 时会被保存,卷只是被卸载。 这意味着 `rbd` 卷可以被预先填充数据,并且这些数据可以在 Pod 之间共享。 @@ -1430,7 +1429,7 @@ must be enabled. 启用 RBD 的 `CSIMigration` 功能后,所有插件操作从现有的树内插件重定向到 `rbd.csi.ceph.com` {{}} 驱动程序。 要使用该功能,必须在集群内安装 -[Ceph CSI driver](https://github.com/ceph/ceph-csi),并启用 `CSIMigration` 和 `csiMigrationRBD` +[Ceph CSI 驱动](https://github.com/ceph/ceph-csi),并启用 `CSIMigration` 和 `csiMigrationRBD` [特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/)。 - `volumeHandle`:唯一标识卷的字符串值。 该值必须与 CSI 驱动在 `CreateVolumeResponse` 的 `volume_id` 字段中返回的值相对应;接口定义在 - [CSI spec](https://github.com/container-storage-interface/spec/blob/master/spec.md#createvolume) 中。 + [CSI 规范](https://github.com/container-storage-interface/spec/blob/master/spec.md#createvolume) 中。 在所有对 CSI 卷驱动程序的调用中,引用该 CSI 卷时都使用此值作为 `volume_id` 参数。