首页
社区
课程
招聘
[原创]学习Kubernetes笔记——部署数据库站点(MySql)
发表于: 2022-12-31 14:47 20471

[原创]学习Kubernetes笔记——部署数据库站点(MySql)

2022-12-31 14:47
20471

进入k8s集群主节点:10.10.30.201

实际生产环境中,为了稳定和高可用,一般不会把数据库部署在 Kubernetes 集群中,一般是用云厂商的数据库或者自己在高性能机器上搭建。

但是在这次实验环境中,将数据库部署到K8S集群中,可节约资源,也可做测试数据库,且有助于运维效率。

本次数据库搭建为MySQL数据库。

拉取1个镜像:mysql:8.0.30

自定义MySQL配置文件,通过创建 configmap 并挂载到容器中

构建svc,以便集群内外均可访问数据库,其中集群外需通过 nodePort 设置的 30336 端口访问。

构建部署文件,

创建mysql.yaml将上面三个YAML文件结合在一起

输出

考虑到数据安全性,需要定期备份数据库,在K8S集群中,可配置CronJob实现自动备份作业。备份挂载到NFS服务器/k8s/sql/backup路径下,且以日期命名。每1小时的第1分钟备份一次,一天内的备份文件会重复覆盖。

进入NFS服务器10.10.30.211

查看挂载文件夹

 
 
 
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-config
data:
  mysql.cnf: |
    [mysqld]
    default_storage_engine=innodb
    skip_external_locking
    lower_case_table_names=1
    skip_host_cache
    skip_name_resolve
    max_connections=2000
    innodb_buffer_pool_size=8589934592
    init_connect='SET collation_connection = utf8_unicode_ci'
    init_connect='SET NAMES utf8'
    character-set-server=utf8
    collation-server=utf8_unicode_ci
    skip-character-set-client-handshake
    query_cache_type=0
    innodb_flush_log_at_trx_commit = 0
    sync_binlog = 0
    query_cache_size = 104857600
    slow_query_log =1
    slow_query_log_file=/var/lib/mysql/slow-query.log
    log-error=/var/lib/mysql/mysql.err
    long_query_time = 0.02
    table_open_cache_instances=16
    table_open_cache = 6000
    skip-grant-tables
    sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION   
#这里是一行,且与skip-grant-tables同缩进,若显示不正常为显示问题
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-config
data:
  mysql.cnf: |
    [mysqld]
    default_storage_engine=innodb
    skip_external_locking
    lower_case_table_names=1
    skip_host_cache
    skip_name_resolve
    max_connections=2000
    innodb_buffer_pool_size=8589934592
    init_connect='SET collation_connection = utf8_unicode_ci'
    init_connect='SET NAMES utf8'
    character-set-server=utf8
    collation-server=utf8_unicode_ci
    skip-character-set-client-handshake
    query_cache_type=0
    innodb_flush_log_at_trx_commit = 0
    sync_binlog = 0
    query_cache_size = 104857600
    slow_query_log =1
    slow_query_log_file=/var/lib/mysql/slow-query.log
    log-error=/var/lib/mysql/mysql.err
    long_query_time = 0.02
    table_open_cache_instances=16
    table_open_cache = 6000
    skip-grant-tables
    sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION   
#这里是一行,且与skip-grant-tables同缩进,若显示不正常为显示问题
apiVersion: v1
kind: Service
metadata:
  labels:
    app: mysql-svc
    release: mysql-svc
  name: mysql-svc
  namespace: default
spec:
  ports:
  - name: mysql
    port: 3306
    protocol: TCP
    nodePort: 30336
    targetPort: mysql
  selector:
    app: mysql
  #目前sessionAffinity可以提供"None""ClientIP"两种设定:
  #None: 以round robin的方式轮询下面的Pods。
  #ClientIP: 以client ip的方式固定request到同一台机器。
  sessionAffinity: None
  type: NodePort
apiVersion: v1
kind: Service
metadata:
  labels:
    app: mysql-svc
    release: mysql-svc
  name: mysql-svc
  namespace: default
spec:
  ports:
  - name: mysql
    port: 3306
    protocol: TCP
    nodePort: 30336
    targetPort: mysql
  selector:
    app: mysql
  #目前sessionAffinity可以提供"None""ClientIP"两种设定:
  #None: 以round robin的方式轮询下面的Pods。
  #ClientIP: 以client ip的方式固定request到同一台机器。
  sessionAffinity: None
  type: NodePort
