更新时间:2024-09-29 GMT+08:00

步骤1:部署MySQL

WordPress需配合MySQL一起使用,WordPress运行内容管理程序,MySQL作为数据库存储数据。

前提条件

已创建一个包含4核8G节点的CCE集群。创建集群的方法,请参见快速创建Kubernetes集群

通过控制台创建MySQL

  1. 登录CCE控制台
  2. 单击集群进入集群控制台。
  3. 在左侧菜单栏选择“工作负载”,单击右上角“创建工作负载”
  4. 填写工作负载基本信息。

    • 负载类型:选择有状态负载。
    • 负载名称:mysql。
    • 命名空间:default。
    • 实例数量:本例中修改数量为1,即创建单实例的MySQL。
    图1 MySQL工作负载基本信息

  5. 填写容器基本信息。

    在基本信息中单击“选择镜像”,在弹出的窗口中选择“镜像中心”,并搜索“mysql”,选择mysql镜像,并设置镜像版本为“5.7”

    图2 选择镜像版本

  6. “环境变量”下添加如下环境变量,此处一共需要设置四个环境变量。您可以在MySQL查看MySQL可以设置哪些环境变量。

    • MYSQL_ROOT_PASSWORD:MySQL的root用户密码,可自定义。
    • MYSQL_DATABASE:镜像启动时要创建的数据库名称,可自定义。
    • MYSQL_USER:数据库用户名称,可自定义。
    • MYSQL_PASSWORD:数据库用户密码,可自定义。
    图3 设置环境变量

  7. “生命周期”下设置“启动命令”,如图4

    • 运行命令:
      /bin/bash
    • 运行参数:
      -c
      rm -rf /var/lib/mysql/lost+found;docker-entrypoint.sh mysqld;
    图4 设置启动命令

  8. 在“数据存储”下选择“动态挂载 (VolumeClaimTemplate)”,添加云硬盘存储作为MySQL的存储。

    单击“创建存储卷声明PVC”,并填写以下关键参数,其余参数可保持默认:

    • 存储卷声明类型:选择“云硬盘”类型。
    • PVC名称:自定义PVC名称,如mysql。
    • 创建方式:仅支持“动态创建”。
    • 存储类:默认为csi-disk。
    • 可用区:选择一个可用区,云硬盘只能挂载到同一可用区的节点上,创建后不支持更换可用区,请谨慎选择。
    • 云硬盘类型:请根据需求自定义选择合适的云硬盘类型。
    • 容量(GiB):请根据需求填写容量,默认为10GiB。

    单击“创建”,然后填写存储挂载到容器的路径, MySQL默认使用的路径为“/var/lib/mysql”

    图5 挂载mysql存储

  9. “实例间发现服务配置”设置Headless Service。

    有状态负载需要配置一个用于实例间发现的Headless Service,Headless Service会生成每个Pod的集群DNS地址,可以实现对有状态负载某个特定实例的访问,对于多副本具有主副关系的MySQL 数据库,需要使用Headless Service对MySQL主服务器进行读写,并对其他副本进行数据复制。本示例中MySQL为单实例,因此并未使用Headless Service的相关功能,填写3306端口即可。关于多实例MySQL的示例请参见运行一个有状态的应用程序
    图6 Headless Service

  10. “服务配置”中单击加号,创建服务(Service),用于从WordPress访问MySQL。

    访问类型选择集群内访问(ClusterIP),服务名称设置为mysql,容器端口和服务端口都配置为3306,单击“确定”

    mysql镜像的默认访问端口默认为3306,所以容器端口的ID设置为3306,访问端口可以设置为其他端口号,但这里也设置成3306是为了方便使用。

    这样在集群内部,通过服务名称:访问端口就可以访问MySQL负载,也就是mysql:3306

    图7 创建服务

  11. 单击右下角“创建工作负载”

    等待工作负载创建成功。

    创建成功后在有状态负载下会显示一个运行中的工作负载。

    图8 MySQL负载创建成功

