1. 創(chuàng)建 namespace.yaml 文件
apiVersion: v1
kind: Namespace
metadata:
name: deploy-test
spec: {}
status: {}
2. 創(chuàng)建 namespace
kubectl create -f namspace.yaml
查看是否出創(chuàng)建成功
kubectl get ns
3. 創(chuàng)建 Mysql 密碼的 Secret
(1)執(zhí)行如下命令
kubectl create secret generic mysql-passowrd --namespace=deploy-test --from-literal=mysql_root_password=root --dry-run=client -o=yaml
說明:
- 創(chuàng)建一個(gè) secret
- 名字為 mysql-password
- 命名空間為 deploy-test
- –from-literal=mysql_root_password=root 后面的root為密碼
- –dry-run 不執(zhí)行,只是校驗(yàn)
(2)生成資源清單文件,并保存為 mysql_root_password_secret.yaml
apiVersion: v1
data:
mysql_root_password: cm9vdA==
kind: Secret
metadata:
creationTimestamp: null
name: mysql-passowrd
namespace: deploy-test
(3)創(chuàng)建 secret
kubectl create -f mysql_root_password_secret.yaml
(4)查看 secret
kubectl get secret -n deploy-test
4. 安裝 MySQL 主節(jié)點(diǎn)
(1)創(chuàng)建 PV 和 PVC
之前安裝了 nfs,現(xiàn)在可以給哪些目錄創(chuàng)建 PV 和 PVC。創(chuàng)建 PV 和 PVC 的資源清單文件
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: deploy-mysql-master-ceph-pv
namespace: deploy-test
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
storageClassName: rook-ceph-block
volumeMode: Filesystem
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: deploy-mysql-master-ceph-pvc
namespace: deploy-test
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
storageClassName: rook-ceph-block
volumeMode: Filesystem
注意:不推薦在ceph rbd 模式下使用 RWX 訪問控制,如果應(yīng)用層沒有訪問鎖機(jī)制,可能會造成數(shù)據(jù)損壞,這是推薦使用RWO訪問控制,即ReadWriteOnce
(2)查看 PV 和 PVC
kubectl get pvc -n deploy-test
(3)主節(jié)點(diǎn)配置文件 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
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/
(4)接下來將創(chuàng)建一個(gè) ConfigMap 來存儲這個(gè)配置文件,可以使用以下配置生成 yaml 資源清單文件內(nèi)容
kubectl create configmap mysql-master-cm -n deploy-test --from-file=my.cnf --dry-run=client -o yaml
生成的 ConfigMap 文件清單如下
apiVersion: v1
data:
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
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/
kind: ConfigMap
metadata:
creationTimestamp: null
name: mysql-master-cm
namespace: deploy-test
5. 部署 MySQL 主節(jié)點(diǎn)
(1)直接上msyql 主節(jié)點(diǎn)的yaml 資源清單文件:
apiVersion: v1
data:
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
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/
kind: ConfigMap
metadata:
creationTimestamp: null
name: mysql-master-cm
namespace: deploy-test
---
apiVersion: v1
kind: Service
metadata:
name: deploy-mysql-master-svc
namespace: deploy-test
labels:
app: mysql-master
spec:
ports:
- port: 3306
name: mysql
targetPort: 3306
nodePort: 30306
selector:
app: mysql-master
type: NodePort
sessionAffinity: ClientIP
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: deploy-mysql-master
namespace: deploy-test
spec:
selector:
matchLabels:
app: mysql-master
serviceName: "deploy-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: deploy-mysql-master-ceph-pvc
- name: mysql-conf
configMap:
name: mysql-master-cm
items:
- key: my.cnf
mode: 0644
path: my.cnf
(2)創(chuàng)建主節(jié)點(diǎn)
kubectl create -f mysql-master.yaml
(3)查看創(chuàng)建情況
kubectl get all -o wide -n deploy-test
(4)進(jìn)入容器內(nèi)查看
kubectl exec -itn deploy-test pod/deploy-mysql-master-0 -- mysql -uroot -proot
(5)查看 master 節(jié)點(diǎn)信息
show master status;
6. 安裝第一個(gè)從節(jié)點(diǎn) Slave
PV 和 PVC 的yaml資源清單文件
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: deploy-mysql-slave-01-ceph-pv
namespace: deploy-test
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
storageClassName: rook-ceph-block
volumeMode: Filesystem
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: deploy-mysql-slave-01-ceph-pvc
namespace: deploy-test
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
storageClassName: rook-ceph-block
volumeMode: Filesystem
(1)第一個(gè)從節(jié)點(diǎn)的配置文件 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 = slave-bin
relay-log = slave-relay-bin
log-bin-index = slave-relay-bin.index
[client]
socket = /var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/
(2)接下來將創(chuàng)建一個(gè) ConfigMap 來存儲這個(gè)配置文件,可以使用以下配置生成 yaml 資源清單文件內(nèi)容
kubectl create configmap mysql-slave-cm -n deploy-test --from-file=my.cnf --dry-run=client -o yaml
生成的 ConfigMap 文件清單如下
apiVersion: v1
data:
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 = slave-bin
relay-log = slave-relay-bin
log-bin-index = slave-relay-bin.index
[client]
socket = /var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/
kind: ConfigMap
metadata:
creationTimestamp: null
name: mysql-slave-cm
namespace: deploy-test
(3)第一個(gè)Slave節(jié)點(diǎn)yaml資源清單文件
apiVersion: v1
data:
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 = slave-bin
relay-log = slave-relay-bin
log-bin-index = slave-relay-bin.index
[client]
socket = /var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/
kind: ConfigMap
metadata:
creationTimestamp: null
name: mysql-slave-01-cm
namespace: deploy-test
---
apiVersion: v1
kind: Service
metadata:
name: deploy-mysql-slave-svc
namespace: deploy-test
labels:
app: mysql-slave
spec:
ports:
- port: 3306
name: mysql
targetPort: 3306
nodePort: 30308
selector:
app: mysql-slave
type: NodePort
sessionAffinity: ClientIP
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: deploy-mysql-slave-01
namespace: deploy-test
spec:
selector:
matchLabels:
app: mysql-slave
serviceName: "deploy-mysql-slave-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: deploy-mysql-slave-01-ceph-pvc
- name: mysql-conf
configMap:
name: mysql-slave-01-cm
items:
- key: my.cnf
mode: 0644
path: my.cnf
注意:這里的 Service 會和第二個(gè) Slave 節(jié)點(diǎn)公用
(4)查看創(chuàng)建情況
kubectl get all -n deploy-test
7. 創(chuàng)建第二個(gè)Slave節(jié)點(diǎn)
與創(chuàng)建第一個(gè)節(jié)點(diǎn)一樣,不同點(diǎn):
- Service 不用創(chuàng)建
- slave-01 修改為 slave-02 即可
- serverId 修改為 3
查看一主兩從節(jié)點(diǎn)情況
8. 測試
(1)查看 master 節(jié)點(diǎn)信息
要同步的數(shù)據(jù)庫是 deploy_test
(2)使用如下命令,進(jìn)入第一個(gè)mysql 從節(jié)點(diǎn) salve
kubectl exec -itn deploy-test pod/deploy-msyql-slave-01-0 -- mysql -uroot -proot
(3)接下來分別來到兩個(gè)子節(jié)點(diǎn)當(dāng)中執(zhí)行如下命令
change master to master_host='deploy-mysql-master-0.deploy-mysql-master-svc.deploy-test.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;
需要注意下面的幾個(gè)參數(shù):
- master_host:這個(gè)參數(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é)點(diǎn)的 MySQL 端口,沒改默認(rèn) 3306
- master_user:登錄到主節(jié)點(diǎn)的 mysql 用戶
- master_password:登錄到主節(jié)點(diǎn)的用戶密碼
- master_log_file:之前查看 mysql 主節(jié)點(diǎn)狀態(tài)時(shí)的 file 字段
- master_log_pos:之前查看 mysql 主節(jié)點(diǎn)狀態(tài)時(shí)的 Position 字段
- master_connect-retry:主節(jié)點(diǎn)重連時(shí)間
- get_master_public_key:連接主 mysql 的公鑰獲取方式
以上參數(shù),可以按照自己環(huán)境進(jìn)行修改。
(4)查看 master_host 的對應(yīng)關(guān)系
安裝 bind-utils
yum install -y bind-utils
查看命名空間 deploy-test 下的pod
kubectl get pod -n deploy-test -o wide
查看命名空間 kube-system 下的 svc 中的 dns 的容器內(nèi) IP
kubectl get svc -n kube-system
解析綁定關(guān)系
nslookup deploy-mysql-master-0.deploy-mysql-master-svc.deploy-test.svc.cluster.local 10.233.0.3
(5)啟動 slave
start slave;
(6)查看 slave 狀態(tài)
show slave status\G;
9. 測試主從集群
(1)在 master 節(jié)點(diǎn)創(chuàng)建 database
create database deploy_test;
(2)在 master 節(jié)點(diǎn)創(chuàng)建 user 表
CREATE TABLE user
(userId int,
userName varchar(255));
(3)在 master 節(jié)點(diǎn)插入一條 SQL 記錄
insert into user values(1, "John");
(4)查看 slave 節(jié)點(diǎn)數(shù)據(jù)是否同步
數(shù)據(jù)庫同步成功
表及數(shù)據(jù)同步成功文章來源:http://www.zghlxwxcb.cn/news/detail-838638.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-838638.html
到了這里,關(guān)于K8s 部署Mysql主從集群的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!