持久化存储配置

概述

安装 KubeSphere 时必须有持久化存储卷。KubeKey 通过 Add-on 机制可以在不同的存储系统上安装 KubeSphere。在 Linux 上使用 KubeKey 安装 KubeSphere 的一般步骤是:

  1. 安装 Kubernetes。
  2. 安装 KubeSphere 的 Add-on 插件。
  3. 使用 ks-installer 安装 KubeSphere。

在 KubeKey 配置中,需要设置 ClusterConfigurationspec.persistence.storageClass,使 ks-installer 为 KubeSphere 创建 PersistentVolumeClaim (PVC)。如果此处为空,将使用默认 StorageClass(注解 storageclass.kubernetes.io/is-default-class 等于 true)。

apiVersion: installer.kubesphere.io/v1alpha1
kind: ClusterConfiguration
spec:
  persistence:
    storageClass: ""
...    

因此,在前述的步骤 2 中必须安装一个可用的 StorageClass。它包括:

  • StorageClass 本身
  • StorageClass 的存储插件(如有必要)

本教程介绍了一些常用存储插件的 KubeKey Add-on 配置。如果 spec.persistence.storageClass 为空,将安装默认 StorageClass。如果您想配置其他存储系统,请参考下面的内容。

QingCloud CSI

如果您打算在青云QingCloud 上安装 KubeSphere,可以选择 QingCloud CSI 作为底层存储插件。下面是使用带有 StorageClass 的 Helm Chart 安装 QingCloud CSI 的 KubeKey Add-on 配置示例。

Chart 配置

config:
  qy_access_key_id: "MBKTPXWCIRIEDQYQKXYL"    # Replace it with your own key id.
  qy_secret_access_key: "cqEnHYZhdVCVif9qCUge3LNUXG1Cb9VzKY2RnBdX"  # Replace it with your own access key.
  zone: "pek3a"  # Lowercase letters only.
sc:
  isDefaultClass: true # Set it as the default storage class.

您需要创建该 Chart 配置文件,并手动输入上面的值。

密钥 (Key)

要获取 qy_access_key_idqy_secret_access_key 的值,请登录青云QingCloud 的 Web 控制台,参考下方截图先创建一个密钥。密钥创建之后会存储在 csv 文件中,下载该 csv 文件。

access-key

可用区 (Zone)

字段 zone 指定云存储卷部署的位置。在青云QingCloud 平台上,您必须先选择一个可用区,然后才能创建存储卷。

storage-zone

请确保您在 zone 中指定的值匹配下表中列出的区域 (Region) ID:

可用区区域 ID
Shanghai1-A/Shanghai1-Bsh1a/sh1b
Beijing3-A/Beijing3-B/Beijing3-C/Beijing3-Dpek3a/pek3b/pek3c/pek3d
Guangdong2-A/Guangdong2-Bgd2a/gd2b
Asia-Pacific 2-Aap2a

如果您想配置更多值,请参见 QingCloud CSI Chart 配置

Add-on 配置

将上面的 Chart 配置文件保存至本地(例如 /root/csi-qingcloud.yaml)。QingCloud CSI Add-on 配置可设为:

addons:
- name: csi-qingcloud
  namespace: kube-system
  sources:
    chart:
      name: csi-qingcloud
      repo: https://charts.kubesphere.io/test
      values: /root/csi-qingcloud.yaml

NFS Client

通过 NFS 服务器,您可以选择 NFS-client Provisioner 作为存储插件。NFS-client Provisioner 会动态创建 PersistentVolume。下面是使用带有 StorageClass 的 Helm Chart 安装 NFS-client Provisioner 的 KubeKey Add-on 配置示例。

Chart 配置

nfs:
  server: "192.168.0.27"    # <--ToBeReplaced->
  path: "/mnt/csi/"    # <--ToBeReplaced-> 
storageClass:
  defaultClass: false    

如果您想配置更多值,请参见 NFS-client Chart 配置

Add-on 配置

将上面的 Chart 配置文件保存至本地(例如 /root/nfs-client.yaml)。NFS-client Provisioner 的 Add-on 配置可设为:

addons:
- name: nfs-client
  namespace: kube-system
  sources:
    chart:
      name: nfs-client-provisioner
      repo: https://charts.kubesphere.io/main
      values: /root/nfs-client.yaml

Ceph

通过 Ceph 服务器,您可以选择 Ceph RBDCeph CSI 作为底层存储插件。Ceph RBD 是 Kubernetes 上的一个树内 (in-tree) 存储插件,Ceph CSI 是 CephFS RBD 的容器存储接口 (CSI) 驱动。

为 Ceph 选择一种插件

如果您使用 14.0.0 (Nautilus)+ Ceph 集群,建议优先选择 Ceph CSI RBD。部分理由如下:

  • 树内插件在未来会被弃用。
  • Ceph RBD 仅能在使用 hyperkube 镜像的 Kubernetes 上运行,而 hyperkube 镜像自 Kubernetes 1.17 开始已经被弃用
  • Ceph CSI 具有更多功能,例如克隆、扩容和快照。

Ceph CSI RBD

Ceph-CSI 需要安装在 1.14.0 以上版本的 Kubernetes 上,并与 14.0.0 (Nautilus)+ Ceph 集群一同运行。有关兼容性的详细信息,请参见 Ceph CSI 支持矩阵

下面是使用 Helm Chart 安装 Ceph CSI RBD 的 KubeKey Add-on 配置示例。由于 Chart 中未包含 StorageClass,需要在 Add-on 配置文件中配置一个 StorageClass。

Chart 配置

