moodle程序需要通过k8s容器化部署,这里使用了企业版的k8s — 华为云CCE进行测试。因为moodle和常见的应用程序一样,会涉及两部分数据:

  • 数据库数据:这里使用华为云服务RDS MySQL来承载;
  • 应用数据:也就是moodledata数据,这部分通过使用外部存储来存放,存放的方式有三种,云硬盘(EVS)、对象存储(OBS)、共享存储(SFS Turbo)。

moodle-cce
moodle-cce

使用EVS时,无法实现数据在多个Pod之间的共享,这里只能运行单pod实例,OBS和SFS可以运行多pod实例。

一、单pod EVS方式运行

rds-mysql
rds-mysql

这里因为要测试三种方式,这里在RDS的实例里我已经创建好了三个库,后面测试的时候会用到这三个库。

这里直接给下创建的yaml文件:

  1apiVersion: apps/v1
  2kind: Deployment
  3metadata:
  4  annotations:
  5    description: ''
  6  labels:
  7    appgroup: ''
  8    version: v1
  9  name: moodleevs
 10  namespace: default
 11spec:
 12  selector:
 13    matchLabels:
 14      app: moodleevs
 15      version: v1
 16  template:
 17    metadata:
 18      annotations:
 19        metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"","path":"","port":"","names":""}]'
 20      labels:
 21        app: moodleevs
 22        version: v1
 23    spec:
 24      containers:
 25        - image: 'swr.la-north-2.myhuaweicloud.com/hcie/moodle:v4'
 26          name: container-0
 27          resources:
 28            requests:
 29              cpu: 250m
 30              memory: 512Mi
 31            limits:
 32              cpu: 1000m
 33              memory: 1024Mi
 34          env:
 35            - name: PAAS_APP_NAME
 36              value: moodleevs
 37            - name: PAAS_NAMESPACE
 38              value: default
 39            - name: PAAS_PROJECT_ID
 40              value: 0e0e5cabfa80f2892f17c00390299e63
 41            - name: MOODLE_DATABASE_TYPE
 42              value: mysqli
 43            - name: MOODLE_DATABASE_HOST
 44              value: 192.168.0.230
 45            - name: MOODLE_DATABASE_USER
 46              value: moodletest
 47            - name: MOODLE_DATABASE_PASSWORD
 48              value: Abc@123456
 49            - name: MOODLE_DATABASE_NAME
 50              value: moodle
 51          volumeMounts:
 52            - name: pvc-165706814685426547
 53              mountPath: /bitnami/moodledata
 54              readOnly: false
 55              subPath: ''
 56      imagePullSecrets:
 57        - name: default-secret
 58      terminationGracePeriodSeconds: 30
 59      dnsPolicy: ClusterFirst
 60      dnsConfig:
 61        nameservers: []
 62        options:
 63          - name: timeout
 64            value: ''
 65          - name: ndots
 66            value: '5'
 67          - name: single-request-reopen
 68        searches: []
 69      volumes:
 70        - persistentVolumeClaim:
 71            claimName: pvc-165706814685426547
 72          name: pvc-165706814685426547
 73      affinity: {}
 74      tolerations:
 75        - key: node.kubernetes.io/not-ready
 76          operator: Exists
 77          effect: NoExecute
 78          tolerationSeconds: 300
 79        - key: node.kubernetes.io/unreachable
 80          operator: Exists
 81          effect: NoExecute
 82          tolerationSeconds: 300
 83  replicas: 1
 84  minReadySeconds: 0
 85  strategy:
 86    type: RollingUpdate
 87    rollingUpdate:
 88      maxSurge: 1
 89      maxUnavailable: 1
 90
 91---
 92apiVersion: v1
 93kind: Service
 94metadata:
 95  name: moodleevs
 96  labels:
 97    app: moodleevs
 98  namespace: default
 99  annotations: {}
100spec:
101  selector:
102    app: moodleevs
103  externalTrafficPolicy: Cluster
104  ports:
105    - name: cce-service-0
106      targetPort: 8080
107      nodePort: 0
108      port: 8080
109      protocol: TCP
110  type: NodePort
111
112---
113kind: PersistentVolumeClaim
114apiVersion: v1
115metadata:
116  name: pvc-165706814685426547
117  namespace: default
118  annotations:
119    everest.io/disk-volume-type: SAS
120  enable: true
121  labels:
122    failure-domain.beta.kubernetes.io/zone: la-north-2a
123    failure-domain.beta.kubernetes.io/region: la-north-2
124spec:
125  accessModes:
126    - ReadWriteOnce
127  resources:
128    requests:
129      storage: 20Gi
130  storageClassName: csi-disk

注意,这里的ENV部分,对应的moodle连接的数据库,都是通过这些环境变量传过去的。

创建完成后,需要等待1-2分钟,通过日志确认已经完成安装,就可以通过nodeport对应的链接信息登录使用了,默认登录用户名是user,密码是bitnami。

二、OBS方式运行

OBS方式这里是不推荐的,除非前端有CDN,因为IO性能太差,SFS和EVS 1-2分钟可以安装完成,OBS需要7-9分钟左右。而且OBS仅支持并行文件系统,不支持对象桶。

