如何在 Kubernetes 环境中搭建 MySQL(四):使用 StorageClass 挂接 RBD
MySQL + Kubernetes
1. 简介
在系列文章的第三篇中,讲到了如何使用 PV 和 PVC 挂载 RBD 上建立好的块存储镜像,但这还是不足以满足 cloud native 环境下的需求,试想如果部署一个应用,需要申请十个 RBD images,PV 和 PVC 的方式下,就需要先手动在 ceph 集群上部署十个 image,这在实际操作时,是完全不可接受的,就算用 Webhook 机制调用脚本自动执行,也会存在一些问题,比如何时释放 RBD image,而且这样也增加了系统的复杂度,更易出错,所以最好是有 Kubernetes 的原生的解决方案。而 Kubernetes 确实提供这样的解决方案,就是本文要谈到的 StorageClass。
我对 StorageClass 的理解是: 对系统提供的存储能力进行抽象,并使用客户端与存储系统进行交互,来达到动态获取存储能力的目的。也就是说,客户端是要和 StorageClass 配套使用的,用哪种类型的存储,就需要启动对应的客户端,RBD 的客户端叫做 rbd-provisioner。
2. 配置 StorageClass
首先需要获取 ceph 的密钥:
$ ceph auth get-key client.admin | base64 QVFCTnFzMWFuMDNoRGhBQUVrMjlXNlZzYnN6Yk13bWZvVmt0bkE9PQ==
然后创建名为 ceph-secret 的 secret,后面的 StorageClass 会用到。
$ cat ceph-secret.yaml apiVersion: v1 kind: Secret metadata: name: ceph-secrettype: "kubernetes.io/rbd"data: key: QVFCTnFzMWFuMDNoRGhBQUVrMjlXNlZzYnN6Yk13bWZvVmt0bkE9PQ==
接下来看一下 StorageClass 配置文件的实例:
$ cat storage-class.yaml kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: rbd provisioner: ceph.com/rbd parameters: monitors: 192.168.250.91:6789 adminId: admin adminSecretName: ceph-secret adminSecretNamespace: default pool: rbd userId: admin userSecretName: ceph-secret fsType: ext4 imageFormat: "2" imageFeatures: "layering"
大部分的内容和 PV 里的配置是一样的,那么就挑几个之前没有介绍过的参数说一下:
provisioner: 就是之前所说的客户端,官方文档中使用的 provisioner 是默认的 kubernetes.io/rbd,注意要改成 ceph.com/rbd,kubernetes.io/rbd 是无法正常使用的,原因是 kubernetes.io/rbd 会在 kube-controller-manager 镜像中查找 RBD 可执行文件,但默认的 kube-controller-manager 镜像是没有的,需要自己来定制镜像,具体细节可参考该链接:Error creating rbd image: executable file not found in $PATH。改为 "ceph.com/rbd" 后,使用的是外部的 RBD 可执行文件,具体的做法会在下一节中介绍。
adminId | userId:连接 ceph 的权限,admin 已存在,如果有需要创建其他用户,可以在 Ceph 集群中创建,并赋予对应的权限,简单使用的话,admin 也足够了。
adminSecretName:Ceph admin 所使用的密钥,复用之前创建的即可。
adminSecret。namespace:密钥所在的命名空间,默认是 default,如果修改为其他的话,需要修改 ceph-secret.yaml,增加 namespace字段:namespace-name。
创建 StorageClass:
$ kubectl create -f storage-class.yamlstorageclass "rbd" created $ kubectl get storageclass NAME TYPE rbd ceph.io/rbd
3. 配置 rbd-provisioner
首先要下载 kubernetes-incubator git 库,RBD 的内容存储在 external-storage/ceph/rbd/deploy/ 目录下。
$ git clone https://github.com/kubernetes-incubator/external-storage.git $ tree external-storage/ceph/rbd/deploy/ ├── README.md ├── non-rbac │ └── deployment.yaml └── rbac ├── clusterrole.yaml ├── clusterrolebinding.yaml ├── deployment.yaml └── serviceaccount.yaml
分为 RBAC 和 无 RBAC 两种部署方式,RBAC 就是基于角色的权限控制,kubeadm 搭建的 Kubernetes 集群默认开启了 RBAC,所以本文选用 RBAC 方式。external-storage 中提供的方式是部署在 default namespace 中的,如果要部署在其他 namespace 中,需要做对应的修改。
接下来就把 RBD provisioner 启动起来吧:
$ kubectl create -f external-storage/ceph/rbd/deploy/rbac/ clusterrole "rbd-provisioner" created clusterrolebinding "rbd-provisioner" created deployment "rbd-provisioner" created serviceaccount "rbd-provisioner" create $ kubectl get pod --selector app=rbd-provisioner NAME READY STATUS RESTARTS AGE rbd-provisioner-6f4f7fcf5f-4gdmj 1/1 Running 0 6m
4. 挂载 StorageClass
一切就绪,接下来就试试能否动态的获取 RBD 存储空间吧。
先创建 PVC,看看 PVC 能否处于 bound 状态。
$ cat dynamic-volume-claim.yamlapiVersion: v1kind: PersistentVolumeClaimmetadata: name: mysql-dynamic-pvcspec: accessModes: - ReadWriteOnce storageClassName: rbd resources: requests: storage: 1Gi $ kubectl create -f dynamic-volume-claim.yaml NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE mysql-dynamic-pvc Bound pvc-65ddafb2-6f9d-11e8-b243-d09466144cbf 1Gi RWO rbd 5d
接下来再将该 PVC 挂载到 MySQL 实例上。
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2kind: 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 subPath: mysql readOnly: false volumes: - name: mysql-persistent-storage persistentVolumeClaim: claimName: mysql-dynamic-pvc
至此完成 RBD 的动态挂载,下一篇文章来谈一谈如何使用 StatefulSet 部署主从同步的 MySQL 集群。
作者:blackpiglet
链接:https://www.jianshu.com/p/fb6b521c6438
共同学习,写下你的评论
评论加载中...
作者其他优质文章