csiConfig:
  - clusterID: "cluster1"
    monitors:
      - "192.168.0.8:6789"     # <--TobeReplaced-->
      - "192.168.0.9:6789"     # <--TobeReplaced-->
      - "192.168.0.10:6789"    # <--TobeReplaced-->

如果您想配置更多值,请参见 Ceph CSI RBD Chart 配置

StorageClass(包括 Secret)

apiVersion: v1
kind: Secret
metadata:
  name: csi-rbd-secret
  namespace: kube-system
stringData:
  userID: admin
  userKey: "AQDoECFfYD3DGBAAm6CPhFS8TQ0Hn0aslTlovw=="    # <--ToBeReplaced-->
  encryptionPassphrase: test_passphrase
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: csi-rbd-sc
   annotations:
     storageclass.beta.kubernetes.io/is-default-class: "true"
     storageclass.kubesphere.io/supported-access-modes: '["ReadWriteOnce","ReadOnlyMany","ReadWriteMany"]'
provisioner: rbd.csi.ceph.com
parameters:
   clusterID: "cluster1"
   pool: "rbd"    # <--ToBeReplaced-->
   imageFeatures: layering
   csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
   csi.storage.k8s.io/provisioner-secret-namespace: kube-system
   csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secret
   csi.storage.k8s.io/controller-expand-secret-namespace: kube-system
   csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
   csi.storage.k8s.io/node-stage-secret-namespace: kube-system
   csi.storage.k8s.io/fstype: ext4
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
   - discard

Add-on 配置

将上面的 Chart 配置文件和 StorageClass 文件保存至本地(例如 /root/ceph-csi-rbd.yaml/root/ceph-csi-rbd-sc.yaml)。Add-on 配置可以设置为:

addons: 
- name: ceph-csi-rbd
  namespace: kube-system
  sources:
    chart:
      name: ceph-csi-rbd
      repo: https://ceph.github.io/csi-charts
      values: /root/ceph-csi-rbd.yaml
- name: ceph-csi-rbd-sc
  sources:
    yaml:
      path:
      - /root/ceph-csi-rbd-sc.yaml

Ceph RBD

KubeKey 不使用 hyperkube 镜像。因此,树内 Ceph RBD 可能无法在由 KubeKey 安装的 Kubernetes 上运行。不过,如果您的 Ceph 集群版本低于 14.0.0,即无法使用 Ceph CSI,则可以使用 RBD Provisioner 来替代 Ceph RBD。它的格式与树内 Ceph RBD 相同。下面是使用带有 StorageClass 的 Helm Chart 安装 RBD Provisioner 的 KubeKey Add-on 配置示例。

Chart 配置

ceph:
  mon: "192.168.0.12:6789"    # <--ToBeReplaced-->
  adminKey: "QVFBS1JkdGRvV0lySUJBQW5LaVpSKzBRY2tjWmd6UzRJdndmQ2c9PQ=="   # <--ToBeReplaced-->
  userKey: "QVFBS1JkdGRvV0lySUJBQW5LaVpSKzBRY2tjWmd6UzRJdndmQ2c9PQ=="    # <--ToBeReplaced-->
sc:
  isDefault: false

如果您想配置更多值,请参见 RBD Provisioner Chart 配置

Add-on 配置

将上面的 Chart 配置文件保存至本地(例如 /root/rbd-provisioner.yaml)。RBD Provisioner 的 Add-on 配置可设为:

- name: rbd-provisioner
  namespace: kube-system
  sources:
    chart:
      name: rbd-provisioner
      repo: https://charts.kubesphere.io/test
      values: /root/rbd-provisioner.yaml

Glusterfs

Glusterfs 是 Kubernetes 的一个树内存储插件。因此,需要安装 StorageClass。下面是 Glusterfs 的 KubeKey Add-on 配置示例。

StorageClass(包括 Secret)

apiVersion: v1
kind: Secret
metadata:
  name: heketi-secret
  namespace: kube-system
type: kubernetes.io/glusterfs
data:
  key: "MTIzNDU2"    # <--ToBeReplaced-->  
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  annotations:
    storageclass.beta.kubernetes.io/is-default-class: "true"
    storageclass.kubesphere.io/supported-access-modes: '["ReadWriteOnce","ReadOnlyMany","ReadWriteMany"]'
  name: glusterfs
parameters:
  clusterid: "21240a91145aee4d801661689383dcd1"    # <--ToBeReplaced--> 
  gidMax: "50000"
  gidMin: "40000"
  restauthenabled: "true"
  resturl: "http://192.168.0.14:8080"    # <--ToBeReplaced-->
  restuser: admin
  secretName: heketi-secret
  secretNamespace: kube-system
  volumetype: "replicate:2"    # <--ToBeReplaced--> 
provisioner: kubernetes.io/glusterfs
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true

Add-on 配置

将上面的 StorageClass YAML 文件保存至本地(例如 /root/glusterfs-sc.yaml)。Add-on 配置可以设置为:

- addon
- name: glusterfs
  sources:
    yaml:
      path:
      - /root/glusterfs-sc.yaml

OpenEBS/LocalVolumes

OpenEBS 动态本地 PV Provisioner 可以在节点上使用唯一的 HostPath(目录)来创建 Kubernetes 本地持久化存储卷,以持久存储数据。若用户没有专门的存储系统,可以用它方便地上手 KubeSphere。如果 KubeKey Add-on 的配置中没有默认 StorageClass,则会安装 OpenEBS/LocalVolumes。

多个存储

如果您想安装多个存储插件,请只将其中一个设置为默认,或者在 ClusterConfigurationspec.persistence.storageClass 中设置您想让 KubeSphere 使用的 StorageClass 名称。否则,ks-installer 将不清楚使用哪一个 StorageClass。