如何在 Kubernetes 環境中搭建 MySQL(四):使用 St
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
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4422/viewspace-2820235/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用 kind 快速搭建 kubernetes 環境
- Kubernetes環境搭建
- GPU 環境搭建指南:使用 GPU Operator 加速 Kubernetes GPU 環境搭建GPU
- 如何在kubernetes環境中共享GPUGPU
- Kubernetes學習---環境搭建篇
- 新手搭建 kubernetes 測試環境
- Kubernetes搭建 Helm 與 Swift 環境Swift
- 傲視Kubernetes(二):Docker映象搭建與本地Kubernetes環境搭建Docker
- 使用 KubeKey 搭建 Kubernetes/KubeSphere 環境的"心路(累)歷程"
- MySQL環境搭建利器---SandboxMySql
- Kubernetes入門,使用minikube 搭建本地k8s 環境K8S
- WebDriver環境搭建使用Web
- 生產環境中MySQL複製的搭建KPMySql
- 四、Clion搭建FFmpeg開發環境開發環境
- GPU 環境搭建指南:如何在裸機、Docker、K8s 等環境中使用 GPUGPUDockerK8S
- 如何在CentOS 7上搭建LAMP環境(使用YUM或編譯)CentOSLAMP編譯
- 使用 VSCode 搭建 Flutter環境VSCodeFlutter
- 使用docker搭建laravel環境DockerLaravel
- 使用docker搭建gitlab環境DockerGitlab
- 第二課 如何在WINDOWS環境下搭建以太坊開發環境Windows開發環境
- 在容器環境搭建mysql備庫MySql
- Linux搭建PHP+MySQL+Apache環境LinuxPHPMySqlApache
- Hadoop 系列(四)—— Hadoop 開發環境搭建Hadoop開發環境
- 基於minikube快速搭建kubernetes單節點環境
- 如何在 docker for win 上搭建 Laravel 開發環境DockerLaravel開發環境
- 手把手教你,如何在windows系統搭建mysql主從複製的環境WindowsMySql
- 在Mac下怎麼搭建MySQL環境?MacMySql
- 使用docker快速搭建hive環境DockerHive
- 使用 Docker 搭建 Laravel 本地環境DockerLaravel
- 如何在rac環境中增加監聽
- 聊聊如何在docker環境中配置hostsDocker
- 如何在Eclipse中配置安卓環境Eclipse安卓
- 環境搭建
- Android systrace環境的搭建和使用Android
- 使用 Rainbond 搭建本地開發環境AI開發環境
- 使用 Docker 搭建本地開發環境!Docker開發環境
- 從環境搭建到打包使用TypeScriptTypeScript
- 使用 PhpStorm + Docker 搭建開發環境PHPORMDocker開發環境