k8s系列(4)-MongoDB数据持久化

2022-10-21 10:01:40 浏览数 (1)

完整系列

  1. k8s系列(1)-腾讯云CVM手动部署K8S_Dashboard安装1
  2. k8s系列(1)-腾讯云CVM手动部署K8S_Dashboard安装2
  3. k8s系列(2)-Service
  4. k8s系列(3)-StatefulSet的MongoDB实战
  5. k8s系列(4)-MongoDB数据持久化
  6. k8s系列(5)-Configmap和Secret
  7. k8s系列(6)-Helm
  8. k8s系列(7)-命名空间
  9. k8s系列(8)-Ingress
  10. k8s系列(9)-容忍、污点、亲和

一. 介绍

kubernetes 集群不会为你处理数据的存储,我们可以为数据库挂载一个磁盘来确保数据的安全。

你可以选择云存储、本地磁盘、NFS。

Persistent Volume (PV)

描述卷的具体信息,例如磁盘大小,访问模式。文档,类型,Local 示例

代码语言:txt复制
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mongodata
spec:
  capacity:
    storage: 2Gi
  volumeMode: Filesystem  # Filesystem(文件系统) Block(块)
  accessModes:
    - ReadWriteOnce       # 卷可以被一个节点以读写方式挂载
  persistentVolumeReclaimPolicy: Delete
  storageClassName: local-storage
  local:
    path: /root/data
  nodeAffinity:
    required:
      # 通过 hostname 限定在某个节点创建存储卷
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - node2

Persistent Volume Claim (PVC)

对存储需求的一个申明,可以理解为一个申请单,系统根据这个申请单去找一个合适的 PV

还可以根据 PVC 自动创建 PV。

代码语言:txt复制
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mongodata
spec:
  accessModes: ["ReadWriteOnce"]
  storageClassName: "local-storage"
  resources:
    requests:
      storage: 2Gi

为什么要这么多层抽象

  • 更好的分工,运维人员负责提供好存储,开发人员不需要关注磁盘细节,只需要写一个申请单。
  • 方便云服务商提供不同类型的,配置细节不需要开发者关注,只需要一个申请单。
  • 动态创建,开发人员写好申请单后,供应商可以根据需求自动创建所需存储卷。

二. hostPath(用来学习)

代码语言:txt复制
kubectl rollout restart statefulset mongodb
image.pngimage.png

把节点上的一个目录挂载到 Pod,但是已经不推荐使用了,文档

配置方式简单,需要手动指定 Pod 跑在某个固定的节点。

仅供单节点测试使用;不适用于多节点集群。

minikube 提供了 hostPath 存储,文档

1. 新的yaml文件

代码语言:txt复制
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongodb
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongodb
  serviceName: mongodb
  template:
    metadata:
      labels:
        app: mongodb
    spec:
      containers:
        - name: mongo
          image: mongo:4.4
          # IfNotPresent 仅本地没有镜像时才远程拉,Always 永远都是从远程拉,Never 永远只用本地镜像,本地没有则报错
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - mountPath: /data/db # 容器里面的挂载路径
              name: mongo-data    # 卷名字,必须跟下面定义的名字一致
      volumes:
        - name: mongo-data              # 卷名字
          hostPath:
            path: /data/mongo-data      # 节点上的路径
            type: DirectoryOrCreate     # 指向一个目录,不存在时自动创建

2. 应用新的mongo.yaml

代码语言:txt复制
[root@VM-79-37-centos ~/work/test-k8s/yaml/storage]# kubectl apply -f ./mongo.yaml
statefulset.apps/mongodb configured
[root@VM-79-37-centos ~/work/test-k8s/yaml/storage]# kubectl get all
NAME                 READY   STATUS    RESTARTS   AGE
pod/mongodb-0        1/1     Running   0          1s
pod/mongodb-client   1/1     Running   0          7m7s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)     AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP     9m32s
service/mongodb      ClusterIP   None         <none>        27017/TCP   7m27s

NAME                       READY   AGE
statefulset.apps/mongodb   1/1     7m27s

3. 在容器中确认是否有mongodb数据

代码语言:txt复制
[root@VM-79-37-centos ~]# docker exec -it minikube /bin/sh
# ls
Release.key  boot  dev         etc   kic.txt  lib    lib64   media  opt   root  sbin  sys  usr
bin          data  docker.key  home  kind     lib32  libx32  mnt    proc  run   srv   tmp  var
# cd data 
# ls
mongo-data
# cd mongo-data
# ls
WiredTiger         _mdb_catalog.wt                      index-1-7095991055263109797.wt  mongod.lock
WiredTiger.lock    collection-0-7095991055263109797.wt  index-3-7095991055263109797.wt  sizeStorer.wt
WiredTiger.turtle  collection-2-7095991055263109797.wt  index-5-7095991055263109797.wt  storage.bson
WiredTiger.wt      collection-4-7095991055263109797.wt  index-6-7095991055263109797.wt
WiredTigerHS.wt    diagnostic.data                      journal

4. 数据持久化保存正确

  1. 存储数据> show dbs admin 0.000GB config 0.000GB local 0.000GBuse test

switched to db test

db.users.save({'_id':'easydoc','name':'易文档'}) WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : "easydoc" })

db.users.find() { "_id" : "easydoc", "name" : "易文档" }

  1. 重启statefulsetkubectl rollout restart statefulset mongodb kubectl apply -f ./mongo.yaml
  2. 我们去看数据kubectl run mongodb-client --rm --tty -i --restart='Never' --image docker.io/bitnami/mongodb:4.4.10-debian-10-r20 --command -- bash db.users.find() { "_id" : "easydoc", "name" : "易文档" }

结论: 数据依然存在

三. 腾讯云集群

1. 新建集群,放入之前申请的机器

image.pngimage.png

2. 申请Statefulset的mongodb

image.pngimage.png
image.pngimage.png

3. PVC申请

image.pngimage.png

四. 腾讯云裸机

代码语言:txt复制
[root@master data]# cd /root

[root@master ~]# ls
Changelog

[root@master ~]# mkdir data

[root@VM-0-14-centos storage]# kubectl apply -f ./sc.yaml 
storageclass.storage.k8s.io/local-storage created

[root@VM-0-14-centos storage]# kubectl get sc
NAME            PROVISIONER                    RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
cbs (default)   com.tencent.cloud.csi.cbs      Delete          Immediate              false                  6h42m
local-storage   kubernetes.io/no-provisioner   Delete          WaitForFirstConsumer   false                  18s

[root@master storage]# kubectl apply -f ./pv.yaml
persistentvolume/mongodata created

[root@master storage]# kubectl get pv
NAME           CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                   STORAGECLASS    REASON   AGE
mongodata      2Gi        RWO            Delete           Available                           local-storage            9s
mongodata-pv   10Gi       RWO            Retain           Bound       default/mongodata-pvc   cbs                      8h

[root@master storage]# kubectl apply -f ./pvc.yaml
persistentvolumeclaim/mongodata created

[root@master storage]# kubectl get pvc
NAME            STATUS    VOLUME         CAPACITY   ACCESS MODES   STORAGECLASS    AGE
mongodata       Pending                                            local-storage   5s
mongodata-pvc   Bound     mongodata-pv   10Gi       RWO            cbs             8h

[root@master storage]# kubectl delete -f ./mongo.yaml 
statefulset.apps "mongodb" deleted
service "mongodb" deleted

[root@master storage]# kubectl apply -f ./mongo.yaml 
statefulset.apps/mongodb created
service/mongodb created

[root@master storage]# kubectl describe  pod mongodb-0 -n default
image.pngimage.png

0 人点赞