MySQL in Kubernetes

MySQL 中的数据是关键信息,是有状态的,不可能随着 MySQL pod 的销毁而被销毁,所以数据必须要外接到一个可靠的存储系统中,目前已经有了 Ceph 系统,所以这里就只考虑如何将 Ceph 作为外部存储的情况,毕竟没有条件去尝试其他存储方案。

本文从最简单的 k8s 连接 ceph 方式开始, 并过渡到 PV(Persistent Volume) 和 PVC(Persistent Volume Claim)方式,本系列文章后面还会介绍使用 StorageClass 的动态连接方式。

1. 概念介绍和环境信息

1.1 PV(Persistent Volume)简介:

PV 是集群提供的一种存储资源,是实际可用的磁盘。和挂 PV 的 Pod 有着独立的生命周期,Pod 销毁后,PV 可以继续存在,以此来实现持久化存储。

1.2 PVC(Persistent Volume Claim)简介:

PVC 是用户使用存储资源的声明,和 Pod 这一概念类似,Pod 消耗的是 Node 上的计算资源,PVC 消耗的是 PV 资源。

1.3 环境信息

本文在 Ubuntu 物理机环境下,使用 kubeadm 部署 Kubernetes,连接已经部署好的 Ceph 集群,后文会对部署过程做详细说明。

操作系统:Ubuntu 16.04

Ceph:Luminous 12.2

Kubernetes:v1.10.2

Docker:v1.13.1

2. 使用 keyring 文件连接 RBD

首先让我们用最基础的方式连接 Ceph,以下就是 yaml 文件,简要介绍一下关键字段:

monitors: 连接的 Ceph monitor 地址,注意要更改成环境中对应的 Ceph monitor 地址。

keyring:Ceph 集群认证所需的密钥,这里以本地文件的形式挂载进去。这个文件的内容就是 ceph 集群里 /etc/ceph/ceph.client.admin.keyring 文件的内容。

imageformat:建议使用 2,1 是更老的格式。

imagefeatures:磁盘文件的特性,Ubuntu 16.04 和 CentOS7.4 的内核版本目前支持的特性较少,建议只填写 layering,如果要使用其他特性,需升级内核版本。

pool:Ceph 中的 pool。

image:Ceph RBD 创建的镜像名称。

$ cat mysql-deployment.yaml

apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2

kind: Deployment

metadata:

name: mysql

spec:

selector:

matchLabels:

app: mysql

strategy:

type: Recreate

template:

metadata:

labels:

app: mysql

spec:

terminationGracePeriodSeconds: 10

containers:

- name: mysql

image: mysql:5.7

env:

- name: MYSQL_ROOT_PASSWORD

valueFrom:

secretKeyRef:

name: mysql-secret

key: ROOT_PASSWORD

ports:

- containerPort: 3306

name: mysql

volumeMounts:

- name: rbdpd

mountPath: /var/lib/mysql

volumes:

- name: rbdpd

rbd:

monitors:

- '192.168.56.106:6789'

pool: rbd

image: foo

fsType: ext4

readOnly: false

user: admin

imageformat: "2"

imagefeatures: "layering"

keyring: /etc/ceph/keyring

在执行该 yaml 文件之前,我们需要先在 RBD 中创建名为 foo 的镜像,不然 pod 无法创建成功。

# rbd create foo --size 2048M

# rbd list

foo

# rbd feature disable foo exclusive-lock, object-map, fast-diff, deep-flatten

此时再执行 $ kubectl create -f mysql-deployment.yaml 就可以了。

3. 使用 secret 连接 RBD

直接挂载密钥文件既不正规,也不安全,我们可以使用 Kubernetes 的 secret 来加密密钥文件。

先获取加密后的密钥字符串:

$ ceph auth get-key client.admin | base64

将 填写进 ceph-secret.yaml 文件中的 key 字段:

$ cat ceph-secret.yaml

apiVersion: v1

kind: Secret

metadata:

name: ceph-secret

type: "kubernetes.io/rbd"

data:

key:

创建该 secret:

