k8s怎么加mysql k8s 数据库

容器化 | 在 KubeSphere 中部署 MySQL 集群 本文将演示如何在 KubeSphere[1] 上部署RadonDB MySQL on Kubernetes 2.1.2 ,快速实现高可用的 MySQL on K8s 。
若已在 KubeSphere 部署过历史版本 Operator,可以选择如下方式更新到最新版本 。
可任选一个 RadonDB MySQL 配置示例[5] 部署,或自定义配置部署 。
以mysql_v1alpha1_mysqlcluster.yaml模版为例,创建一个 RadonDB MySQL 集群 。
注意
未指定项目时,集群将被默认安装在kubesphere-controls-system项目中 。若需指定项目 , 安装命令需添加--namespace=project_name。
预期结果
预期结果
在demo-project项目中,查看 RadonDB MySQL 集群状态 。
至此 , 完成在 KubeSphere 中部署 RadonDB MySQL 集群 。
[1]:KubeSphere:
[2]:OpenPitrix:
[3]:创建操作:
[4]:项目网关:
[5]:配置示例:
k8s怎么解决mysql故障迁移的k8s怎么解决mysql故障迁移k8s怎么加mysql的
有两种方法k8s怎么加mysql: 直接用yum源进行安装yum -y install mysql-server 源码安装去mysql官网下载k8s怎么加mysql你需要k8s怎么加mysql的版本,解压,创建用户,/usr/local/mysql5.6/scripts/mysql_install_db --basedir=/usr/local/mysql5.6 --datadir=/data/mysql5.6 --user=mysql
如何访问k8s集群内部署的mysql服务虽然 kubernetes 社区一直在努力使得有状态应用成为一等公民,也推出了 statefulset 控制器支持 pod 的顺序部署 , 稳定的域名访问和存储访问 。但鉴于 MySQL 部署运维的多样性和复杂性 , 在 kubernetes 上部署 MySQL 仍然要面临众多挑战 。
1、业务流量入口的配置方式
传统虚拟机环境下 , 我们通过虚IP的方式,让业务应用都配置事先定义的一个虚IP为链接数据库的地址 , 然后由高可用服务保证虚IP始终能被路由到master数据库 。在kubernetes中 , 出现了一层网络插件屏蔽了底层网络拓扑,高可用服务管理虚IP的方式需要随之适应调整,比如通过service结合标签完成虚IP的漂移,但service本身是kubernetes提供的一项功能,其可靠性和性能都取决于kubernetes服务的稳定 。以性能来说 , service是kubeproxy组件通过配置iptables实现的,当iptables规则较多时不可避免的会产生时延 , 需要我们针对性的解决 。
2、容器隔离带来的监控视野问题
在 kubernetes 中,如果将 MySQL 制作为 container 运行在一个 pod 中,container 会将 MySQL 进程和运行环境隔离在一个单独的 namespace 中 。监控组件在获取 MySQL 的一些 metirc 时 , 可能不得不进入与 MySQL 同一个 namespace 中,在部署和设计监控组件时需要考虑到这些限制 。
3、存储在 kubernetes 中 , 支持配置各种不同的存储 。
如果使用本地存储 local persistent volume , 则需要绑定 MySQL 在一个固定的节点,这就完全浪费了 kubernetes 灵活调度的天然优势;而如果使用远程共享存储,确实是将 MySQL 进程与其存储完全解耦,使得 MySQL 进程可以在任意节点调度,然而考虑到高 I/O 吞吐量的情况,就不是那么美好了 。设计时需要考量远程存储是否能够满足 MySQL 的带宽要求 。
4、高可用/备份恢复
kubernetes 提供的 statefulset 控制器只能提供最基本的部署 , 删除功能,无法实现完善的 MySQL 集群高可用/备份恢复操作 。对于有状态应用的部署,仍需要定制开发,所以多数公司提供了定制的 operator 来完成应用容器的管理 。比如 etcd operator,MySQL operator,后文将为大家详述我测试使用 MySQL operator 的一些记录 。
Kubernetes 部署 Mysql 8mysql可以以docker的形式在集群内部署 , 也可以安装在集群之外,以服务的形式部署到集群内 。
(1)、如果是在集群内部署,可以启动一个ReplicationController,用以对mysql pod进行监控,并同时启动一个Service,用以集群访问 。
(2)、如果mysql是安装在集群之外,那么可以启动一个Endpoint和Service , 将mysql引入集群之中 。
下面分别对这两种方式进行部署 。
创建mysql-rc.yaml和mysql-svc.yaml,分别如下:
mysql-rc.yaml
mysql-svc.yaml
在mysql-rc.yaml中,image参数可以指定mysql的版本,如8.0.11、5.7.22等 。这里省略了,表示用latest 。另外,可以指定镜像库,这里使用阿里云镜像库 , 在安装docker时进行了配置 。env参数指定了mysql的root密码 。
在mysql-svc.yaml中,targetPort表示mysql pod中mysql窗口的目标端口,默认为3306,type类型为NodePort , 表示将映射到本地端口,本地端口为nodePort: 30306 。
接下来启动ReplicationController和Service , 执行以下命令:
启动后可以查看mysql部署在了哪个node上,执行以下命令可以查看:
(6)、退出mysql和容器,执行quit;退出mysql , 按ctrl p后,再按ctrl q从容器中返回node主机 。
设置好mysql后 , 可以远程连接node中的mysql , node的ip为127.0.0.1,映射的端口为30306,可以用navicat工具连接到这个myql 。
k8s中的Mysql数据库持久化存储
一、配置:
环境:
CentOS7
VMware
笔者配置了四台虚拟机:
K8S-Master节点:3GB内存2核CPU20GB硬盘空间
K8S-node1节点:2GB内存2核CPU30GB硬盘空间
K8S-node2节点:2GB内存2核CPU30GB硬盘空间
镜像仓库节点:2GB内存2核CPU50GB硬盘空间
二、节点规划:
使用三台虚拟机搭建K8S集群,使用一台虚拟机搭建镜像仓库 。
每台虚拟机配置两块网卡 , 其中一块为“NAT模式”,用于拉取镜像等功能 。
另外一块网卡为“仅主机模式” , 用于集群节点间的通信 。归划如下:
K8s-master节点:
仅主机模式:10.10.10.200
NAT模式:192.168.200.130
K8S-node1节点:
仅主机模式:10.10.10.201
NAT模式:192.168.200.131
K8S-node2节点:
仅主机模式:10.10.10.202
NAT模式:192.168.200.132
镜像仓库节点:
仅主机模式:10.10.10.101
NAT模式:192.168.200.150
三、版本信息
Linux内核版本:
Linux version 3.10.0-862.el7.x86_64 (builder@kbuilder.dev.centos.org)
(gcc version 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) )
#1 SMP Fri Apr 20 16:44:24 UTC 2018
K8s集群版本为1.15.0版本:
四、基于StatefulSet与PV/PVC的MySql持久化存储实验
1. 在每个节点安装nfs服务
在“镜像仓库”节点 , 执行以下命令:
yum install -y nfs-common nfs-utils rpcbind
在k8s集群,执行以下命令:
yum install -y nfs-utils rpcbind
2. 在“镜像仓库”节点下,配置nfs服务器
mkdir /nfs_mysql
Chmod 777 /nfs_mysql/
(在测试环境中 , 为了不考虑用户属性,暂时赋予777权限,但在生产环境不推荐这样做)
Chown nfsnobody /nfs_mysql/
echo “/nfs_mysql *(rw,no_root_squash,no_all_squash,sync)”/etc/exports
cat /etc/exports
/nfs_mysql *(rw,no_root_squash,no_all_squash,sync)
systemctl start rpcbind
systemctl start nfs
3. 测试nfs服务是否可用
mkdir /test
showmount -e 10.10.10.101
可见/nfs_mysql *已暴露于共享目录,接下来测试挂载是否可用:
在master节点下执行:
mount -t nfs 10.10.10.101:/nfs_mysql /test/
echo "hello-world"/test/1.txt
在镜像仓库节点下查看1.txt是否存在 , 若存在则挂载成功:
可见nfs服务可以正常使用,接下来删除test目录和1.txt
在镜像仓库下:
[root@hub nfs_mysql]# rm -f 1.txt
在Master节点下:
[root@k8s-master ~]# umount /test/
[root@k8s-master ~]# rm -rf /test/
同理,依照以上步骤同时创建:(提供多个mysql副本进行挂载)
nfs_mysql1
nfs_mysql2
完成后需要重启nfs服务
systemctl restart rpcbind
systemctl restart nfs
最终效果:
4. 将nfs封装成pv
创建mysql_test文件夹,将yaml文件统一保存在此目录下
mkdir mysql_test
cd mysql_test
vim mysql-pv.yml
mysql-pv.yml配置如下:
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
spec:
capacity:
storage: 5Gi
accessModes:
-ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs
nfs:
path: /nfs_mysql
server: 10.10.10.101
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv1
spec:
capacity:
storage: 5Gi
accessModes:
-ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs
nfs:
path: /nfs_mysql1
server: 10.10.10.101
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv2
spec:
capacity:
storage: 5Gi
accessModes:
-ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs
nfs:
path: /nfs_mysql2
server: 10.10.10.101
注意:
在k8s集群15版本中recycle回收策略已被删除 , 只能用retain策略或者Delete策略 。这里我们使用persistentVolumeReclaimPolicy: Retain
执行命令:
kubectl create -f mysql-pv.yml
kubectl get pv
如图所示,即为Pv创建成功 。
5. 部署MySQL,在mysql_test目录下编写mysql.yml,配置文件如下
apiVersion: v1
kind: Service
metadata:
name: mysql
labels:
app: mysql
spec:
ports:
- port: 3306
name: mysql
clusterIP: None
selector:
app: mysql
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
serviceName: "mysql"
replicas: 3
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.6
env:
- name: MYSQL_ROOT_PASSWORD
value: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-persistent-storage
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "nfs"
resources:
requests:
storage: 1Gi
执行以下命令,部署mysql服务:
kubectl create -f mysql.yml
如图可知,mysql按StatefulSet依次创建了mysql-0 mysql-1 mysql-2
查看各个Pod部在哪个节点:
6. 通过创建临时容器,使用MySQL客户端发送测试请求给MySQL master节点
注意:
主机名为mysql-0.mysql;跨命名空间的话,主机名请使用mysql-0.mysql.[NAMESPACE_NAME].如果没有指定命名空间,默认为default,即mysql-0.mysql.default 。
这里笔者打算关闭node2节点来模拟node2宕机,来测试是否实现数据的持久化存储 ,
所以我们向node2上的mysql1写入数据 。
执行以下命令 , 访问mysql1:
kubectl run mysql-client --image=mysql:5.6 -it --rm --restart=Never -- mysql -h mysql-1.mysql.default -p password
创建数据库demo,并向messages表中写入hello-world
CREATE DATABASE demo;
CREATE TABLE demo.messages (message VARCHAR(250));
INSERT INTO demo.messages VALUES ('hello-world');
如图所示
接下来我们来关闭k8s-node2虚拟机,模拟宕机
查看nodes的运行状态,可知node2的状态已转变为NotReady
一段时间后,k8s将Pod MySql -1迁移到节点k8s-node1
由于时间过长 , 笔者把三个Pod都删除重启后,验证数据:
MySQL服务恢复,数据完好无损!
k8s本地构建后台开发环境近期陆续遇到几个问题,涉及到zk和kafka相关 。为了学习zk和kafka等中间件,同时也更方便的程序,萌生了在本地部署mysql , zk , kafka集群的想法 。毕竟集群维度的扩容,启停等操作没有办法在测试环境中执行 。
在云原生的背景下,使用k8s来部署这些中间件无疑是最方便的选择之一,也可以顺便学习一下k8s,于是有了这篇文章 。使用k8s还有一个好处,只需写好yaml文件,其他同学也可以快速复制这个环境 。
本文不会可以介绍k8s相关的概念,这是一篇tutorial,重点在于可以快速的复刻 。
虽然不刻意介绍k8s相关的概念,但是有些概念还是不得不提 。k8s中服务分为有状态的服务(stateful)和无状态的服务(stateless),mysql、zk、kafka等都属于有状态的服务 。我们要部署多节点的集群,而不是像使用docker似的直接拉起一个单节点服务 。对这些细节感兴趣的同学,请阅读k8s的官方文档进行学习 。
k8s关于stateful的介绍和示例:
最后提一点 , 学无止境,也要适可而止,重点还是放在测试业务上,比如测试集群节点down机后业务软件的高可用设计等 。
ok, let's go
部署mysql集群仅需按照 官方文档 步骤操作即可 , 有如下点改动:
mysql-services.yaml
mysql-statefulset.yaml
执行如下命令即可创建mysql集群
查看services列表,可看到有读写两个services,其中可写的集群外部可通过30001访问 。请注意cluster ip列都是k8s内部访问的IP,本地访问IP地址使用127.0.0.1
NAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGE
kubernetesClusterIP10.96.0.1none443/TCP25h
mysqlNodePort10.110.247.59none3306:30001/TCP13m
mysql-readClusterIP10.108.247.87none3306/TCP13m
在外部访问方式:mysql -h127.0.0.1 -P30001 -uroot
参考这篇文档:
kafka的这个镜像给的配置较低,存在服务启动慢和健康检查执行时间长的问题,需要设置readinessProbe下的initialDelaySeconds和timeoutSeconds参数,检查间隔也调整为20s 。
【k8s怎么加mysql k8s 数据库】k8s怎么加mysql的介绍就聊到这里吧,感谢你花时间阅读本站内容 , 更多关于k8s 数据库、k8s怎么加mysql的信息别忘了在本站进行查找喔 。

    推荐阅读