K8s 部署Mysql主从集群

这篇具有很好参考价值的文章主要介绍了K8s 部署Mysql主从集群。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 创建 namespace.yaml 文件

apiVersion: v1
kind: Namespace
metadata:
  name: deploy-test
spec: {}
status: {}

2. 创建 namespace

kubectl create -f namspace.yaml

查看是否出创建成功

kubectl get ns

3. 创建 Mysql 密码的 Secret

(1)执行如下命令

kubectl create secret generic mysql-passowrd --namespace=deploy-test --from-literal=mysql_root_password=root --dry-run=client -o=yaml

说明:

  • 创建一个 secret
  • 名字为 mysql-password
  • 命名空间为 deploy-test
  • –from-literal=mysql_root_password=root 后面的root为密码
  • –dry-run 不执行,只是校验

(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)创建 secret

kubectl create -f mysql_root_password_secret.yaml

(4)查看 secret

kubectl get secret -n deploy-test

4. 安装 MySQL 主节点

(1)创建 PV 和 PVC

之前安装了 nfs,现在可以给哪些目录创建 PV 和 PVC。创建 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 访问控制,如果应用层没有访问锁机制,可能会造成数据损坏,这是推荐使用RWO访问控制,即ReadWriteOnce

(2)查看 PV 和 PVC

kubectl get pvc -n deploy-test

(3)主节点配置文件 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)接下来将创建一个 ConfigMap 来存储这个配置文件,可以使用以下配置生成 yaml 资源清单文件内容

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 主节点

(1)直接上msyql 主节点的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)创建主节点

kubectl create -f mysql-master.yaml

(3)查看创建情况

kubectl get all -o wide -n deploy-test

k8s部署mysql主从,kubernetes,mysql,adb
(4)进入容器内查看

kubectl exec -itn deploy-test pod/deploy-mysql-master-0 -- mysql -uroot -proot

(5)查看 master 节点信息

show master status;

k8s部署mysql主从,kubernetes,mysql,adb

6. 安装第一个从节点 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)第一个从节点的配置文件 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)接下来将创建一个 ConfigMap 来存储这个配置文件,可以使用以下配置生成 yaml 资源清单文件内容

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)第一个Slave节点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 会和第二个 Slave 节点公用

(4)查看创建情况

kubectl get all -n deploy-test

k8s部署mysql主从,kubernetes,mysql,adb

7. 创建第二个Slave节点

与创建第一个节点一样,不同点:

  • Service 不用创建
  • slave-01 修改为 slave-02 即可
  • serverId 修改为 3

查看一主两从节点情况
k8s部署mysql主从,kubernetes,mysql,adb

8. 测试

(1)查看 master 节点信息

k8s部署mysql主从,kubernetes,mysql,adb

要同步的数据库是 deploy_test

(2)使用如下命令,进入第一个mysql 从节点 salve

kubectl exec -itn deploy-test pod/deploy-msyql-slave-01-0 -- mysql -uroot -proot

(3)接下来分别来到两个子节点当中执行如下命令

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;

需要注意下面的几个参数:

  • master_host:这个参数是master的地址,kubernetes 提供的解析规则是 pod 名称.service名称.命名空间.svc.cluster.local,所以 master 的 mysql 地址是 deploy-mysql-master-0.deploy-mysql-master-svc.deploy-test.svc.cluster.local
  • master_port:主节点的 MySQL 端口,没改默认 3306
  • master_user:登录到主节点的 mysql 用户
  • master_password:登录到主节点的用户密码
  • master_log_file:之前查看 mysql 主节点状态时的 file 字段
  • master_log_pos:之前查看 mysql 主节点状态时的 Position 字段
  • master_connect-retry:主节点重连时间
  • get_master_public_key:连接主 mysql 的公钥获取方式

以上参数,可以按照自己环境进行修改。

(4)查看 master_host 的对应关系

安装 bind-utils

yum install -y bind-utils

查看命名空间 deploy-test 下的pod

kubectl get pod -n deploy-test -o wide

查看命名空间 kube-system 下的 svc 中的 dns 的容器内 IP

kubectl get svc -n kube-system

解析绑定关系

nslookup deploy-mysql-master-0.deploy-mysql-master-svc.deploy-test.svc.cluster.local 10.233.0.3

k8s部署mysql主从,kubernetes,mysql,adb

(5)启动 slave

start slave;

(6)查看 slave 状态

show slave status\G;

k8s部署mysql主从,kubernetes,mysql,adb

9. 测试主从集群

(1)在 master 节点创建 database

create database deploy_test;

(2)在 master 节点创建 user 表

CREATE TABLE user
(userId int,
userName varchar(255));

(3)在 master 节点插入一条 SQL 记录

insert into user values(1, "John");

(4)查看 slave 节点数据是否同步

数据库同步成功

k8s部署mysql主从,kubernetes,mysql,adb

表及数据同步成功

k8s部署mysql主从,kubernetes,mysql,adb文章来源地址https://www.toymoban.com/news/detail-838638.html

