k8s mysql pv_k8s+mysql+pv+pvc+NFS实现mysql容器编排
k8s+mysql+pv+pvc+NFS实现mysql容器编排
首先需要介绍概念:pv和pvc
PV 是集群提供的一种存储资源,是实际可用的磁盘。和挂 PV 的 Pod 有着独立的生命周期,Pod 销毁后,PV 可以继续存在,以此来实现持久化存储。
PVC 是用户使用存储资源的声明,和 Pod 这一概念类似,Pod 消耗的是 Node 上的计算资源,PVC 消耗的是 PV 资源。
k8s编排mysql,最重要的就是保存mysql数据库中的数据,如果不实现持久化存储,则一旦重启mysql的pod,就会导致数据丢失,这是根本不能允许的。k8s的持久化存储不像docker,可以通过-v来实现本地目录与容器目录的映射,由于k8s创建的pod不一定在哪台机器上,所以无法每次都把pod所在主机的目录映射到容器中去,这时就需要统一的存储作为共享存储来使用了,比如NFS,Ceph等。于是编写yml文件内容如下:
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
# namespace: default
labels:
pv: nfs-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
# FIXME: use the rightIP
server: 192.168.1.252
path:"/home/centos7/nfs"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 200Mi
storageClassName: nfs
selector:
matchLabels:
pv: nfs-pv
---
apiVersion: v1
kind: Service
metadata:
name: mysql-service
labels:
app: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
tier: mysql
clusterIP: None
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: mysql
labels:
app: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
tier: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
tier: mysql
spec:
containers:
- image:192.168.1.229/project/mysql:5.7.18
name: mysql
env:
- name:MYSQL_ROOT_PASSWORD
value:"123456"
ports:
- containerPort:3306
name: mysql
volumeMounts:
- name:mysql-persistent-storage
mountPath:/var/lib/mysql
volumes:
- name:mysql-persistent-storage
persistentVolumeClaim:
claimName:mysql-pv-claim
以上共定义了4个模块,分别是pv、pvc、service和deployment。
一个一个说:
① pv模块
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
# namespace: default
labels:
pv: nfs-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
# FIXME: use the rightIP
server: 192.168.1.252
path:"/home/centos7/nfs"
固定写法,最下方定义了nfs的server和path,这就需要k8s本机安装nfs-utils,才能识别nfs;其次,还要在nfs服务器上指定path,并确保挂载nfs后,可以正常创建文件,写入内容。这里创建的pv存储总大小为1GB。定义pv的名称为nfs-pv,label为nfs-pv。
② pvc模块
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 200Mi
storageClassName: nfs
selector:
matchLabels:
pv: nfs-pv
pvc向pv声明使用的存储空间大小为200MB,并且通过selector指定与label名为nfs-pv的pv相匹配,由于之前创建了label名为nfs-pv的pv,所以这里可以匹配成功,即pvc成功的向pv申请了200MB的空间。
③service
apiVersion: v1
kind: Service
metadata:
name: mysql-service
labels:
app: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
tier: mysql
clusterIP: None
定义service,名称为mysql-service,label为mysql,service端口号是3306。该service会自动匹配app:mysql的deployment。
④deployment
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: mysql
labels:
app: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
tier: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
tier: mysql
spec:
containers:
- image:192.168.1.229/project/mysql:5.7.18
name: mysql
env:
- name:MYSQL_ROOT_PASSWORD
value:"123456"
ports:
- containerPort:3306
name: mysql
volumeMounts:
- name:mysql-persistent-storage
mountPath:/var/lib/mysql
volumes:
- name:mysql-persistent-storage
persistentVolumeClaim:
claimName:mysql-pv-claim
deployment就比较复杂了,因为deployment起着承上启下的作用。对上,需要与service向连接,通过label;对下需要与pod相连接。pod中运行container,所以需要指定image,由于是mysql,所以还需要指定mysql的连接信息,如用户名和密码,端口等。最主要的,还需要挂载pvc,实现持久化存储,并最终将该存储映射到容器内的/var/lib/mysql路径下,实现数据的持久化。
以上都屡清楚后,就可以启动了,启动后,查看这4个模块的状态:
[root@devhadoop225 k8s]#kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
nfs-pv 1Gi RWO Retain Bound default/mysql-pv-claim nfs1 18h
[root@devhadoop225 k8s]#kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mysql-pv-claim Bound nfs-pv 1Gi RWO nfs1 18h
可以看到,pv和pvc已经实现了连接。忽略这里的nfs1,这是storageClassName: nfs1的配置,这个也可以不加。
[root@devhadoop225 k8s]#kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
deployment-wp NodePort 10.68.224.222 80:36661/TCP 5d
kubernetes ClusterIP 10.68.0.1 443/TCP 9d
mysql-service ClusterIP None 3306/TCP 16h
查看service也是正常的。
但查看pod时,出现了如下错误:
[root@devhadoop225 k8s]# kubectl logs
wordpress-mysql-6976864748-m2nph
Error from server: Gethttp://192.168.1.240:10250/containerLogs/default/wordpress-mysql-6976864748-m2nph/mysql:net/http: HTTP/1.x transport connection broken: malformed HTTP response"\x15\x03\x01\x00\x02\x02"
[root@devhadoop225 k8s]# kubectl describe
pods wordpress-mysql-6976864748-js75f
Warning BackOff 12s (x4over 41s) kubelet, 192.168.1.229 Back-off restartingfailed container
在k8s node端,查看container的运行日志,也没有任何内容,查不着任何有用的信息,于是就一直卡在这个问题上。但此时,在node上查看磁盘挂载情况,是可以看到的:
这说明,deployment中pvc申请是成功的。
尝试去掉如下部分,再启动k8s mysq了,则一切正常:
这说明,问题就出现在了这部分上。但就是找不到问题的突破口。按上面的报错信息查找原因,根本找不出来原因。
就这样过了一下午······这其中,也排除了几个问题,比如NFS目录不能写入的问题;ReadWriteMany与ReadWriteOnce不对称的问题;还有之前由于没有配置pv,只配置了pvc就想实现持久化存储的问题;还有pv如何与pvc相关联的问题等等。
后来,经过摸索,尝试在kubelet上直接运行docker命令创建mysql,但是volumes需要绑定nfs配置目录到容器的/var/lib/mysql,即执行:
docker run -p 3316:3306 --name mysql -v/data/mysql/conf:/etc/mysql/conf.d -v/var/lib/kubelet/pods/777d6238-d75c-11e8-b75b-ea2abbd44791/volumes/kubernetes.io~nfs/nfs-pv:/var/lib/mysql-e MYSQL_ROOT_PASSWORD=123456 -d 192.168.1.229/project/mysql:5.7.18
同样是创建失败,查看logs发现报错如下:
changing ownership of '/var/lib/mysql/': Operation notpermitted
正是因为这个错误的暴露,才让我解决了整个k8s+mysql+pv+pvc+nfs的整套问题!!!
在搜索这个问题时,在Stack Overflow中找到如下内容:
提示说确实是与NFS的配置有关,NFS默认是squash_all模式,但是要想使用NFS目录,将目录映射到docker容器中,必须要配置成no_root_squash模式才行,否则root用户无权限使用nfs的volume来映射docker容器中的目录!!!
no_root_squash模式:是登入 NFS 主机使用分享目录的使用者,如果是 root 的话,那么对于这个分享的目录来说,他就具有 root 的权限!这个项目『极不安全』,不建议使用!
这正是我遇到的问题,之前一直在排查k8s master节点的问题,查找资料有说是
kube-controller-manager的问题,但是排查一圈,没有发现问题。原来是NFS的问题啊,于是果断在NFS配置文件中增加了no_root_squash:
[root@dev252 etc]# more exports
#/home/centos7/ 192.168.1.0/24(insecure,rw,sync,fsid=0)
/home/centos7/nfs192.168.1.0/24(insecure,rw,sync,no_root_squash,fsid=0)
这样,再重启nfs后,再次通过k8s启动mysql service,就一切都正常了,可以正常创建pod,也可在240上正常创建容器了!
至此,就实现了k8s+mysql+pv+pvc+NFS的整套方案,首先是pv+pvc+NFS实现存储持久化;再将存储映射到容器中去,通过k8s实现容器编排,就完成了整套方案!!!
虽然花费了将近一天的时间,但是还是很值得的!!!
k8s mysql pv_k8s+mysql+pv+pvc+NFS实现mysql容器编排相关推荐
- k8s-----(| 三 |)存储Volume卷,PV / PVC,nfs持久化
文章目录 一. 存储Volume 卷 1. emptyDir本地临时卷 2. hostPath 本地卷 二 . PV/PVC 1. 概念 2. PV 一些概念 (1)PV 的类型(插件) (2)访问模 ...
- MySQL 如何使用 PV 和 PVC?
2019独角兽企业重金招聘Python工程师标准>>> 本节演示如何为 MySQL 数据库提供持久化存储,步骤为: 创建 PV 和 PVC. 部署 MySQL. 向 MySQL 添加 ...
- K8S 1.23.1部署 及 ElasticSearch/Kafka/MySQL部署
k8s&Docker安装 # 将 SELinux 设置为 permissive 模式(相当于将其禁用) sudo setenforce 0 sudo sed -i 's/^SELINUX=en ...
- k8s之持久化存储PV、PVC
目录 前言 一.k8s 容器磁盘 1.1 Volume(存储卷) 1.2 emptyDir 存储卷 1.3 hostPath存储卷 二.PV和PVC 1.PV 概念 2.PVC概念 3.PV 与 P ...
- corosync+pacemaker+nfs提供mysql高可用
corosync/openais+pacemaker+nfs提供mariadb高可用 节点一, one, 172.16.249.122/16, 172.16.0.1, CentOS6.6, maria ...
- nfs mysql_heatbeat-gui实现基于nfs的mysql高可用集群
一.简述HA高可用集群 高可用集群就是当集群中的一个节点发生各种软硬件及人为故障时,集群中的其他节点能够自动接管故障节点的资源并向外提供服务.以实现减少业务中断时间,为用户提供更可靠,更高效的服务. ...
- zabbix===》微信报警、聚合图形、自动发现自动注册、监控NFS、MySQL、web服务、URL地址
一.企业微信号申请 https://work.weixin.qq.com/ 1.注册 因为我们没有企业,所以我们选择组织. 下一步, 按需填好相应信息 2.配置微信企业号 设置好相应信息,后记录下企业 ...
- 资源利用率监控与存储卷(pv/pvc)
官网:https://kubernetes.io/zh/ 一.资源利用率的概述 k8s容器创建的时候是随机分配的,如果随机分配时,有一个节点分配得比较多时,则会出现卡顿等等的事情: 1.metrics ...
- Kubernetes-卷/存储卷(emptyDir/hostPath/pv/pvc)(十)
1 卷的介绍 1.1 卷的概念 在搞容器的时候,我们在处理完应用如何起,如何运行,最终落实到数据的时候,我们又要考虑2个问题:容器是如何访问外部磁盘存储的?容器之间如何共享存储空间?在一些场景下, ...
最新文章
- VUE3.0 一.安装node.js、vue3.0脚手架
- Nginx服务优化——性能与安全
- 微软10亿美元砸入OpenAI:明为AGI,暗争谷歌,被指云计算换投资
- c语言中count的头文件,求助C语言大佬 , 只会写到一个.c文件里 ,不会用.h头文件...
- 使用libssh2连接到远程服务器
- 关于阿里面试的的一个小题
- 对称加密实现重要日志上报Openresty接口服务
- mysql出现ERROR 1054 (42S22): Unknown column 'password' in 'field list'如何解决?
- 使用 rose 将 c++代码转换为 uml 类图
- 大数据需留意的六个安全问题
- NLP学习—21.自注意力机制(Self-Attention)与Transformer详解
- iphone7字体风格怎么改_苹果7怎么更改字体样式 苹果手机换好看的字体
- vlan间路由详细实验步骤
- 上海计算机应用基础自考上机,2012年上海自考《计算机应用基础》上机考核大纲...
- 300字总结计算机flash,flash实训报告心得(共10篇).docx
- OpenFOAM-6.0 如何创建已有标量场的梯度向量场
- 【xposed】虚拟机安装Magisk和LSPoesd
- CCProxy网络共享代理服务端配置使用
- 一加8T安装的EdXposed插件导致手机无限重启的解决办法
- 【软考四】软件知识产权基础知识(做题)
热门文章
- windwos下ffmpeg的安装
- android全方位性能优化方法
- mysql 复制数据_MySQL快速复制数据库数据表的方法
- java 字符字节数组_Java字符串与字符、字节数组知识点总结
- 【腾讯游戏面试题】面向对象的设计原则是什么?
- WiFi 6 目前还不适合个人用户
- 从源头入手,一分钟秒懂为什么要搞微服务架构?(转)
- python minimize_【趣味案例】用Python来做一个屏幕录制工具
- js生成图片_网页骨架屏自动生成方案(dps)
- intel cpu 漏洞 linux,Intel CPU架构漏洞越捅越大:打补丁将损失30%性能