这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

网络存储

1 - NFS服务

本文档介绍了如何在 KubeCube 上接入 NFS 服务。

准备工作

登录 NFS 服务器

  1. 通过 NFS 导出文件为 KubeCube 分配服务器访问权限

    修改 /etc/exports 文件,添加 {导出目录} {KubeCube应用所在节点IP}(rw,sync,no_subtree_check,insecure)。如:

    nfs-6

  2. 重新启动 NFS 服务器

    systemctl restart nfs-kernel-server
    
  3. 为 KubeCube 打开防火墙

    ufw allow from {KubeCube所在节点IP} to any port nfs
    

登录 K8s 集群 worker 节点

  1. 安装 NFS Common

    apt-get install nfs-commonyum install nfs-utils等。

  2. 修改/etc/kubernetes/manifests/kube-apiserver.yaml文件,添加- --feature-gates=RemoveSelfLink=false

创建 StorageClass

登录 KubeCube 所在节点,创建以下文件并 apply,请根据实际环境修改部分参数。

配置 account 及相关权限

apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default        #根据实际环境设定namespace,下面类同
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-client-provisioner-runner
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-nfs-client-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    # replace with namespace where provisioner is deployed
    namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-client-provisioner-runner
  apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
    # replace with namespace where provisioner is deployed
  namespace: default
rules:
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    # replace with namespace where provisioner is deployed
    namespace: default
roleRef:
  kind: Role
  name: leader-locking-nfs-client-provisioner
  apiGroup: rbac.authorization.k8s.io

创建 NFS Provisioner

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  labels:
    app: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default  #与RBAC文件中的namespace保持一致
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs-client-provisioner
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          image: quay.io/external_storage/nfs-client-provisioner:latest
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: qgg-nfs-storage  #provisioner名称,请确保该名称与 nfs-StorageClass.yaml文件中的provisioner名称保持一致
            - name: NFS_SERVER
              value: 10.173.32.164   #NFS Server IP地址
            - name: NFS_PATH  
              value: /mnt/linuxidc    #NFS挂载卷
      volumes:
        - name: nfs-client-root
          nfs:
            server: 10.173.32.164  #NFS Server IP地址
            path: /mnt/linuxidc     #NFS 挂载卷

创建 StorageClass

方式一:命令行操作

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: managed-nfs-storage
provisioner: qgg-nfs-storage #这里的名称要和provisioner配置文件中的环境变量PROVISIONER_NAME保持一致
parameters:  	      
  archiveOnDelete: "false"

方式二:页面操作

  1. 以平台管理员身份登录 KubeCube;
  2. 展开左侧菜单栏里的【资源管理】,点击【集群管理】进入集群管理页面,点击需要创建 StorageClass 的集群名称,进入集群详情页面,点击【存储类别】进入存储类别管理页面,点击【创建存储类别】,将方式一中的文件内容写入,点击【确定】,即创建出该 StorageClass。

nfs-1

创建 PVC

在控制台页面,选择租户和项目,选择集群和空间,点击左侧菜单栏【存储】进入存储管理页面。点击【创建存储声明】,存储类别可以选择已创建过的 StorageClass。

nfs-2

创建后可以看到 PVC 状态为 Bound。具体配置说明见 PVC管理

nfs-3

创建工作负载

在创建工作负载时,点击【展开更多配置】-【挂载数据卷】-【PVC】-【参数】,可以选择上述创建的 PVC。

nfs-4

具体配置说明见 工作负载管理

检查结果

创建挂载 PVC 的工作负载后,登录 NFS 服务器,进入导出目录,可以看到已经创建出一个新的文件夹,文件夹命名为 ${namespace}-${pvcName}-${pvName}。

nfs-5

2 - Ceph集群

本文档介绍了如何在 KubeCube 上接入 Ceph 集群。

示例环境说明

产品版本
Kubernetesv1.20.9
KubeCubev1.0.2
Ceph15.2.1

准备工作

登录 Ceph master 节点

  1. 获取管理 key

    ceph auth get-key client.admin | base64
    
  2. 在 Ceph 集群中创建一个 KubeCube 专用的 pool 和用户

    ceph osd pool create kube 8 8
    ceph auth get-or-create client.kube mon 'allow r' osd 'allow class-read object_prefix rbd
    
  3. 获取该用户 key

    ceph auth get-key client.kube|base64
    

登录 K8s 集群 worker 节点

  1. 安装 ceph-common

    apt-get install ceph-commonyum install ceph-common等。

  2. 使用外部的 Provisioner 提供服务

    git clone https://github.com/kubernetes-incubator/external-storage.git    # v5.5.0
    cd external-storage/ceph/rbd/deploy 
    sed -r -i "s/namespace: [^ ]+/namespace: kube-system/g" ./rbac/clusterrolebinding.yaml ./rbac/rolebinding.yaml 
    kubectl -n kube-system apply -f ./rbac
    

创建 Secret

登录 KubeCube 所在节点,执行以下命令:

# 替换为 Ceph 集群生成的 key
kubectl create secret generic ceph-secret --type="kubernetes.io/rbd" --from-literal=key='QVFEcGpqbGhqczJnQWhBQTByN3NNbHB4cTAwdGR1eWdqWk1LaUE9PQ==' --namespace=kube-system
kubectl create secret generic ceph-kube-secret --type="kubernetes.io/rbd" --from-literal=key='QVFDTHhUcGhMS0VMQWhBQWx3NU1MNzZneVRpR1dNYVdVckgxN0E9PQ==' --namespace=default

创建 StorageClass

方式一:命令行操作

vi sc.yaml 文件并 apply,以下为示例,需要根据 Ceph 集群信息修改参数。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ceph-rbd
  annotations:
     storageclass.beta.kubernetes.io/is-default-class: "true"
provisioner: ceph.com/rbd
parameters:
  monitors: 10.173.32.173:6789  #修改成实际 Ceph Monitor IP
  adminId: admin
  adminSecretName: ceph-secret
  adminSecretNamespace: kube-system
  pool: kube
  userId: kube
  userSecretName: ceph-kube-secret
  userSecretNamespace: default
  fsType: ext4
  imageFormat: "2"
  imageFeatures: "layering"

关于上面的 adminId 等字段的具体含义请参考 Ceph RBD

方式二:页面操作

  1. 以平台管理员身份登录 KubeCube;
  2. 展开左侧菜单栏里的【资源管理】,点击【集群管理】进入集群管理页面,点击需要创建 StorageClass 的集群名称,进入集群详情页面,点击【存储类别】进入存储类别管理页面,点击【创建存储类别】,将方式一中的文件内容写入,点击【确定】,即创建出该 StorageClass。

ceph-1

创建 PVC

在控制台页面,选择租户和项目,选择集群和空间,点击左侧菜单栏【存储】进入存储管理页面。点击【创建存储声明】,存储类别选择 Ceph 对应的 StorageClass。

nfs-2

创建后可以看到 PVC 状态为 Bound。具体配置说明见 PVC管理

创建工作负载

在创建工作负载时,点击【展开更多配置】-【挂载数据卷】-【PVC】-【参数】,可以选择上述创建的 PVC。

nfs-4

具体配置说明见 工作负载管理

检查结果

检查相关 pod 是否正常运行,如果正常则配置成功。