kubectl create -f ceph-secret.yaml

最后修改 mysql-deployment.yaml 对应字段:

$ cat mysql-deployment.yaml

apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2

kind: Deployment

metadata:

name: mysql

spec:

selector:

matchLabels:

app: mysql

strategy:

type: Recreate

template:

metadata:

labels:

app: mysql

spec:

terminationGracePeriodSeconds: 10

containers:

- name: mysql

image: mysql:5.7

env:

- name: MYSQL_ROOT_PASSWORD

valueFrom:

secretKeyRef:

name: mysql-secret

key: ROOT_PASSWORD

ports:

- containerPort: 3306

name: mysql

volumeMounts:

- name: rbdpd

mountPath: /var/lib/mysql

volumes:

- name: rbdpd

rbd:

monitors:

- '192.168.56.106:6789'

pool: rbd

image: foo

fsType: ext4

readOnly: false

user: admin

imageformat: "2"

imagefeatures: "layering"

secretRef:

name: ceph-secret

$ kubectl apply -f mysql-deploy.yaml

4. 使用 PV 和 PVC 连接 RBD

好,最后就是使用 PVC 和 PV 挂载 RBD 镜像了。

先是 PV 文件:

$ cat volume.yaml

apiVersion: v1

kind: PersistentVolume

metadata:

name: mysql-pv

spec:

capacity:

storage: 1Gi

accessModes:

- ReadWriteOnce

claimRef:

name: mysql-pvc

namespace: default

persistentVolumeReclaimPolicy: Recycle

rbd:

monitors:

- 192.168.56.106:6789

pool: rbd

image: foo

user: admin

fsType: ext4

readOnly: false

secretRef:

name: ceph-secret

然后是 PVC:

$ cat volume-claim.yaml

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

name: mysql-pvc

spec:

accessModes:

- ReadWriteOnce

resources:

requests:

storage: 1Gi

最后挂载在 MySQL 上

$ cat mysql-deployment.yaml

apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2

kind: Deployment

metadata:

name: mysql

spec:

selector:

matchLabels:

app: mysql

strategy:

type: Recreate

template:

metadata:

labels:

app: mysql

spec:

terminationGracePeriodSeconds: 10

containers:

- name: mysql

image: mysql:5.7

env:

- name: MYSQL_ROOT_PASSWORD

valueFrom:

secretKeyRef:

name: mysql-secret

key: ROOT_PASSWORD

ports:

- containerPort: 3306

name: mysql

volumeMounts:

- name: mysql-persistent-storage

mountPath: /var/lib/mysql

volumes:

- name: mysql-persistent-storage

persistentVolumeClaim:

claimName: mysql-pvc

到这里 MySQL 就成功的使用 ceph RBD 作为持久化存储方案,部署在了 k8s 环境里,不过这还是很初级的方案,毕竟在挂载之前还需要手动在 RBD 中创建镜像,太不 cloud native 了,接下来的文章将演示如何动态的使用 RBD 镜像。

5. 参考文档

