进入k8s集群主节点:10.10.30.201
实际生产环境中,为了稳定和高可用,一般不会把数据库部署在 Kubernetes 集群中,一般是用云厂商的数据库或者自己在高性能机器上搭建。
但是在这次实验环境中,将数据库部署到K8S集群中,可节约资源,也可做测试数据库,且有助于运维效率。
本次数据库搭建为MySQL数据库。
拉取1个镜像:mysql:8.0.30
自定义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
|
考虑到数据安全性,需要定期备份数据库,在K8S集群中,可配置CronJob实现自动备份作业。备份挂载到NFS服务器/k8s/sql/backup
路径下,且以日期命名。每1小时的第1分钟备份一次,一天内的备份文件会重复覆盖。
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
|
更多【学习Kubernetes笔记——部署数据库站点(MySql)】相关视频教程:www.yxfzedu.com