这里先例下对应的yaml文件:

  1apiVersion: apps/v1
  2kind: Deployment
  3metadata:
  4  annotations:
  5    description: ''
  6  labels:
  7    appgroup: ''
  8    version: v1
  9  name: moodleobs
 10  namespace: default
 11spec:
 12  selector:
 13    matchLabels:
 14      app: moodleobs
 15      version: v1
 16  template:
 17    metadata:
 18      annotations:
 19        metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"","path":"","port":"","names":""}]'
 20      labels:
 21        app: moodleobs
 22        version: v1
 23    spec:
 24      containers:
 25        - image: 'swr.la-north-2.myhuaweicloud.com/hcie/moodle:v4'
 26          name: container-0
 27          resources:
 28            requests:
 29              cpu: 250m
 30              memory: 512Mi
 31            limits:
 32              cpu: 1000m
 33              memory: 1024Mi
 34          env:
 35            - name: PAAS_APP_NAME
 36              value: moodleobs
 37            - name: PAAS_NAMESPACE
 38              value: default
 39            - name: PAAS_PROJECT_ID
 40              value: 0e0e5cabfa80f2892f17c00390299e63
 41            - name: MOODLE_DATABASE_TYPE
 42              value: mysqli
 43            - name: MOODLE_DATABASE_HOST
 44              value: 192.168.0.230
 45            - name: MOODLE_DATABASE_USER
 46              value: moodletest
 47            - name: MOODLE_DATABASE_PASSWORD
 48              value: Abc@123456
 49            - name: MOODLE_DATABASE_NAME
 50              value: moodle2
 51          volumeMounts:
 52            - name: pvc-165707103684028570
 53              mountPath: /bitnami/moodledata
 54              readOnly: false
 55              subPath: ''
 56      imagePullSecrets:
 57        - name: default-secret
 58      terminationGracePeriodSeconds: 30
 59      dnsPolicy: ClusterFirst
 60      dnsConfig:
 61        nameservers: []
 62        options:
 63          - name: timeout
 64            value: ''
 65          - name: ndots
 66            value: '5'
 67          - name: single-request-reopen
 68        searches: []
 69      volumes:
 70        - persistentVolumeClaim:
 71            claimName: pvc-165707103684028570
 72          name: pvc-165707103684028570
 73      affinity: {}
 74      tolerations:
 75        - key: node.kubernetes.io/not-ready
 76          operator: Exists
 77          effect: NoExecute
 78          tolerationSeconds: 300
 79        - key: node.kubernetes.io/unreachable
 80          operator: Exists
 81          effect: NoExecute
 82          tolerationSeconds: 300
 83  replicas: 1
 84  minReadySeconds: 0
 85  strategy:
 86    type: RollingUpdate
 87    rollingUpdate:
 88      maxSurge: 0
 89      maxUnavailable: 1
 90
 91---
 92apiVersion: v1
 93kind: Service
 94metadata:
 95  name: moodleobs
 96  labels:
 97    app: moodleobs
 98  namespace: default
 99  annotations: {}
100spec:
101  selector:
102    app: moodleobs
103  externalTrafficPolicy: Cluster
104  ports:
105    - name: cce-service-0
106      targetPort: 8080
107      nodePort: 0
108      port: 8080
109      protocol: TCP
110  type: NodePort
111
112---
113kind: PersistentVolumeClaim
114apiVersion: v1
115metadata:
116  name: pvc-165707103684028570
117  namespace: default
118  annotations:
119    everest.io/obs-volume-type: STANDARD
120    csi.storage.k8s.io/fstype: obsfs
121  enable: true
122spec:
123  accessModes:
124    - ReadWriteMany
125  resources:
126    requests:
127      storage: 1Gi
128  storageClassName: csi-obs

这里需要注意,此时的moodle还是仅支持单pod,如果需要支持多pod需要增加一个环境变量,MOODLE_SKIP_BOOTSTRAP="yes" 。如下:

moodle-pods
moodle-pods

MOODLE_SKIP_BOOTSTRAP: Do not initialize the Moodle database for a new deployment. This is necessary in case you use a database that already has Moodle data. Default: no

三、使用SFS Turbo存储

这里的配置和OBS的配置类似,只不过需要提前创建SFS Turbo存储,在标准版里,这里的最小存储空间是500G,在标准型增强版里,最小空间大小是10240G,这点需要注意下。

创建完成后,需要导入到CCE的存储配置里:

