k8s中部署mysql主从

环境:
OS:Centos 7
k8s:1.28

 

1.创建nfs目录

复制代码
mkdir -p /k8s/mysql/master
mkdir -p /k8s/mysql/slave

vi /etc/exports
/k8s/ *(insecure,rw,sync,no_root_squash)
systemctl restart nfs

[root@master k8s]# more /etc/exports
/k8s/ *(rw,sync,no_root_squash)


[root@master k8s]# exportfs -v
/k8s            <world>(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
复制代码

其他节点执行:

复制代码
[root@node1 ~]# showmount -e 192.168.1.102
Export list for 192.168.1.102:
/k8s *

[root@node2 etcd]# showmount -e 192.168.1.102
Export list for 192.168.1.102:
/k8s *
复制代码

 

2.创建命名空间

kubectl create namespace ns-mysql

 

3.创建 Secret
配置root的mysql密码123

[root@master mysql]# echo -n 'mysql' | base64
bXlzcWw=

 

 

 

 

vi 1-secret.yaml

复制代码
apiVersion: v1
data:
  MYSQL_ROOT_PASSWORD: bXlzcWw= #密码mysql 采用base64编码后结果
kind: Secret
metadata:
  name: mysql-secret
  namespace: ns-mysql
type: Opaque
复制代码

 

kubectl apply -f 1-secret.yaml

 

4.编写my.cnf配置文件(configmap)

master my.cnf 配置放置在 configmap

vi 2-configmap-master.yaml

复制代码
[root@master mysql]# more 2-configmap-master.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-master-cnf
  namespace: ns-mysql
data:
  my.cnf: |-
    [client]
    default-character-set=utf8mb4
    [mysql]
    default-character-set=utf8mb4
    [mysqld]
    init_connect='SET collation_connection = utf8mb4_general_ci'
    init_connect='SET NAMES utf8mb4'
    character-set-server=utf8mb4
    collation-server=utf8mb4_general_ci
    skip-character-set-client-handshake
    skip-name-resolve
    #master-slaver repication
    server_id=1
    log-bin=mysql-bin
    read-only=0
    replicate-ignore-db=mysql
    replicate-ignore-db=sys
    replicate-ignore-db=information_schema
    replicate-ignore-db=performance_schema
    gtid_mode=ON
    enforce_gtid_consistency = ON
    lower_case_table_names=1
    sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
'
复制代码

 

kubectl apply -f 2-configmap-master.yaml

 

slave my.cnf配置

vi 2-configmap-slave.yaml

复制代码
[root@master mysql]# more 2-configmap-slave.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-slave-cnf
  namespace: ns-mysql
data:
  my.cnf: |-
    [client]
    default-character-set=utf8mb4
    [mysql]
    default-character-set=utf8mb4
    [mysqld]
    init_connect='SET collation_connection = utf8mb4_general_ci'
    init_connect='SET NAMES utf8mb4'
    character-set-server=utf8mb4
    collation-server=utf8mb4_general_ci
    skip-character-set-client-handshake
    skip-name-resolve
    #master-slaver repication
    server_id=2
    log-bin=mysql-bin
    read-only=1
    replicate-ignore-db=mysql
    replicate-ignore-db=sys
    replicate-ignore-db=information_schema
    replicate-ignore-db=performance_schema
    gtid_mode=ON
    enforce_gtid_consistency = ON
    lower_case_table_names=1
    sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
'
复制代码

 

 

kubectl apply -f 2-configmap-slave.yaml

 

5.配置pv
master挂载卷配置

vi 3-master-pv.yaml

复制代码
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv-master
  namespace: ns-mysql
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 5Gi
  nfs:
    path: /k8s/mysql/master
    readOnly: false
    server: 192.168.1.102
复制代码
kubectl apply -f 3-master-pv.yaml

 

vi 3-slave-pv.yaml

复制代码
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv-slave
  namespace: ns-mysql
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 5Gi
  nfs:
    path: /k8s/mysql/slave
    readOnly: false
    server: 192.168.1.102
复制代码
kubectl apply -f 3-slave-pv.yaml

 

6.配置pvc
master pvc:

vi 4-master-pvc.yaml

复制代码
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc-master
  namespace: ns-mysql
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  volumeName: mysql-pv-master
复制代码
kubectl apply -f 4-master-pvc.yaml

 

slave pvc:
vi 4-slave-pvc.yaml

复制代码
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc-slave
  namespace: ns-mysql
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  volumeName: mysql-pv-slave
复制代码
kubectl apply -f 4-slave-pvc.yaml

 

7.创建有状态副本集StatefulSet
master有状态副本集

vi 5-master-sts.yaml

复制代码
apiVersion: apps/v1
kind: StatefulSet
metadata:
  namespace: ns-mysql
  labels:
    app: mysql-master
  name: mysql-master
  annotations:
    kubesphere.io/alias-name: mysql主节点
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql-master
  template:
    metadata:
      labels:
        app: mysql-master
      annotations:
        kubesphere.io/containerSecrets: null
        logging.kubesphere.io/logsidecar-config: '{}'
    spec:
      containers:
        - name: master-container
          ##type: worker 去掉
          imagePullPolicy: IfNotPresent
          resources:
            requests:
              cpu: '0.01'
              memory: 10Mi
            limits:
              cpu: '0.98'
              memory: 1700Mi
          image: registry.cn-shenzhen.aliyuncs.com/hxlk8s/mysql:5.7.30
          ports:
            - name: tcp-3306
              protocol: TCP
              containerPort: 3306
              ##servicePort: 3306 去掉
            - name: tcp-33060
              protocol: TCP
              containerPort: 33060
              ##servicePort: 33060 去掉
          env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-secret
                  key: MYSQL_ROOT_PASSWORD
          volumeMounts:
            - name: master-cnf-volume
              readOnly: false
              mountPath: /etc/mysql
            - name: master-data-volume
              readOnly: false
              mountPath: /var/lib/mysql
      serviceAccount: default
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              podAffinityTerm:
                labelSelector:
                  matchLabels:
                    app: mysql-master
                topologyKey: kubernetes.io/hostname
      initContainers: []
      imagePullSecrets: null
      volumes:
        - name: master-cnf-volume     #映射configMap信息
          configMap:
            name: mysql-master-cnf
            items:
              - key: my.cnf
                path: my.cnf
        - name: master-data-volume    #映射pvc信息
          persistentVolumeClaim:
            claimName: mysql-pvc-master
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      partition: 0
  serviceName: mysql-master
复制代码
kubectl apply -f 5-master-sts.yaml

 

slave有状态副本集

vi 5-slave-sts.yaml

复制代码
apiVersion: apps/v1
kind: StatefulSet
metadata:
  namespace: ns-mysql
  labels:
    app: mysql-slave
  name: mysql-slave
  annotations:
    kubesphere.io/alias-name: mysql主节点
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql-slave
  template:
    metadata:
      labels:
        app: mysql-slave
      annotations:
        kubesphere.io/containerSecrets: null
        logging.kubesphere.io/logsidecar-config: '{}'
    spec:
      containers:
        - name: slave-container
          ##type: worker
          imagePullPolicy: IfNotPresent
          resources:
            requests:
              cpu: '0.01'
              memory: 10Mi
            limits:
              cpu: '0.98'
              memory: 1700Mi
          image: registry.cn-shenzhen.aliyuncs.com/hxlk8s/mysql:5.7.30
          ports:
            - name: tcp-3306
              protocol: TCP
              containerPort: 3306
              ##servicePort: 3306
            - name: tcp-33060
              protocol: TCP
              containerPort: 33060
              ##servicePort: 33060
          env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-secret
                  key: MYSQL_ROOT_PASSWORD
          volumeMounts:
            - name: slave-cnf-volume
              readOnly: false
              mountPath: /etc/mysql
            - name: slave-data-volume
              readOnly: false
              mountPath: /var/lib/mysql
      serviceAccount: default
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              podAffinityTerm:
                labelSelector:
                  matchLabels:
                    app: mysql-slave
                topologyKey: kubernetes.io/hostname
      initContainers: []
      imagePullSecrets: null
      volumes:
        - name: slave-cnf-volume     #映射configMap信息
          configMap:
            name: mysql-slave-cnf
            items:
              - key: my.cnf
                path: my.cnf
        - name: slave-data-volume    #映射pvc信息
          persistentVolumeClaim:
            claimName: mysql-pvc-slave
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      partition: 0
  serviceName: mysql-slave
复制代码
kubectl apply -f 5-slave-sts.yaml

 

8.创建无头服务HeadlessService
master无头服务

vi 6-master-headless-svc.yaml

复制代码
apiVersion: v1
kind: Service
metadata:
  namespace: ns-mysql
  labels:
    app: mysql-master
  annotations:
    kubesphere.io/serviceType: statefulservice
    kubesphere.io/alias-name: mysql主节点
  name: mysql-master
spec:
  sessionAffinity: ClientIP
  selector:
    app: mysql-master
  ports:
    - name: tcp-3306
      protocol: TCP
      port: 3306
      targetPort: 3306
    - name: tcp-33060
      protocol: TCP
      port: 33060
      targetPort: 33060
  clusterIP: None
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 10800
复制代码

 

kubectl apply -f 6-master-headless-svc.yaml

 

slave无头服务

vi 6-slave-headless-svc.yaml

复制代码
apiVersion: v1
kind: Service
metadata:
  namespace: ns-mysql
  labels:
    app: mysql-slave
  annotations:
    kubesphere.io/serviceType: statefulservice
    kubesphere.io/alias-name: mysql主节点
  name: mysql-slave
spec:
  sessionAffinity: ClientIP
  selector:
    app: mysql-slave
  ports:
    - name: tcp-3306
      protocol: TCP
      port: 3306
      targetPort: 3306
    - name: tcp-33060
      protocol: TCP
      port: 33060
      targetPort: 33060
  clusterIP: None
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 10800
复制代码
kubectl apply -f 6-slave-headless-svc.yaml

 

9.创建外部访问的NodePort Service

master NodePort Service

vi 7-master-nodeport-svc.yaml

复制代码
apiVersion: v1
kind: Service
metadata:
  name: mysql-master-front
  labels:
    app: mysql-master
  namespace: ns-mysql
spec:
  selector:
    app: mysql-master
  type: NodePort
  ports:
    - name: ''
      port: 3306
      protocol: TCP
      targetPort: 3306
      nodePort: 30001
  sessionAffinity: None
复制代码
kubectl apply -f 7-master-nodeport-svc.yaml

 

slave NodePort Service

vi 7-slave-nodeport-svc.yaml

复制代码
apiVersion: v1
kind: Service
metadata:
  name: mysql-slave-front
  labels:
    app: mysql-slave
  namespace: ns-mysql
spec:
  selector:
    app: mysql-slave
  type: NodePort
  ports:
    - name: ''
      port: 3306
      protocol: TCP
      targetPort: 3306
      nodePort: 30002
  sessionAffinity: None
复制代码
kubectl apply -f 7-slave-nodeport-svc.yaml

 

此时,mysql主机的部署已经完成,可以使用外部客户端访问了.

10.主从同步-创建同步账号

[root@master mysql]# kubectl get pod -n ns-mysql
NAME             READY   STATUS    RESTARTS   AGE
mysql-master-0   1/1     Running   0          28m
mysql-slave-0    1/1     Running   0          26m

进入到主库
kubectl exec -it mysql-master-0 -n ns-mysql -- /bin/bash

复制代码
# 1.进入mysql内部
>  mysql -uroot -pmysql
#切换到 mysql DB
mysql> USE mysql;   
# 查看root用户是否具备远程访问权限
mysql> select Host,User,authentication_string,password_expired,password_last_changed from user; 

mysql> show grants for 'root'@'%';
+-------------------------------------------------------------+
| Grants for root@%                                           |
+-------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION |
+-------------------------------------------------------------+
1 row in set (0.00 sec)


# 2.添加用来同步的用户
mysql> GRANT REPLICATION SLAVE ON *.* to 'repl'@'%' identified by 'mysql';
Query OK, 0 rows affected, 1 warning (0.01 sec)

# 4.查看master状态
mysql>  show master status\G;
*************************** 1. row ***************************
             File: mysql-bin.000003
         Position: 444
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

ERROR: 
No query specified
复制代码

 

11.创建一个 busybox,执行以下命令查看主库dns

vi 8-busybox.yaml

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: ns-mysql
spec:
  containers:
  - name: busybox
    image: registry.cn-shenzhen.aliyuncs.com/hxlk8s/busybox:1.28
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
  restartPolicy: Always
复制代码

busybox这里使用1.28版本的,之前使用1.32版本,报如下错误.

复制代码
[root@master mysql]# kubectl exec -it busybox -n ns-mysql -- /bin/sh
/ # nslookup mysql-master
Server:         10.96.0.10
Address:        10.96.0.10:53

** server can't find mysql-master.ns-mysql.svc.cluster.local: NXDOMAIN

*** Can't find mysql-master.svc.cluster.local: No answer
*** Can't find mysql-master.cluster.local: No answer
*** Can't find mysql-master.ns-mysql.svc.cluster.local: No answer
*** Can't find mysql-master.svc.cluster.local: No answer
*** Can't find mysql-master.cluster.local: No answer
复制代码

 

kubectl apply -f 8-busybox.yaml

进入busybox容器内,执行以下命令

[root@master mysql]# kubectl exec -it busybox -n ns-mysql -- /bin/sh
/ # nslookup mysql-master
Server:         10.96.0.10
Address:        10.96.0.10:53

 

11.配置主从同步

然后进入到mysql-slave内部

复制代码
[root@master mysql]# kubectl get pods -n ns-mysql
NAME             READY   STATUS    RESTARTS   AGE
busybox          1/1     Running   0          5m52s
mysql-master-0   1/1     Running   0          39m
mysql-slave-0    1/1     Running   0          37m

kubectl exec -it mysql-slave-0 -n ns-mysql -- /bin/bash
复制代码
复制代码
# 进入mysql内部
mysql
-uroot -pmysql

change master to master_host='mysql-master.ns-mysql.svc.cluster.local',master_user='repl',master_password='mysql',master_port=3306,master_auto_position=1;


                

# 启动从库同步
start slave;

# 查看从从库状态
show slave status\G;

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: mysql-master.ns-mysql.svc.cluster.local
                  Master_User: backup
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 444
               Relay_Log_File: mysql-slave-0-relay-bin.000002
                Relay_Log_Pos: 657
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: mysql,sys,information_schema,performance_schema
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
复制代码

 

12.主从验证

登录主库:
我们这里使用mysql客户端通过30001端口进行登录

 

mysql -h 192.168.1.102 -uroot -pmysql -P30001
mysql -h 192.168.1.105 -uroot -pmysql -P30001
mysql -h 192.168.1.106 -uroot -pmysql -P30001

每个nodeport都可以登录

 

 

复制代码
mysql -h 192.168.1.102 -uroot -pmysql -P30001

create database db_test;

use db_test;
create table tb_test(
id int NOT NULL AUTO_INCREMENT COMMENT '主键',
name varchar(32),
PRIMARY KEY (`id`)
);

insert into tb_test(name) values('name1');
insert into tb_test(name) values('name2');
insert into tb_test(name) values('name3');
insert into tb_test(name) values('name4');
insert into tb_test(name) values('name5');
复制代码

 

从库查看

 

复制代码
[root@node2 ~]# mysql -h 192.168.1.102 -uroot -pmysql -P30002
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.30-log MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> use db_test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MySQL [db_test]> show tables;
+-------------------+
| Tables_in_db_test |
+-------------------+
| tb_test           |
+-------------------+
1 row in set (0.01 sec)

MySQL [db_test]> select * from tb_test;
+----+-------+
| id | name  |
+----+-------+
|  1 | name1 |
|  2 | name2 |
|  3 | name3 |
|  4 | name4 |
|  5 | name5 |
+----+-------+
5 rows in set (0.00 sec)
复制代码

 

 13.通过客户端mysqldump 导出k8s mysql中的数据

/opt/mysql57/bin/mysqldump -h 192.168.1.102 -uroot -P30001 -p db_test tb_test --default-character-set=utf8 --skip-disable-keys --lock-tables=false --hex-blob --skip-add-drop-table>/tmp/tb_test.sql

 疑问点:xtrabackup如何在k8s中使用

 

posted @   slnngk  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
历史上的今天:
2019-03-04 oracle传输表空间相关
点击右上角即可分享
微信分享提示