完整系列
- k8s系列(1)-腾讯云CVM手动部署K8S_Dashboard安装1
- k8s系列(1)-腾讯云CVM手动部署K8S_Dashboard安装2
- k8s系列(2)-Service
- k8s系列(3)-StatefulSet的MongoDB实战
- k8s系列(4)-MongoDB数据持久化
- k8s系列(5)-Configmap和Secret
- k8s系列(6)-Helm
- k8s系列(7)-命名空间
- k8s系列(8)-Ingress
- 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
把节点上的一个目录挂载到 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. 数据持久化保存正确
- 存储数据> 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" : "易文档" }
- 重启statefulsetkubectl rollout restart statefulset mongodb kubectl apply -f ./mongo.yaml
- 我们去看数据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. 新建集群,放入之前申请的机器
2. 申请Statefulset的mongodb
3. PVC申请
四. 腾讯云裸机
代码语言: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