cce-import-sfs
cce-import-sfs

  1apiVersion: apps/v1
  2kind: Deployment
  3metadata:
  4  annotations:
  5    description: ''
  6  labels:
  7    appgroup: ''
  8    version: v1
  9  name: moodlesfs
 10  namespace: default
 11spec:
 12  selector:
 13    matchLabels:
 14      app: moodlesfs
 15      version: v1
 16  template:
 17    metadata:
 18      annotations:
 19        metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"","path":"","port":"","names":""}]'
 20      labels:
 21        app: moodlesfs
 22        version: v1
 23    spec:
 24      containers:
 25        - image: 'swr.la-north-2.myhuaweicloud.com/hcie/moodle:v4'
 26          name: container-0
 27          resources:
 28            requests:
 29              cpu: 250m
 30              memory: 512Mi
 31            limits:
 32              cpu: 1000m
 33              memory: 1024Mi
 34          env:
 35            - name: PAAS_APP_NAME
 36              value: moodlesfs
 37            - name: PAAS_NAMESPACE
 38              value: default
 39            - name: PAAS_PROJECT_ID
 40              value: 0e0e5cabfa80f2892f17c00390299e63
 41            - name: MOODLE_DATABASE_TYPE
 42              value: mysqli
 43            - name: MOODLE_DATABASE_HOST
 44              value: 192.168.0.230
 45            - name: MOODLE_DATABASE_USER
 46              value: moodletest
 47            - name: MOODLE_DATABASE_PASSWORD
 48              value: Abc@123456
 49            - name: MOODLE_DATABASE_NAME
 50              value: moodle
 51            - name: MOODLE_SKIP_BOOTSTRAP  //该变量首次增加时不使用,单pod启动后,再增加
 52              value: yes
 53          volumeMounts:
 54            - name: cce-efs-import-l58s9guz-cof0
 55              mountPath: /bitnami/moodledata
 56              readOnly: false
 57              subPath: ''
 58      imagePullSecrets:
 59        - name: default-secret
 60      terminationGracePeriodSeconds: 30
 61      dnsPolicy: ClusterFirst
 62      dnsConfig:
 63        nameservers: []
 64        options:
 65          - name: timeout
 66            value: ''
 67          - name: ndots
 68            value: '5'
 69          - name: single-request-reopen
 70        searches: []
 71      volumes:
 72        - persistentVolumeClaim:
 73            claimName: cce-efs-import-l58s9guz-cof0
 74          name: cce-efs-import-l58s9guz-cof0
 75      affinity: {}
 76      tolerations:
 77        - key: node.kubernetes.io/not-ready
 78          operator: Exists
 79          effect: NoExecute
 80          tolerationSeconds: 300
 81        - key: node.kubernetes.io/unreachable
 82          operator: Exists
 83          effect: NoExecute
 84          tolerationSeconds: 300
 85  replicas: 1
 86  minReadySeconds: 0
 87  strategy:
 88    type: RollingUpdate
 89    rollingUpdate:
 90      maxSurge: 0
 91      maxUnavailable: 1
 92
 93---
 94apiVersion: v1
 95kind: Service
 96metadata:
 97  name: moodlesfs
 98  labels:
 99    app: moodlesfs
100  namespace: default
101  annotations: {}
102spec:
103  selector:
104    app: moodlesfs
105  externalTrafficPolicy: Cluster
106  ports:
107    - name: cce-service-0
108      targetPort: 8080
109      nodePort: 0
110      port: 8080
111      protocol: TCP
112  type: NodePort

四、总结

因为配置比较简单,这里没有太多变化的东西,这里对于存储速度需要总结下,三者之间的访问速度是:
EVS > SFS Turbo > OBS

三者的区别如下:

OBS、EVS、SFS服务对比

对比维度 对象存储服务 云硬盘 弹性文件服务
概念 提供海量、安全、高可靠、低成本的数据存储能力,可供用户存储任意类型和大小的数据。 可以为云服务器提供高可靠、高性能、规格丰富并且可弹性扩展的块存储服务,可满足不同场景的业务需求。云硬盘就类似PC中的硬盘。 提供按需扩展的高性能文件存储,可为云上多个云服务器提供共享访问。弹性文件服务就类似Windows或Linux中的远程目录。
存储数据的逻辑 存放的是对象,可以直接存放文件,文件会自动产生对应的系统元数据,用户也可以自定义文件的元数据。 存放的是二进制数据,无法直接存放文件,如果需要存放文件,需要先格式化文件系统后使用。 存放的是文件,会以文件和文件夹的层次结构来整理和呈现数据。
访问方式 可以通过互联网或专线访问。需要指定桶地址进行访问,使用的是HTTP和HTTPS等传输协议。 只能在ECS/BMS中挂载使用,不能被操作系统应用直接访问,需要格式化成文件系统进行访问。 在ECS/BMS中通过网络协议挂载使用,支持NFS和CIFS的网络协议。需要指定网络地址进行访问,也可以将网络地址映射为本地目录后进行访问。
使用场景 如大数据分析、静态网站托管、在线视频点播、基因测序和智能视频监控等。 如高性能计算、企业核心集群应用、企业应用系统和开发测试等。
说明:
高性能计算:主要是高速率、高IOPS的需求,用于作为高性能存储,比如工业设计、能源勘探这些。
如高性能计算、媒体处理、文件共享和内容管理和Web服务等。
说明:
高性能计算:主要是高带宽的需求,用于共享文件存储,比如基因测序、图片渲染这些。
容量 EB级别 TB级别 PB级别
时延 10ms 1~2ms 3~10ms
IOPS/TPS 千万级 单盘 33K 单文件系统 10K
带宽 TB/s级别 MB/s级别 GB/s级别
是否支持数据共享
是否支持远程访问
是否支持在线编辑
是否能单独使用