vSphere 存储

要为有状态的工作负载提供 vSphere 存储,我们建议创建一个 vSphereVolume StorageClass。当工作负载通过 PersistentVolumeClaim 请求卷时,这种做法会动态调配 vSphere 存储。

为了在 vSphere 中动态调配存储,必须启用 vSphere 提供商。有关更多信息,请参阅树外 vSphere树内 vSphere

先决条件

为了在 Rancher Kubernetes Engine (RKE) 集群中配置 vSphere 卷,https://rancher.com/docs/rke/latest/en/config-options/cloud-providers/vsphere[vSphere cloud provider] 必须在集群选项中显式启用。

创建一个 StorageClass

你也可以使用 kubectl 命令行工具来执行以下步骤。有关详细信息,请参阅关于持久卷的 Kubernetes 文档

  1. 点击 ☰ > 集群管理

  2. 选择要使用 vSphere 存储的集群,然后单击浏览

  3. 在左侧导航栏中,选择存储  StorageClass

  4. 单击创建

  5. 输入存储类的名称

  6. Provisioner下,选择 VMWare vSphere 卷

    vsphere storage class
  7. 可选地,你可以在参数下指定存储类的其他属性。有关详细信息,请参阅 vSphere 存储文档

  8. 单击创建

创建使用 vSphere 卷的工作负载

  1. 在左侧导航栏中,单击工作负载

  2. 单击创建

  3. 单击 StatefulSet

  4. 卷声明模板选项卡上,单击添加声明模板

  5. 输入持久卷名称。

  6. 存储类字段中,选择你创建的 vSphere 存储类。

  7. 输入卷所需的容量。然后单击定义

  8. 挂载点字段中指定路径。这是卷将安装在容器文件系统中的完整路径,例如 /persistent

  9. 单击创建

验证卷的持久性

  1. 在左侧导航栏中,单击工作负载  Pod

  2. 转到你刚刚创建的工作负载,然后单击 ⋮ > 执行命令行

  3. 请注意卷已挂载到的根目录下的目录(在本例中为 /persistent)。

  4. 通过执行命令 touch /<volumeMountPoint>/data.txt 在卷中创建一个文件。

  5. 关闭 shell 窗口。

  6. 单击工作负载的名称以显示详细信息。

  7. 单击 ⋮ > 删除

  8. 观察 pod 是否被删除。为了让工作负载维持在所配置的单个有状态 pod 的规模,之后会调度一个新的 Pod 来替换该 Pod。

  9. 替换的 pod 运行后,单击执行命令行

  10. 输入 ls -l /<volumeMountPoint> 以检查卷所挂载的目录的内容。请注意,你之前创建的文件仍然存在。

workload-persistent-data

为什么使用 StatefulSet 替代 Deployment

对于消耗 vSphere 存储的工作负载,你应该始终使用 StatefulSets,因为这种资源类型旨在解决 VMDK 块存储警告。

由于 vSphere 卷由 VMDK 块存储支持,因此它们仅支持 ReadWriteOnce访问模式。此设置限制卷,使其一次只能挂载到一个 pod(除非使用该卷的所有 pod 位于同一节点上)。如果 deployment 资源消耗 vSphere 卷,则 deployment 资源无法用于扩展到超出单个副本。

即使使用仅具有单个副本的 deployment 资源也可能在更新 deployment 时出现死锁情况。如果更新的 pod 被调度到不同的节点,由于 VMDK 仍然连接到另一个节点,因此 pod 将无法启动。