当前位置:   article > 正文

云原生 | kubernetes - 存储抽象 PV & PVC & ConfigMap & Secret_创建pv pvc

创建pv pvc

目录

零、NFS环境准备

所有节点

主节点

从节点

测试

原生方式数据挂载

测试 

一、PV&PVC

1.创建pv池

2.PVC创建与绑定

二、ConfigMap

1.Redis示例

把配置文件创建为配置集 

创建配置

检查默认配置

三、Secret


咱们在使用Docker的时候经常会用到数据卷对目录进行挂载。例如Docker内跑了一个ngx,然后把html页面给挂出来,这样就可以很轻松的在宿主机上对其内容进行修改。但是在k8s中这个方式不可行。咱们知道如果pod突然挂掉了,k8s会试图对其进行重启,但是超过5分钟这个阈值还没起来的话,k8s会在其他的节点上起一个同样的,新的pod出来,这也就是问题所在。例如: 咱们原先的pod里有mysql,并且对宿主机挂载了数据卷,他挂掉后被k8s重启在了其它机器上,那他原本挂载的数据怎么办?

所以k8s在这里加了一层,叫做存储层。其在本层是开放的,你可以选择性的使用NFS、CephFS、GlusterFS等。以NFS举例,他会在一台机器上创建一个数据存储目录,并挂载到其它的每一台节点上,这样可以保证其每一台机器上数据的一致性。此时如果pod挂掉后重启在别的节点上也没有关系,因为大家存储的数据都是一样的。


零、NFS环境准备

所有节点

yum install -y nfs-utils

主节点

echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports
mkdir -p /nfs/data
systemctl enable rpcbind --now
systemctl enable nfs-server --now
exportfs -r

效果:

exportfs

从节点

检查确认一下,有哪些目录可以进行挂载(这里的IP是主节点的IP地址):

showmount -e 192.168.150.201

执行以下命令挂载 nfs 服务器上的共享目录到本机路径  /root/nfsmount

mkdir -p /nfs/data

注意写主节点的IP地址:

mount -t nfs 192.168.150.201:/nfs/data /nfs/data

测试

在主节点上随便弄点什么:

然后去从节点上查看:

原生方式数据挂载

mkdir -p /nfs/data/nginx-pv
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. labels:
  5. app: nginx-pv-demo
  6. name: nginx-pv-demo
  7. spec:
  8. replicas: 2
  9. selector:
  10. matchLabels:
  11. app: nginx-pv-demo
  12. template:
  13. metadata:
  14. labels:
  15. app: nginx-pv-demo
  16. spec:
  17. containers:
  18. - image: nginx
  19. name: nginx
  20. volumeMounts:
  21. - name: html
  22. mountPath: /usr/share/nginx/html
  23. volumes:
  24. - name: html
  25. nfs:
  26. server: 192.168.150.201
  27. path: /nfs/data/nginx-pv
kubectl apply -f [文件名]

然后等这两个新的pod起来:

测试 

因为这两个pod都挂载到了 /nfs/data/nginx-pv ,所以修改这里的话就相当于是把它俩都改了:

然后到pod里面去看看有没有一起修改(注意自己的pod名称)

kubectl exec -it nginx-pv-demo-6546658598-4kx4w -- bash

修改成功! 


一、PV&PVC

 PV:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置 

 PVC:持久卷申明(Persistent Volume Claim),申明需要使用的持久卷规格 

1.创建pv池

如果只使用上述方式会存在三个问题:

  1. 需要挂载的目录需要自己去手动创建
  2. 在删除pod后,所挂载的目录不会被自动删除
  3. 对每一个pod所挂载的目录没有空间大小的限制

静态供应,nfs主节点:

  1. mkdir -p /nfs/data/01
  2. mkdir -p /nfs/data/02
  3. mkdir -p /nfs/data/03

