首页
论坛
课程
招聘
[原创]学习Kubernetes笔记——部署数据库站点(MySql)
2022-12-31 14:47 14187

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

2022-12-31 14:47
14187

进入k8s集群主节点:10.10.30.201

搭建数据库环境

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

 

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

 

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

 

拉取1个镜像:mysql:8.0.30

准备YMAL文件

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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同缩进,若显示不正常为显示问题

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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

构建部署文件,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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

执行

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

1
kubectl apply -f mysql.yaml

输出

1
2
3
4
[root@m1 yaml]# kubectl apply -f mysql.yaml
configmap/mysql-config create
service/mysql-svc create
statefulset.apps/mysql create

验证环境

1
2
3
4
[root@m1 yaml]# kubectl get pods |grep mysql
mysql-0                                   1/1     Running   0             91m
[root@m1 yaml]# kubectl get svc |grep mysql
mysql-svc       NodePort    10.103.149.178   <none>        3306:30336/TCP   125m

MySQL数据库定期自动备份

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

准备YAML文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
apiVersion: batch/v1
kind: CronJob
metadata:
  name: mysql-backup
spec:
  schedule: "1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: mysql-backup
              imagePullPolicy: IfNotPresent
              image: 'mysql:8.0.30'
              env:
                - name: MYSQL_ROOT_PASSWORD
                  value: root
                - name: MYSQL_USER
                  value: test
                - name: MYSQL_PASSWORD
                  value: test
              command:
                - /bin/sh
                - -c
                - |
                  set -ex
                  mysqldump --host=$MYSQL_HOST --user=$MYSQL_ROOT_PASSWORD \
                            --password=$mysql-root-password \
                            --routines --databases mall --single-transaction \
                            > /mysql-backup/mysql-`date +"%Y%m%d"`.sql
              volumeMounts:
                - name: mysql-backup
                  mountPath: /mysql-backup
          restartPolicy: OnFailure
          volumes:
            - name: mysql-backup
              nfs:
                path: /k8s/sql/backup
                server: nfs

执行

1
kubectl apply -f mysql.yaml

验证

进入NFS服务器10.10.30.211

 

查看挂载文件夹

1
2
3
[root@centosStream8 html]# cd /k8s/sql/backup
[root@centosStream8 backup]# ls
mysql-20221228.sql

[2023春季班]《安卓高级研修班(网课)》月薪两万班招生中~

收藏
点赞2
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回