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实现容器编排,就完成了整套方案!!!


虽然花费了将近一天的时间,但是还是很值得的!!!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容