-
-
[原创]学习Kubernetes笔记——部署数据库站点(MySql)
-
2022-12-31 14:47 19105
-
进入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 |
赞赏
他的文章