apiVersion: apps/v1
kind: StatefulSet
metadata:
  generation: 1
  labels:
    app: mysql
    release: mysql
  name: mysql
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql 
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          env:
            #设置password
            - name: MYSQL_ROOT_PASSWORD
              value: root
            - name: MYSQL_USER
              value: test
            - name: MYSQL_PASSWORD
              value: test
          image: 'mysql:8.0.30'
          imagePullPolicy: 
          #kubelet 使用 liveness probe(存活探针)来确定何时重启容器。例如,当应用程序处于运行状态但无法做进一步操作,liveness 探针将捕获到 deadlock,重启处于该状态下的容器,使应用程序在存在 bug 的情况下依然能够继续运行下去
          livenessProbe:
            exec:
              command:
                - /bin/sh
                - "-c"
                - MYSQL_PWD="${MYSQL_ROOT_PASSWORD}"
                - mysql -h 127.0.0.1 -u root -e "SELECT 1"
            failureThreshold: 3 #探测成功后,最少连续探测失败多少次才被认定为失败。默认是 3。最小值是 1。
            initialDelaySeconds: 30 #容器启动后第一次执行探测是需要等待多少秒。
            periodSeconds: 10 #执行探测的频率。默认是10秒,最小1秒。
            successThreshold: 1 #探测失败后,最少连续探测成功多少次才被认定为成功。默认是 1。对于 liveness 必须是 1。最小值是 1。
            timeoutSeconds: 5 #探测超时时间。默认1秒,最小1秒。
          #Kubelet 使用 readiness probe(就绪探针)来确定容器是否已经就绪可以接受流量。只有当 Pod 中的容器都处于就绪状态时 kubelet 才会认定该 Pod处于就绪状态。该信号的作用是控制哪些 Pod应该作为service的后端。如果 Pod 处于非就绪状态,那么它们将会被从 service 的 load balancer中移除。
          readinessProbe:
            exec:
              command:
                - /bin/sh
                - "-c"
                - MYSQL_PWD="${MYSQL_ROOT_PASSWORD}"
                - mysql -h 127.0.0.1 -u root -e "SELECT 1"
            failureThreshold: 3
            initialDelaySeconds: 5
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 1
 
          #定义端口
          ports:
            - containerPort: 3306
              name: mysql
              protocol: TCP
          #分配资源
          resources:
            requests:
              cpu: 100m
              memory: 256Mi         
          #挂载数据卷
          volumeMounts:
            - mountPath: /var/lib/mysql
              name: data
            - name: mysql-config
              mountPath: /etc/mysql/mysql.conf.d
            - name: localtime
              readOnly: true
              mountPath: /etc/localtime     
      #定义数据卷
      volumes:
        - name: data
          nfs:
            path: /k8s/sql/data
            server: nfs
        - name: mysql-config
          configMap:
            name: mysql-config
        - name: localtime
          hostPath:
            type: File
            path: /etc/localtime
apiVersion: apps/v1
kind: StatefulSet
metadata:
  generation: 1
  labels:
    app: mysql
    release: mysql
  name: mysql
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql 
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          env:
            #设置password
            - name: MYSQL_ROOT_PASSWORD
              value: root
            - name: MYSQL_USER
              value: test
            - name: MYSQL_PASSWORD
              value: test
          image: 'mysql:8.0.30'
          imagePullPolicy: 
          #kubelet 使用 liveness probe(存活探针)来确定何时重启容器。例如,当应用程序处于运行状态但无法做进一步操作,liveness 探针将捕获到 deadlock,重启处于该状态下的容器,使应用程序在存在 bug 的情况下依然能够继续运行下去
          livenessProbe:
            exec:
              command:
                - /bin/sh
                - "-c"
                - MYSQL_PWD="${MYSQL_ROOT_PASSWORD}"
                - mysql -h 127.0.0.1 -u root -e "SELECT 1"
            failureThreshold: 3 #探测成功后,最少连续探测失败多少次才被认定为失败。默认是 3。最小值是 1。
            initialDelaySeconds: 30 #容器启动后第一次执行探测是需要等待多少秒。
            periodSeconds: 10 #执行探测的频率。默认是10秒,最小1秒。
            successThreshold: 1 #探测失败后,最少连续探测成功多少次才被认定为成功。默认是 1。对于 liveness 必须是 1。最小值是 1。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 3
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//