华为云CCE部署moodle程序

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

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

moodle-cce

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

一、单pod EVS方式运行

rds-mysql

这里因为要测试三种方式,这里在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-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

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

三者的区别如下:

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级别

是否支持数据共享

是否支持远程访问

是否支持在线编辑

是否能单独使用

发表评论

您的电子邮箱地址不会被公开。