-
-
[原创]学习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。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏记录
参与人
雪币
留言
时间
伟叔叔
为你点赞~
2023-3-18 00:02
一笑人间万事
为你点赞~
2023-1-9 09:41
阿蒙i
为你点赞~
2022-12-31 16:49
赞赏
他的文章
看原图
赞赏
雪币:
留言: