前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >k8s系列(4)-MongoDB数据持久化

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

原创
作者头像
爽朗地狮子
修改2022-10-21 10:01:40
1.2K0
修改2022-10-21 10:01:40
举报
文章被收录于专栏:云原生系列

完整系列

  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.png
image.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.png
image.png

2. 申请Statefulset的mongodb

image.png
image.png
image.png
image.png

3. PVC申请

image.png
image.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.png
image.png

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 完整系列
  • 一. 介绍
    • Persistent Volume (PV)
      • Persistent Volume Claim (PVC)
        • 为什么要这么多层抽象
        • 二. hostPath(用来学习)
          • 1. 新的yaml文件
            • 2. 应用新的mongo.yaml
              • 3. 在容器中确认是否有mongodb数据
                • 4. 数据持久化保存正确
                • 三. 腾讯云集群
                  • 1. 新建集群,放入之前申请的机器
                    • 2. 申请Statefulset的mongodb
                      • 3. PVC申请
                      • 四. 腾讯云裸机
                      相关产品与服务
                      容器服务
                      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档