moodle程序需要通过k8s容器化部署,这里使用了企业版的k8s — 华为云CCE进行测试。因为moodle和常见的应用程序一样,会涉及两部分数据:
- 数据库数据:这里使用华为云服务RDS MySQL来承载;
- 应用数据:也就是moodledata数据,这部分通过使用外部存储来存放,存放的方式有三种,云硬盘(EVS)、对象存储(OBS)、共享存储(SFS Turbo)。
使用EVS时,无法实现数据在多个Pod之间的共享,这里只能运行单pod实例,OBS和SFS可以运行多pod实例。
一、单pod EVS方式运行
这里因为要测试三种方式,这里在RDS的实例里我已经创建好了三个库,后面测试的时候会用到这三个库。
这里直接给下创建的yaml文件:
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
description: ''
labels:
appgroup: ''
version: v1
name: moodleevs
namespace: default
spec:
selector:
matchLabels:
app: moodleevs
version: v1
template:
metadata:
annotations:
metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"","path":"","port":"","names":""}]'
labels:
app: moodleevs
version: v1
spec:
containers:
- image: 'swr.la-north-2.myhuaweicloud.com/hcie/moodle:v4'
name: container-0
resources:
requests:
cpu: 250m
memory: 512Mi
limits:
cpu: 1000m
memory: 1024Mi
env:
- name: PAAS_APP_NAME
value: moodleevs
- name: PAAS_NAMESPACE
value: default
- name: PAAS_PROJECT_ID
value: 0e0e5cabfa80f2892f17c00390299e63
- name: MOODLE_DATABASE_TYPE
value: mysqli
- name: MOODLE_DATABASE_HOST
value: 192.168.0.230
- name: MOODLE_DATABASE_USER
value: moodletest
- name: MOODLE_DATABASE_PASSWORD
value: Abc@123456
- name: MOODLE_DATABASE_NAME
value: moodle
volumeMounts:
- name: pvc-165706814685426547
mountPath: /bitnami/moodledata
readOnly: false
subPath: ''
imagePullSecrets:
- name: default-secret
terminationGracePeriodSeconds: 30
dnsPolicy: ClusterFirst
dnsConfig:
nameservers: []
options:
- name: timeout
value: ''
- name: ndots
value: '5'
- name: single-request-reopen
searches: []
volumes:
- persistentVolumeClaim:
claimName: pvc-165706814685426547
name: pvc-165706814685426547
affinity: {}
tolerations:
- key: node.kubernetes.io/not-ready
operator: Exists
effect: NoExecute
tolerationSeconds: 300
- key: node.kubernetes.io/unreachable
operator: Exists
effect: NoExecute
tolerationSeconds: 300
replicas: 1
minReadySeconds: 0
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
---
apiVersion: v1
kind: Service
metadata:
name: moodleevs
labels:
app: moodleevs
namespace: default
annotations: {}
spec:
selector:
app: moodleevs
externalTrafficPolicy: Cluster
ports:
- name: cce-service-0
targetPort: 8080
nodePort: 0
port: 8080
protocol: TCP
type: NodePort
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc-165706814685426547
namespace: default
annotations:
everest.io/disk-volume-type: SAS
enable: true
labels:
failure-domain.beta.kubernetes.io/zone: la-north-2a
failure-domain.beta.kubernetes.io/region: la-north-2
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
storageClassName: csi-disk
注意,这里的ENV部分,对应的moodle连接的数据库,都是通过这些环境变量传过去的。
创建完成后,需要等待1-2分钟,通过日志确认已经完成安装,就可以通过nodeport对应的链接信息登录使用了,默认登录用户名是user,密码是bitnami。
二、OBS方式运行
OBS方式这里是不推荐的,除非前端有CDN,因为IO性能太差,SFS和EVS 1-2分钟可以安装完成,OBS需要7-9分钟左右。而且OBS仅支持并行文件系统,不支持对象桶。
这里先例下对应的yaml文件:
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
description: ''
labels:
appgroup: ''
version: v1
name: moodleobs
namespace: default
spec:
selector:
matchLabels:
app: moodleobs
version: v1
template:
metadata:
annotations:
metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"","path":"","port":"","names":""}]'
labels:
app: moodleobs
version: v1
spec:
containers:
- image: 'swr.la-north-2.myhuaweicloud.com/hcie/moodle:v4'
name: container-0
resources:
requests:
cpu: 250m
memory: 512Mi
limits:
cpu: 1000m
memory: 1024Mi
env:
- name: PAAS_APP_NAME
value: moodleobs
- name: PAAS_NAMESPACE
value: default
- name: PAAS_PROJECT_ID
value: 0e0e5cabfa80f2892f17c00390299e63
- name: MOODLE_DATABASE_TYPE
value: mysqli
- name: MOODLE_DATABASE_HOST
value: 192.168.0.230
- name: MOODLE_DATABASE_USER
value: moodletest
- name: MOODLE_DATABASE_PASSWORD
value: Abc@123456
- name: MOODLE_DATABASE_NAME
value: moodle2
volumeMounts:
- name: pvc-165707103684028570
mountPath: /bitnami/moodledata
readOnly: false
subPath: ''
imagePullSecrets:
- name: default-secret
terminationGracePeriodSeconds: 30
dnsPolicy: ClusterFirst
dnsConfig:
nameservers: []
options:
- name: timeout
value: ''
- name: ndots
value: '5'
- name: single-request-reopen
searches: []
volumes:
- persistentVolumeClaim:
claimName: pvc-165707103684028570
name: pvc-165707103684028570
affinity: {}
tolerations:
- key: node.kubernetes.io/not-ready
operator: Exists
effect: NoExecute
tolerationSeconds: 300
- key: node.kubernetes.io/unreachable
operator: Exists
effect: NoExecute
tolerationSeconds: 300
replicas: 1
minReadySeconds: 0
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 0
maxUnavailable: 1
---
apiVersion: v1
kind: Service
metadata:
name: moodleobs
labels:
app: moodleobs
namespace: default
annotations: {}
spec:
selector:
app: moodleobs
externalTrafficPolicy: Cluster
ports:
- name: cce-service-0
targetPort: 8080
nodePort: 0
port: 8080
protocol: TCP
type: NodePort
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc-165707103684028570
namespace: default
annotations:
everest.io/obs-volume-type: STANDARD
csi.storage.k8s.io/fstype: obsfs
enable: true
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: csi-obs
这里需要注意,此时的moodle还是仅支持单pod,如果需要支持多pod需要增加一个环境变量,MOODLE_SKIP_BOOTSTRAP="yes"
。如下:
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的存储配置里:
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
description: ''
labels:
appgroup: ''
version: v1
name: moodlesfs
namespace: default
spec:
selector:
matchLabels:
app: moodlesfs
version: v1
template:
metadata:
annotations:
metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"","path":"","port":"","names":""}]'
labels:
app: moodlesfs
version: v1
spec:
containers:
- image: 'swr.la-north-2.myhuaweicloud.com/hcie/moodle:v4'
name: container-0
resources:
requests:
cpu: 250m
memory: 512Mi
limits:
cpu: 1000m
memory: 1024Mi
env:
- name: PAAS_APP_NAME
value: moodlesfs
- name: PAAS_NAMESPACE
value: default
- name: PAAS_PROJECT_ID
value: 0e0e5cabfa80f2892f17c00390299e63
- name: MOODLE_DATABASE_TYPE
value: mysqli
- name: MOODLE_DATABASE_HOST
value: 192.168.0.230
- name: MOODLE_DATABASE_USER
value: moodletest
- name: MOODLE_DATABASE_PASSWORD
value: Abc@123456
- name: MOODLE_DATABASE_NAME
value: moodle
- name: MOODLE_SKIP_BOOTSTRAP //该变量首次增加时不使用,单pod启动后,再增加
value: yes
volumeMounts:
- name: cce-efs-import-l58s9guz-cof0
mountPath: /bitnami/moodledata
readOnly: false
subPath: ''
imagePullSecrets:
- name: default-secret
terminationGracePeriodSeconds: 30
dnsPolicy: ClusterFirst
dnsConfig:
nameservers: []
options:
- name: timeout
value: ''
- name: ndots
value: '5'
- name: single-request-reopen
searches: []
volumes:
- persistentVolumeClaim:
claimName: cce-efs-import-l58s9guz-cof0
name: cce-efs-import-l58s9guz-cof0
affinity: {}
tolerations:
- key: node.kubernetes.io/not-ready
operator: Exists
effect: NoExecute
tolerationSeconds: 300
- key: node.kubernetes.io/unreachable
operator: Exists
effect: NoExecute
tolerationSeconds: 300
replicas: 1
minReadySeconds: 0
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 0
maxUnavailable: 1
---
apiVersion: v1
kind: Service
metadata:
name: moodlesfs
labels:
app: moodlesfs
namespace: default
annotations: {}
spec:
selector:
app: moodlesfs
externalTrafficPolicy: Cluster
ports:
- name: cce-service-0
targetPort: 8080
nodePort: 0
port: 8080
protocol: TCP
type: NodePort
四、总结
因为配置比较简单,这里没有太多变化的东西,这里对于存储速度需要总结下,三者之间的访问速度是:
EVS > SFS Turbo > OBS
三者的区别如下:
对比维度 |
对象存储服务 |
云硬盘 |
弹性文件服务 |
---|---|---|---|
概念 |
提供海量、安全、高可靠、低成本的数据存储能力,可供用户存储任意类型和大小的数据。 |
可以为云服务器提供高可靠、高性能、规格丰富并且可弹性扩展的块存储服务,可满足不同场景的业务需求。云硬盘就类似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级别 |
是否支持数据共享 |
是 |
是 |
是 |
是否支持远程访问 |
是 |
否 |
是 |
是否支持在线编辑 |
否 |
是 |
是 |
是否能单独使用 |
是 |
否 |
是 |