到了这里,关于K8s 部署Mysql主从集群的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【实战】使用Helm在K8S集群安装MySQL主从

    K8S对于云原生部署有着至关重要的作用,几乎所有的应用和中间件都可以部署在K8S,让其帮助我们进行管理。一般情况下我们推荐数据库不使用容器化部署,但是在某些场合为了方便管理也可以采用该种方式。今天我们就用在K8S集群部署MySQL,仅当作学习学习,在生产环境谨

    2024年02月22日
    浏览(54)
  • 基于k8s搭建mysql5.7主从集群实现读写分离

    一,准备工作 1,拥有一个运行中的k8s集群 2,拥有一个ceph分布式存储集群,此mysql集群基于ceph块存储,部署方案可参考我前面的rook部署ceph方案 二,集群搭建 1,创建存储类storageclass       将此 StorageClass 定义保存为 storageclass.yaml : 创建存储类   2,MySQL 部署包含一个 Con

    2024年02月08日
    浏览(42)
  • 用 Helm 在 k8s 上快速搭建 MySQL 主从集群 ,并提供对外访问

    核心一览 Helm 的使用 NFS 搭建 配置文件 一点心得 简单回忆下这个运行环境 👇(很烦,感觉给自己挖了个大坑🕳/(ㄒoㄒ)/~~) 宿主机 Traefik Minikube Ingress Service Pod helm 官网快速上手👉 helm.sh/zh/docs/int… 安装 下载地址 : github.com/helm/helm/r… 三大概念 Chart 代表着 Helm 包。 Repos

    2024年02月11日
    浏览(74)
  • Kubernetes(k8s)上搭建一主两从的mysql8集群

    本文章视频教程地址:https://www.bilibili.com/video/BV1iw411e7ZE/ 首先你需要准备一个kubernetes集群和一台nfs服务器,为了方便,我就用 k8s-master 来做nfs服务器了。我的服务器IP地址和用途如图: IP地址 主机名 用途 192.168.1.160 k8s-master Kubernetes主服务器兼nfs服务器 192.168.1.161 K8s-node01 Ku

    2024年02月06日
    浏览(52)
  • [Kubernetes]10. k8s部署Goweb+mysql项目实战演练

    如果要本地构建镜像的话,对应节点还需要安装docker,安装教程见:[Docker]一.Docker 简介与安装 linux环境,centos8下 docker及docker compose安装教程 k8s部署Goweb+mysql项目有 两种方法 :第一种是 传统部署方法 ,第二种是 通过ConfigMap实现应用配置分离部署方法 ,下面就来看看这两种部署方法

    2024年02月01日
    浏览(74)
  • Kubernetes(K8S)集群部署

    目录 一、创建3台虚拟机 二、为每台虚拟机安装Docker 三、安装kubelet 3.1 安装要求 3.2 为每台服务器完成前置设置 3.3 为每台服务器安装kubelet、kubeadm、kubectl 四、使用kubeadm引导集群 4.1 master服务器 4.2 node1、node2服务器 4.3 初始化主节点 4.4 work节点加入集群 五、token过期怎么办?

    2024年02月07日
    浏览(84)
  • yum部署kubernetes(k8s)集群、k8s常用资源管理

    目录 一、环境搭建 1、准备环境 1)计算机说明,建议系统版本7.4或者7.6 2)修改所有主机的计算机名设置host文件  2、安装master节点 1)安装etcd配置etcd 2)安装k8s-master节点 3)配置apiserver 4)配置controller和scheduler 5)启动k8s服务 3、安装k8s-master上的node 1)安装node 2)配置kube

    2024年02月13日
    浏览(64)
  • Kubernetes(k8s)集群安装部署

    名称 IP 系统 配置 主控节点 192.168.202.101 CentOS 7.9.2009 2核4G 工作节点1 192.168.202.102 CentOS 7.9.2009 2核4G 工作节点2 192.168.202.103 CentOS 7.9.2009 2核4G 2.1 升级操作系统内核 导入elrepo gpg key 安装elrepo YUM源仓库 安装kernel-ml版本,ml为长期稳定版本,lt为长期维护版本 设置grub2默认引导为0 重

    2024年02月10日
    浏览(80)
  • Kubernetes(k8s)集群部署----->超详细

    💖The Begin💖点点关注,收藏不迷路💖 Kubernetes(简称k8s)是一个开源的容器编排平台,可以帮助开发人员和运维团队更轻松地管理容器化应用程序。本文将详细介绍如何进行k8s集群的部署,以帮助读者快速搭建一个高可用、可伸缩的k8s集群。 1、操作系统:至少三台物理机或

    2024年02月05日
    浏览(65)
  • 【Kubernetes】第二十二篇 - k8s 部署 MySQL 服务(secret、deployment、service)

    上一篇,介绍基于 k8s 项目部署流程设计; 本篇,介绍 MySQL 服务的部署; 部署 MySQL 可以为指定 node 添加污点,专门用于 mysql 部署(当前只有一个节点,不考虑); 为了保证mysql容器重启时数据不会丢失:创建 mysql 数据目录,用于存储 mysql 数据,实现 MySQL 数据的持久化;

    2024年02月03日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包