创建PV(pv.yaml): 

  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4. name: pv01-10m
  5. spec:
  6. capacity:
  7. storage: 10M
  8. accessModes:
  9. - ReadWriteMany
  10. storageClassName: nfs
  11. nfs:
  12. path: /nfs/data/01
  13. server: 192.168.150.201
  14. ---
  15. apiVersion: v1
  16. kind: PersistentVolume
  17. metadata:
  18. name: pv02-1gi
  19. spec:
  20. capacity:
  21. storage: 1Gi
  22. accessModes:
  23. - ReadWriteMany
  24. storageClassName: nfs
  25. nfs:
  26. path: /nfs/data/02
  27. server: 192.168.150.201
  28. ---
  29. apiVersion: v1
  30. kind: PersistentVolume
  31. metadata:
  32. name: pv03-3gi
  33. spec:
  34. capacity:
  35. storage: 3Gi
  36. accessModes:
  37. - ReadWriteMany
  38. storageClassName: nfs
  39. nfs:
  40. path: /nfs/data/03
  41. server: 192.168.150.201
kubectl apply -f pv.yaml

创建完成可以查看:

kubectl get pv


2.PVC创建与绑定

创建PVC(pvc.yaml):

  1. kind: PersistentVolumeClaim
  2. apiVersion: v1
  3. metadata:
  4. name: nginx-pvc
  5. spec:
  6. accessModes:
  7. - ReadWriteMany
  8. resources:
  9. requests:
  10. storage: 200Mi
  11. storageClassName: nfs

创建Pod绑定PVC(dep2.yaml):

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. labels:
  5. app: nginx-deploy-pvc
  6. name: nginx-deploy-pvc
  7. spec:
  8. replicas: 2
  9. selector:
  10. matchLabels:
  11. app: nginx-deploy-pvc
  12. template:
  13. metadata:
  14. labels:
  15. app: nginx-deploy-pvc
  16. spec:
  17. containers:
  18. - image: nginx
  19. name: nginx
  20. volumeMounts:
  21. - name: html
  22. mountPath: /usr/share/nginx/html
  23. volumes:
  24. - name: html
  25. persistentVolumeClaim:
  26. claimName: nginx-pvc

然后我们去测试一下:

cd /nfs/data/02/
echo 'this is van'>index.html


二、ConfigMap

抽取应用配置,并且可以自动更新

1.Redis示例

写一个简单的redis配置文件

echo 'appendonly yes'>redis.conf

把配置文件创建为配置集 

创建成k8s的配置集:

kubectl create cm redis-conf --from-file=redis.conf

查看:

kubectl get cm

查看配置集具体内容:

kubectl get cm redis-conf -oyaml

创建配置

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: redis
  5. spec:
  6. containers:
  7. - name: redis
  8. image: redis
  9. command:
  10. - redis-server
  11. - "/redis-master/redis.conf" #指的是redis容器内部的位置
  12. ports:
  13. - containerPort: 6379
  14. volumeMounts:
  15. - mountPath: /data
  16. name: data
  17. - mountPath: /redis-master
  18. name: config
  19. volumes:
  20. - name: data
  21. emptyDir: {}
  22. - name: config
  23. configMap:
  24. name: redis-conf
  25. items:
  26. - key: redis.conf
  27. path: redis.conf

检查默认配置

kubectl exec -it redis -- bash


三、Secret

Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 将这些信息放在 secret 中比放在 Pod 的定义或者 容器镜像 中来说更加安全和灵活。

比如咱们要去docker里pull一个自己的私有镜像,在pull之前必须要先 docker login ,每次这样登录会出现安全问题,所以就有了 Secret

  1. ##命令格式
  2. kubectl create secret docker-registry regcred \
  3. --docker-server=<你的镜像仓库服务器> \
  4. --docker-username=<你的用户名> \
  5. --docker-password=<你的密码> \
  6. --docker-email=<你的邮箱地址>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/171380
推荐阅读
相关标签
  

闽ICP备14008679号