ceph rbd mysql_如何在 Kubernetes 环境中搭建 MySQL(三):使用 PVC 挂接 RBD相关推荐

  1. k8s mysql 挂载_如何在 Kubernetes 环境中搭建 MySQL(四):使用 StorageClass 挂接 RBD...

    MySQL + Kubernetes 1. 简介 在系列文章的第三篇中,讲到了如何使用 PV 和 PVC 挂载 RBD 上建立好的块存储镜像,但这还是不足以满足 cloud native 环境下的需求 ...

  2. ubuntu安装mysql_如何在Ubuntu14.04中安装mysql

    原标题:如何在Ubuntu14.04中安装mysql 接触过MySQL的小伙伴们都知道,在Windows下安装MySQL是一件让人十分头大的事情,但是在Ubuntu等其他Linux系统中安装MySQL ...

  3. (23/24) webpack实战技巧:如何在webpack环境中使用Json

    (23/24) webpack实战技巧:如何在webpack环境中使用Json 在webpack1或者webpack2版本中,若想在webpack环境中加载Json文件,则需要加载一个json-loa ...

  4. linux python开发环境_如何在Linux系统中搭建Python编程环境

    1 在大多数的Linux系统中,基本上都默认安装了Python,也就是说,在Linux的系统中基本上是不需要安装什么软件,就可以使用Python. 下面以ubuntu操作系统为例,看看如何在Linux ...

  5. 如何在DOCKER环境中使用DB2

    如何在DOCKER环境中使用Db2 前言 此问的目的是帮助用户能够在docker的环境中学习Db2,前提条件的你的服务器可以访问互联网,否则无法下载Db2镜像.Docker环境中学习Db2的优势是省去 ...

  6. vgpu服务器显卡性能,如何在vGPU环境中优化GPU性能

    大家好, 我收到了关于如何在vGPU环境中优化GPU性能的两个请求,并认为这将是我们的GRID论坛上的一个很好的线程,每个人都可以在他们如何微调vGPU环境方面添加他们的经验. 让我从一些公共资源开始 ...

  7. 如何在Linux环境中使用USB存储器(转)

    如何在Linux环境中使用USB存储器(转) 如何在Linux环境中使用USB接口的存储设备?这是各大电脑论坛上出现得比较多的一个问题,同此可见这也是摆在许多电脑玩家面前的一道难题.本文就为您提供一套 ...

  8. ANSYS mechanical如何在Workbench环境中使用高性能计算

    ANSYS mechanical属于隐式结构有限元分析求解器,一般完成一个有限元分析过程需要前处理.求解和后处理三个步骤.前处理一般在图形工作站上完成,有限元求解可在工作站.集群及SMP 服务器上进行 ...

  9. 如何在 Windows 10 中搭建 Node.js 环境?

    2019独角兽企业重金招聘Python工程师标准>>> [编者按]本文作者为 Szabolcs Kurdi,主要通过生动的实例介绍如何在 Windows 10 中搭建 Node.js ...

最新文章

  1. Arm架构CPU服务器
  2. C语言字符数组与字符串的使用及加结束符‘\0‘的问题
  3. 100+人的企业IP怎么进行安全配置 ?
  4. 学习python:练习3.随机生成200个序列号存入文件
  5. MySQL【环境搭建 03】腾讯云 Linux 环境踩坑 loading shared libraries: libnuma.so.1 + quit without updating PID file
  6. 解决android中出现的无法加载library的问题
  7. 广东高校计算机专业,广东高校计算机专业就业率最低 专业设置忌盲目
  8. 中序线索树和后序线索树
  9. 照片转3d模型_三星使用AI将照片转换为3D模型
  10. ONNX系列三 --- 使用ONNX使PyTorch AI模型可移植
  11. Android view 小总结
  12. 大学生影视主题网页制作 腾龙电影网页设计模板 学生静态网页作业成品 dreamweaver电影HTML网站制作
  13. 山东理工大学计算机基础考试试题,山东理工大学计算机基础试题08
  14. matlab 多项式输入,MATLAB多项式
  15. 程序员必须要熟知的英文单词--更新中
  16. mysql索引失效的常见9种原因详解
  17. 什么是CC攻击,CC攻击的防御方式有哪些
  18. 使用CSS实现图片叠加效果
  19. 六度分离(floyd算法,SPFA算法,最短路—Dijkstra算法)
  20. Dbeaver Phoenix 各种报错

热门文章

  1. 阿里新版java开发手册(2019华山版、2020泰山版)
  2. Panda3D引擎简介跟初步体验
  3. 计算机应用中的pe是什么意思,重装系统的pe是指什么?pe有什么作用?
  4. Docker基础: Linux内核命名空间之(1) mnt namespace
  5. 勒索软件攻击:如何使用加密来保护您的数据
  6. 饮水思源--浅析深度学习框架设计中的关键技术
  7. 用传统流程图表示求解以下问题的算法有两个瓶子A和B
  8. C语言用if语句判断规定字符串
  9. css动画实现跳动的小人
  10. 郎平,你回来会毁了中国女排!