通过kubectl创建MySQL

本步骤指导您通过kubectl创建一个有状态工作负载(StatefulSet),并通过集群内访问类型Service将负载公开,使得其能在集群内通过Service访问。

  1. 请参见通过kubectl连接集群,使用kubectl连接集群。
  2. 创建一个名为mysql.yaml的描述文件。其中,mysql.yaml为自定义名称,您可以随意命名。

    vi mysql.yaml

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: mysql
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mysql
          version: v1
      template:
        metadata:
          labels:
            app: mysql
            version: v1
        spec:
          containers:
            - name: container-1
              image: mysql:5.7
              command:
                - /bin/bash
              args:
                - '-c'
                - rm -rf /var/lib/mysql/lost+found;docker-entrypoint.sh mysqld;
              env:
                - name: MYSQL_ROOT_PASSWORD  # MySQL的root用户密码,可自定义
                  value: password@123
                - name: MYSQL_DATABASE       # 镜像启动时要创建的数据库名称,可自定义
                  value: database
                - name: MYSQL_USER           # 数据库用户名称,可自定义
                  value: db_user
                - name: MYSQL_PASSWORD       # 数据库用户密码,可自定义
                  value: password@123
              resources:
                requests:
                  cpu: 250m
                  memory: 512Mi
                limits:
                  cpu: 250m
                  memory: 512Mi
              volumeMounts:
                - name: mysql
                  mountPath: /var/lib/mysql
          imagePullSecrets:
            - name: default-secret
      serviceName: headless-mysql
      volumeClaimTemplates:  #动态挂载云硬盘示例
        - apiVersion: v1
          kind: PersistentVolumeClaim
          metadata:
            name: mysql
            namespace: default
            annotations:
              everest.io/disk-volume-type: SAS  # 云硬盘的类型
            labels:
              failure-domain.beta.kubernetes.io/region: ap-southeast-1  #云硬盘所在的区域
              failure-domain.beta.kubernetes.io/zone:    #云硬盘所在的可用区,必须和工作负载部署的节点可用区一致
          spec:
            accessModes:
              - ReadWriteOnce  # 云硬盘必须为ReadWriteOnce
            resources:
              requests:
                storage: 10Gi
            storageClassName: csi-disk  # StorageClass的名称,云硬盘为csi-disk
    
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: headless-mysql
      namespace: default
      labels:
        app: mysql
        version: v1
    spec:
      selector:
        app: mysql
        version: v1
      clusterIP: None
      ports:
        - name: mysql
          protocol: TCP
          port: 3306
          targetPort: 3306
      type: ClusterIP

  3. 创建MySQL。

    kubectl apply -f mysql.yaml

    回显如下表示已开始创建负载。

    statefulset "mysql" created

    查看工作负载状态。

    kubectl get statefulset

    状态显示为Running,表示工作负载已创建成功。

    NAME           READY     UP-TO-DATE   AVAILABLE   AGE 
    mysql          1/1       1            1           4m5s

  4. 创建一个名为mysql-service.yaml的描述文件。其中,mysql-service.yaml为自定义名称,您可以随意命名。

    vi mysql-service.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: mysql
      namespace: default
    spec:
      selector:
        app: mysql
        version: v1
      ports:
        - name: cce-service-0
          targetPort: 3306
          nodePort: 0
          port: 3306
          protocol: TCP
      type: ClusterIP

  5. 创建服务。

    kubectl create -f mysql-service.yaml

    回显如下,表示服务已创建。

    service/mysql created

    kubectl get svc

    回显如下,表示工作负载访问方式已设置成功,工作负载可访问。

    NAME         TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
    kubernetes   ClusterIP      10.247.0.1       <none>        443/TCP          3d
    mysql        ClusterIP    10.247.202.20     <none>        3306/TCP        51s