部署方式
通過部署mysql主從容器,配置主從pod之間數(shù)據(jù)同步。
配置數(shù)據(jù)庫訪問的密碼
創(chuàng)建 Mysql 密碼的 Secret
[root@k8s-master1 master]# kubectl create secret generic mysql-password --namespace=app --from-literal=mysql_root_password=root
secret/mysql-passowrd created
You have new mail in /var/spool/mail/root
[root@k8s-master1 master]# kubectl get secret -n app
NAME TYPE DATA AGE
default-token-w6q98 kubernetes.io/service-account-token 3 48d
ingress-nginx-admission Opaque 3 35d
ingress-nginx-admission-token-sqbvf kubernetes.io/service-account-token 3 35d
ingress-nginx-token-bt7g2 kubernetes.io/service-account-token 3 35d
mysql-passowrd Opaque 1 6s
先配置MySQL-Master服務(wù)
配置數(shù)據(jù)卷
[root@k8s-master1 master]# cat mysql-master-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-master-pvc
namespace: app
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
storageClassName: nfs-client #這里要換成你環(huán)境的storageClassName
volumeMode: Filesystem
[root@k8s-master1 master]# kubectl apply -f mysql-master-pvc.yaml
[root@k8s-master1 master]# kubectl get pvc -n app
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mysql-master-pvc Bound pvc-f2b5598c-4fd8-48f2-bc93-0e8c27e225ec 2Gi RWO nfs-client 10s
通過ConfiigMap配置MySQL的配置文件my.cnf
[root@k8s-master1 master]# cat my.cnf
[mysqld]
skip-host-cache
skip-name-resolve
datadir = /var/lib/mysql
socket = /var/run/mysqld/mysqld.sock
secure-file-priv = /var/lib/mysql-files
pid-file = /var/run/mysqld/mysqld.pid
user = mysql
secure-file-priv = NULL
server-id = 1 #master節(jié)點的server-id=1
log-bin = master-bin
log_bin_index = master-bin.index
binlog_do_db = deploy_test
binlog_ignore_db = information_sechema
binlog_ignore_db = mysql
binlog_ignore_db = performance_schema
binlog_ignore_db = sys
binlog-format = row
[client]
socket = /var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/
[root@k8s-master1 master]# kubectl create cm mysql-master-cm --from-file=my.cnf -n app
configmap/mysql-master-cm created
[root@k8s-master1 master]# kubectl get cm -n app |grep mysql
mysql-master-cm 1 19s
配置Service服務(wù)
[root@k8s-master1 master]# cat mysql-master-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql-master-svc
namespace: app
labels:
app: mysql-master
spec:
ports:
- port: 3306
name: mysql
targetPort: 3306
nodePort: 30306
selector:
app: mysql-master
type: NodePort
sessionAffinity: ClientIP
[root@k8s-master1 master]# kubectl apply -f mysql-master-svc.yaml
service/mysql-master-svc created
配置主節(jié)點pod啟動的StatefulSet配置文件
[root@k8s-master1 master]# cat mysql-master-StatefulSet.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql-master
namespace: app
spec:
selector:
matchLabels:
app: mysql-master
serviceName: "mysql-master-svc"
replicas: 1
template:
metadata:
labels:
app: mysql-master
spec:
terminationGracePeriodSeconds: 10
containers:
- args:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --lower_case_table_names=1
- --default-time_zone=+8:00
name: mysql
# image: docker.io/library/mysql:8.0.34
image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/mysql:8.0.34
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
- name: mysql-conf
mountPath: /etc/my.cnf
readOnly: true
subPath: my.cnf
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
key: mysql_root_password
name: mysql-password
volumes:
- name: mysql-data
persistentVolumeClaim:
claimName: mysql-master-pvc
- name: mysql-conf
configMap:
name: mysql-master-cm
items:
- key: my.cnf
mode: 0644
path: my.cnf
[root@k8s-master1 master]# kubectl apply -f mysql-master-StatefulSet.yaml
statefulset.apps/mysql-master created
檢查服務(wù)的啟動情況
[root@k8s-master1 master]# kubectl get pods -n app -o wide |grep mysql
mysql-master-0 1/1 Running 0 104s 10.10.36.73 k8s-node1 <none> <none>
配置mysql-salve
配置PVC
[root@k8s-master1 slave]# cat mysql-slave-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-slave-pvc
namespace: app
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
storageClassName: nfs-client
volumeMode: Filesystem
[root@k8s-master1 slave]# kubectl apply -f mysql-slave-pvc.yaml
persistentvolumeclaim/mysql-slave-pvc created
配置ConfigMap
[root@k8s-master1 slave]# cat my.cnf
[mysqld]
skip-host-cache
skip-name-resolve
datadir = /var/lib/mysql
socket = /var/run/mysqld/mysqld.sock
secure-file-priv = /var/lib/mysql-files
pid-file = /var/run/mysqld/mysqld.pid
user = mysql
secure-file-priv = NULL
server-id = 2 #這個要修改
log-bin = master-bin
log_bin_index = master-bin.index
binlog_do_db = deploy_test
binlog_ignore_db = information_sechema
binlog_ignore_db = mysql
binlog_ignore_db = performance_schema
binlog_ignore_db = sys
binlog-format = row
[client]
socket = /var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/
[root@k8s-master1 slave]# kubectl create cm mysql-slave-cm --from-file=my.cnf -n app
configmap/mysql-slave-cm created
You have new mail in /var/spool/mail/root
[root@k8s-master1 slave]# kubectl get cm -n app |grep mysql-slave-cm
mysql-slave-cm 1 13s
配置Service
[root@k8s-master1 slave]# cat mysql-slave-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql-slave-svc
namespace: app
labels:
app: mysql-slave
spec:
ports:
- port: 3306
name: mysql
targetPort: 3306
nodePort: 30307
selector:
app: mysql-slave
type: NodePort
sessionAffinity: ClientIP
[root@k8s-master1 slave]# kubectl apply -f mysql-slave-svc.yaml
service/mysql-slave-svc created
創(chuàng)建MySQL的Pod
[root@k8s-master1 slave]# cat mysql-slave-StatefulSet.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql-slave
namespace: app
spec:
selector:
matchLabels:
app: mysql-slave
serviceName: "mysql-master-svc"
replicas: 1
template:
metadata:
labels:
app: mysql-slave
spec:
terminationGracePeriodSeconds: 10
containers:
- args:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --lower_case_table_names=1
- --default-time_zone=+8:00
name: mysql
# image: docker.io/library/mysql:8.0.34
image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/mysql:8.0.34
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
- name: mysql-conf
mountPath: /etc/my.cnf
readOnly: true
subPath: my.cnf
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
key: mysql_root_password
name: mysql-password
volumes:
- name: mysql-data
persistentVolumeClaim:
claimName: mysql-slave-pvc
- name: mysql-conf
configMap:
name: mysql-slave-cm
items:
- key: my.cnf
mode: 0644
path: my.cnf
[root@k8s-master1 slave]# kubectl apply -f mysql-slave-StatefulSet.yaml
statefulset.apps/mysql-slave created
[root@k8s-master1 slave]# kubectl get pods -n app -o wide |grep mysql
mysql-master-0 1/1 Running 0 14m 10.10.36.73 k8s-node1 <none> <none>
mysql-slave-0 1/1 Running 0 38s 10.10.36.74 k8s-node1 <none> <none>
主從POD都創(chuàng)建完成了,咱們登錄驗證一下,并配置一下主從同步
[root@k8s-master1 slave]# kubectl exec -it mysql-master-0 -n app -- mysql -uroot -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.34 MySQL Community Server - GPL
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
在從節(jié)點執(zhí)行,配置主從關(guān)系
mysql> change master to master_host='mysql-master-0.mysql-master-svc.app.svc.cluster.local',
-> master_port=3306, master_user='root', master_password='root', master_log_file='master-bin.000003',
-> master_log_pos=157,master_connect_retry=30,get_master_public_key=1;
Query OK, 0 rows affected, 11 warnings (0.03 sec)
master_host:這個參數(shù)是master的地址,kubernetes 提供的解析規(guī)則是 pod 名稱.service名稱.命名空間.svc.cluster.local,所以 master 的 mysql 地址是 deploy-mysql-master-0.deploy-mysql-master-svc.deploy-test.svc.cluster.local
master_port:主節(jié)點的 MySQL 端口,沒改默認(rèn) 3306
master_user:登錄到主節(jié)點的 mysql 用戶
master_password:登錄到主節(jié)點的用戶密碼
master_log_file:之前查看 mysql 主節(jié)點狀態(tài)時的 file 字段
master_log_pos:之前查看 mysql 主節(jié)點狀態(tài)時的 Position 字段
master_connect-retry:主節(jié)點重連時間
get_master_public_key:連接主 mysql 的公鑰獲取方式
啟動 slave
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)
查看slave的狀態(tài)文章來源:http://www.zghlxwxcb.cn/news/detail-811544.html
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: mysql-master-0.mysql-master-svc.app.svc.cluster.local
Master_User: root
Master_Port: 3306
Connect_Retry: 30
Master_Log_File: master-bin.000003
Read_Master_Log_Pos: 157
Relay_Log_File: mysql-slave-0-relay-bin.000002
Relay_Log_Pos: 327
Relay_Master_Log_File: master-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
在主節(jié)點創(chuàng)建一個數(shù)據(jù)庫驗證一下主從同步情況文章來源地址http://www.zghlxwxcb.cn/news/detail-811544.html
到了這里,關(guān)于基于kubernetes部署MySQL主從環(huán)境的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!