本页面介绍了如何为 Distributed Cloud Connected 集群配置存储空间,包括:
为 Symcloud Storage 配置 Distributed Cloud Connected
Distributed Cloud Connected 节点不会直接向您的工作负载公开其本地存储空间。相反,Distributed Cloud Connected 使用 Rakuten Symcloud Storage, 后者是一种第三方解决方案,充当在每个 Distributed Cloud Connected 节点上运行的本地存储抽象层,并使其本地存储空间 可供在集群中的所有 Distributed Cloud Connected 节点上运行的工作负载使用。
容器存储接口 (CSI) 是许多主流存储供应商支持的开放式标准 API, 可让 Kubernetes 将任意存储系统提供给容器化 工作负载。在 Distributed Cloud Connected 中,Symcloud Storage 是受支持且受管理的 CSI 存储解决方案。激活 Symcloud Storage 后,系统会为您配置所需的 Kubernetes StorageClasses 。然后,您可以将工作负载配置为使用适当的存储类别。
Symcloud Storage 从 Google Cloud Marketplace 部署,并受其中所述条款的约束。Google 为将 Symcloud Storage 与 Distributed Cloud Connected 搭配使用提供有限支持,并且可能会与第三方提供方联系以寻求帮助。Symcloud Storage 的软件更新包含在 Distributed Cloud Connected 软件更新中。
此版本的 Distributed Cloud Connected 附带并 支持 Symcloud Storage 6.0.0-226。 此版本的 Distributed Cloud Connected 不支持其他任何版本的 Symcloud Storage。
获取 Symcloud Storage 许可
您必须从 Google Cloud Marketplace 获取 YAML 格式的 Symcloud Storage 许可:
前提条件
在开始之前,请完成以下步骤:
- 为目标 Distributed Cloud Connected 项目配置日志记录和 监控 。
- 创建目标 Distributed Cloud Connected 集群。 您可以 监控预配进度。
- 配置 Distributed Cloud 网络 以便目标 Distributed Cloud Connected 集群中的 Pod 可以 访问 Google Cloud 数据中心。
- 软件定义存储 (SDS) 解决方案(例如 Symcloud Storage)以未绑定的
local-block原始块设备为目标。当未绑定的local-block设备可用时,Distributed Cloud Connected 会在集群创建时安装 SDS 解决方案。
在 Distributed Cloud Connected 节点上安装 Symcloud Storage
如需在 Distributed Cloud Connected 节点上安装 Symcloud Storage,请完成以下步骤:
使用以下命令将 Symcloud Storage 许可应用于集群。将
LICENSE_FILE替换为 Symcloud Storage 许可文件的完整路径和名称。kubectl apply -f LICENSE_FILE -n robin-admin
使用以下命令验证
RobinCluster服务和所有 Symcloud Storage 节点的状态:kubectl describe robinclusters -n robinio
该命令会返回类似于以下内容的输出:
[...] Status: [...] Phase: Ready robin_node_status: [...] Status: Ready [...] Status: Ready [...] Status: Ready [...]服务和节点的预期状态为
Ready。
将 Symcloud Storage 设置为默认存储类别
使用以下命令将 Symcloud Storage 设置为 Distributed Cloud Connected 集群上的默认存储类别。将
STORAGE_CLASS替换为其中一个
Symcloud Storage 类别。
kubectl patch storageclass STORAGE_CLASS -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
如需详细了解如何设置默认存储类别,请参阅 Kubernetes 文档中的更改默认 StorageClass 。
Symcloud Storage 类别
本部分介绍了 Symcloud Storage 可以在 Distributed Cloud Connected 集群上启用的存储类别。Distributed Cloud Connected 上的 Symcloud Storage 不支持 robin-rwx 存储类别,也不支持任何自定义配置的 RWX 文件系统模式卷。
如需详细了解 Symcloud Storage 类别,请参阅 在 Kubernetes 中使用 Robin CNS。
robin 存储类别
robin 存储类别是一种基本的 Read Write-Once (RWO) 存储类别。以下示例展示了如何实例化该类别:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: robin
labels:
app.kubernetes.io/instance: robin
app.kubernetes.io/managed-by: robin.io
app.kubernetes.io/name: robin
provisioner: robin
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer
robin-immediate 存储类别
robin-immediate 存储类别与 robin 相同,不同之处在于,系统会在创建相应的
永久性卷声明后立即创建
永久性卷。以下示例展示了如何实例化该类别:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: robin-immediate
labels:
app.kubernetes.io/instance: robin
app.kubernetes.io/managed-by: robin.io
app.kubernetes.io/name: robin
provisioner: robin
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: Immediate
robin-repl-3 存储类别
robin-repl-3 是一种 RWO 存储类别,具有三个副本,这些副本分布在多个 Distributed Cloud 节点上。以下示例展示了如何实例化该类别:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: robin-repl-3
labels:
app.kubernetes.io/instance: robin
app.kubernetes.io/managed-by: robin.io
app.kubernetes.io/name: robin
provisioner: robin
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer
parameters:
replication: "3"
faultdomain: host
为工作负载配置抽象的 Symcloud Storage 卷
本部分提供了有关如何使用 Symcloud Storage 类别为 Distributed Cloud Connected 工作负载配置抽象存储空间的示例。如需详细了解如何配置 Symcloud Storage 卷,请参阅 在 Kubernetes 中使用 Robin CNS。
在文件系统模式下配置 ext4 RWO 卷
以下示例展示了如何使用 ext4 文件系统在文件系统模式下为 RWO 卷配置永久性卷声明。将
STORAGE_CLASS替换为其中一个
Symcloud Storage 类别。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rwo-fs-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: STORAGE_CLASS
在块模式下配置 RWO 卷
以下示例展示了如何在块模式下为 RWO 卷配置永久性卷声明。将 STORAGE_CLASS 替换为其中
一个 Symcloud Storage 类别。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rwo-block-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: STORAGE_CLASS
volumeMode: Block
修改现有卷的配置
以下示例展示了如何使用注解修改现有 Symcloud Storage LZ4 压缩 RWO 卷的配置。
将 STORAGE_CLASS 替换为其中一个 Symcloud Storage 类别。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: compressed-rwo-fs-pvc
annotations:
robin.io/compression: LZ4
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: STORAGE_CLASS
以下示例展示了如何使用注解修改具有 xfs 文件系统的现有 Symcloud Storage RWO 卷的配置。
将 STORAGE_CLASS 替换为其中一个 Symcloud Storage 类别。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rwo-xfs-pvc
annotations:
robin.io/fstype: xfs
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: STORAGE_CLASS
配置 Symcloud Storage CLI 客户端
Symcloud Storage 提供了一个命令行界面 (CLI) 客户端,您可以使用该客户端来管理 Symcloud Storage 配置。如需在 Distributed Cloud Connected 集群上配置客户端,请完成以下步骤:
获取部署在 Distributed Cloud Connected 集群上的
RobinCluster服务实例使用的 Symcloud Storage 映像路径,并按如下所示设置环境变量:image_robin=$(kubectl get robincluster -o jsonpath='{.items[].spec.image_robin}') image_registry_path=$(kubectl get robincluster -o jsonpath='{.items[].spec.image_registry_path}') ROBIN_CNS_IMAGE="$image_registry_path/$image_robin"创建包含以下内容的
robincli资源:kind: Deployment apiVersion: apps/v1 metadata: name: robincli namespace: default labels: name: robincli spec: replicas: 1 selector: matchLabels: name: robincli template: metadata: annotations: product: robin labels: name: robincli spec: containers: - name: robincli image: ROBIN_CNS_IMAGE workingDir: /root command: ["/bin/bash","-c","mkdir -p /root/.robin; ln -s -t /usr/lib/python3.7/site-packages/ /opt/robin/current/python3/site-packages/robincli /opt/robin/current/python3/site-packages/stormgr_def.py /opt/robin/current/python3/site-packages/stormgr_lib.py; /opt/robin/current/bin/robin client add-context robin-master.robinio --set-current; while true; do sleep 10000; done"] resources: requests: memory: "10Mi" cpu: "100m"将
ROBIN_CNS_IMAGE替换为您在第 1 步中获取的映像的完整代码库路径和名称。将
robincli资源应用于 Distributed Cloud Connected 集群。首次安装时,Symcloud Storage 会在
robinio命名空间中生成一个default-admin-userSecret,其中包含随机密码。使用以下命令获取这些登录凭据:获取用户名:
kubectl -n robinio get secret default-admin-user -o jsonpath='{.data.username}' | base64 -d获取密码:
kubectl -n robinio get secret default-admin-user -o jsonpath='{.data.password}' | base64 -d
登录到新创建的 Pod 并运行客户端:
kubectl exec -it robincli -- bash
在 StatefulSet 中引用存储类别
以下示例展示了如何在 StatefulSet 工作负载中引用 Symcloud Storage 存储类别。
该示例假定您使用的是预配置的 robin-repl-3 存储类别,该类别提供在三个不同的工作器节点之间复制的卷,以实现高可用性。
为实现高可用性而配置 StatefulSet 时,请在配置中遵循以下最佳实践:
- 无头服务:StatefulSet 需要一个配套无头服务
匹配
serviceName字段。无头服务是一种具有clusterIP: None的服务。此服务会为集合中的每个 Pod 分配稳定的 DNS 主机名。 - Pod 反亲和性:如果您使用复制的存储类别(例如
robin-repl-3),您的数据会在多个工作器节点之间安全地镜像。 但是,如果 Kubernetes 将您的所有应用 Pod 调度到同一个工作器节点上,则单个节点中断可能会导致您的应用停机。 配置 Pod 反亲和性可确保您的 Pod 分布在不同的工作器节点上,使计算可用性与存储冗余相匹配。
以下示例展示了一个完整的配置,其中包括无头服务 (nginx) 和一个配置了 Pod 反亲和性的 StatefulSet,该 StatefulSet 引用了 robin-repl-3 存储类别。如果您的工作负载存储要求随着时间的推移而增加,您可以通过在 PersistentVolumeClaim 中修改存储请求来动态调整卷的大小。
statefulset.yaml
apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx --- apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: serviceName: "nginx" replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - nginx topologyKey: "kubernetes.io/hostname" containers: - name: nginx image: registry.k8s.io/nginx-slim:0.8 volumeMounts: - name: www mountPath: /usr/share/nginx/html volumeClaimTemplates: # Reference the storage class in this specification - metadata: name: www spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 10Gi # Symcloud Storage classes support dynamic volume expansion if more storage is needed storageClassName: robin-repl-3 # References the Symcloud storage class
Symcloud Storage 的限制
将 Symcloud Storage 与 Distributed Cloud Connected 搭配使用时,只有当 Distributed Cloud Connected 集群包含三个或更多 Distributed Cloud Connected 节点时,才能实现高可用性。
从集群中移除使用 Symcloud Storage 的节点
Symcloud Storage 卷副本存储在 Distributed Cloud Connected 集群中的工作器节点上。 如果您从集群中移除某个节点,则存储在该节点上的 Symcloud Storage 卷数据将不可用。为防止这种情况发生,您必须执行以下操作之一:
- 如果您要拆除整个集群,请先移除工作负载及其对应的 Symcloud Storage 永久性卷,然后再拆除集群本身。
- 如果您要从集群中移除特定节点,则必须先迁移存储在这些节点上的工作负载数据,然后再从集群中移除这些节点。如需了解相关说明, 请参阅从磁盘中撤出卷。
配置本地存储架构
存储架构是一个或多个分区的逻辑分组。每个分区都是一个逻辑上独立的存储单元。分区会在集群中按顺序创建,直到物理磁盘空间耗尽为止。每个存储架构都有一个唯一名称作为标识。
如需为 Distributed Cloud Connected 集群创建新的本地存储架构,您必须向 Google 提出请求。在我们测试架构并在您的集群上创建架构后,您可以使用 gcloud CLI 应用该架构。
将架构应用于集群后,您无法对其进行修改。如需更改现有架构,您必须先向 Google 请求删除现有架构,然后请求创建新架构来替换它。
为本地存储架构定义分区
在请求本地存储架构之前,您必须先为该架构定义分区。
分区具有以下属性:
- 大小 。您可以指定分区的二进制字节大小,也可以让分区使用本地磁盘上的所有剩余空间。
- 类型 。您可以将分区配置为 Kubernetes 永久性卷 (PV) 或本地磁盘上的 Linux 本地卷。
- 模式 。您可以将存储在分区中的卷配置为块卷或文件系统卷。对于永久性卷分区,分区的存储类别分别为
local-block或local-disks。对于本地卷分区,您可以为包含的文件系统指定绑定点和装载点。
请求本地存储架构
如需为 Distributed Cloud Connected 集群请求新的本地存储架构, 请与 Google 支持团队 联系,并提供您要在架构中创建的每个分区的大小、 类型、模式,以及(可选)装载点和绑定点。
收到您的请求后,我们会运行一系列测试以确保架构的稳健性,然后在您的 Distributed Cloud Connected 集群上创建该架构。
默认本地存储架构
Distributed Cloud Connected 附带以下默认本地存储架构:
default_control_plane_node。此架构定义了以下分区:- 一个 100GB 的本地卷分区(采用文件系统模式)。
- 一个永久性卷分区(采用块模式),该分区占用剩余的可用磁盘空间。
default_worker_node。此架构定义了一个 410GB 的永久性卷分区(采用块模式)。
将本地存储架构应用于集群
如需将本地存储架构应用于 Distributed Cloud Connected 集群,请执行以下操作之一:
如需将本地存储架构应用于集群的控制平面节点,请在创建集群时使用
--control-plane-node-storage-schema标志。如需了解详情,请参阅创建集群。如需将本地存储架构应用于集群的工作器节点,请在为集群创建节点池时使用
--node-storage-schema。如需了解详情,请参阅创建节点池。
成功创建集群或节点池后,Distributed Cloud Connected 会创建本地存储架构中定义的分区。
默认静态本地永久性卷
Distributed Cloud Connected 附带以下类型的预配默认静态本地永久性卷 (PV):
anthos-system(97GiB) :一个预配的静态本地卷存储类别(采用文件系统模式)。local-shared(97GiB) :一个预配的静态本地卷存储类别(采用文件系统模式)。local-disks:一个预配的静态本地卷存储类别(采用文件系统模式),可在单节点部署中用于客户工作负载存储。与local-shared不同,这些 PV 由专用物理分区提供支持,并且在逻辑上不会过度预配。local-block:一个未绑定的原始块设备分区,预留用于工作负载存储和 Symcloud Storage 卷。此分区的大小取决于底层硬件存储容量,在为系统分区预留空间后,会占用剩余的磁盘空间。通常,控制平面节点会预留 200 GiB(100 GiB 系统分区和 100 GiB etcd 分区),而工作器节点会预留 100 GiB(用于系统分区)。这些原始块设备的分区布局、切片偏移量和实体设备边界是固定的且不可变。
每个节点的 local-shared PV 都无法供集群中的其他节点访问。在节点上运行的 Pod 会写入该节点上同一物理磁盘驱动器上的单独目录。如果您不使用 Symcloud Storage,则未绑定的 local-block 原始块设备在每个节点上仍然可用。
anthos-system 和 local-shared 静态 PV 在逻辑上会过度预配,并且由同一单个物理 ~105 GB 系统分区文件系统提供支持,该文件系统装载在每个节点上的 /dev/mapper/shared_lpvs_encrypted。此架构为 Google 管理的系统后台服务(例如日志记录、监控和网络)提供目录级隔离,而不会浪费物理磁盘容量。这些系统 PV 会提前过度预配到其最大标称容量,因为静态本地卷调整大小需要数据迁移,并重新创建受影响的 PV 和 PVC。
避免将 local-shared PV 用于生产工作负载
请勿将 local-shared PV 用于生产工作负载。由于这些 PV 与 Distributed Cloud Connected 系统服务位于同一物理磁盘驱动器上,因此您部署的任何使用这些 PV 的工作负载都会与 Distributed Cloud Connected 系统本身争用空间。
如果系统磁盘驱动器的可用空间用完,则会发生以下情况:
- Google 管理的平台服务和监控 Pod 崩溃
- Kubernetes 在节点上触发硬
DiskPressure状态 - Kubernetes 从节点中逐出所有 Pod
为防止这种情况发生,请仅将 Symcloud Storage 提供的存储类别用于生产工作负载。
问题排查
如果 PersistentVolumeClaim 意外保持待处理状态,或者工作负载无法挂接卷,请运行本部分列出的问题排查步骤。
PersistentVolumeClaim 保持待处理状态
如果 PersistentVolumeClaim 保持 Pending 状态,请检查存储类别的 volumeBindingMode。预配置的 Symcloud Storage 类别使用 volumeBindingMode: WaitForFirstConsumer,这会延迟卷预配,直到引用该声明的 Pod 被调度为止。确保您的工作负载 Pod 已成功调度。
如果 Pod 调度已完成,但声明仍处于待处理状态,或者卷挂接失败,请验证 Symcloud Storage 控制平面和节点级守护程序的运行状况。
验证控制平面运行状况
如需验证 Symcloud Storage 控制平面是否运行正常且已准备好预配
卷,请运行
kubectl describe
命令以检查 RobinCluster 自定义资源的状态:
kubectl describe robinclusters -n robinio
在命令输出中,验证 Phase 是否为 Ready。
验证存储守护程序运行状况
如需验证所有节点级存储守护程序 Pod 是否正在运行,请运行 kubectl get 命令:
kubectl get pods -n robinio
在命令输出中,确保所有 Pod 都处于 Running 状态。如果工作负载调度到存储守护程序 Pod 失败的节点上,则无论中央 RobinCluster 状态如何,卷挂接都会挂起。
与支持团队联系
如果 Symcloud Storage 控制平面状态不是 Ready,或者任何存储
守护程序 Pod 未处于 Running 状态,请与
Google 支持团队联系。
提交支持服务工单时,请提供您运行的问题排查命令的输出。