• k8s存储


    目录

    nfs

    k8s 存储卷 volume

    pv和pvc

    生命周期:

    PV 的状态

    一个PV从创建到销毁的具体流程

    pv访问模式

    静态Pv的使用

    动态storage

    StorageClass动态创建pv的过程

    搭建 StorageClass + NFS,实现 NFS 的动态 PV 创建


    nfs

    理论上nfs 其实并不是存储设备,它是一种远程共享存储服务。

    k8s 存储卷 volume

    emptyDir:可以实现pod中的容器之间共享数据, 但是存储卷不能持久化数据,且会随着pod的生命周期一起删除。

    hostpash:可以实现持久化数据,使用node节点的目录或文件挂载到容器,但是存储空间会受到node节点单机的限制,一旦node节点故障,数据会丢失,pod会跨node节点,不能共享数据。

    nfs:可以实现持久化存储,使用nfs存储设备空间挂载到容器,pod可以跨节点共享数据。

    pv和pvc

    pv有两种创建方式,分为静态和动态。

    静态指运维手动创建pv和pvc。

     动态指用storageclass自动创建pv

    PV和PVC之间的相互作用遵循这个生命周期:

    Provisioning (配置)---> Binding (绑定) ---> Using (使用) ---> Releasing (释放) ---> Recycling (回收)

    PV 的状态有以下 4 种:

    ●Available(可用):表示可用状态,还未被任何 PVC 绑定

    ●Bound(已绑定):表示 PV 已经绑定到 PVC

    ●Released(已释放):表示 PVC 被删掉,但是资源尚未被集群回收

    ●Failed(失败):表示该 PV 的自动回收失败

    一个PV从创建到销毁的具体流程

    1、一个PV创建完后状态会变成Available,等待被PVC绑定。

    2、一旦被PVc邦定,Pv的状态会变成Bound,就可以被定义了相应PVC的Pod使用。

    3、Pod使用完后会释放PV,PV的状态变成Released

    4、变成Released的EV会根据定义的回收筑略做相应的回收工作。(有三种回收策略,Retain、Delete和Becycle。)

    Retain策略:就是保留现场,K8S集群什么也不做,等待用户手动去处理里的数据,处理完后,再手动删除EV。

    Delete策略:K8S会自动删除该pv及里面的数据。

    Recycle策略:K8S会将pV里的数据删除,然后把pv的状态变成Available,又可以被新的PVC绑定使用。

    pv访问模式

    ReadWriteOnce #(RWO)存储可读可写,但只支持被单个 Pod 挂载

    ReadOnlyMany #(ROX)存储可以以只读的方式被多个 Pod 挂载

    ReadWriteMany #(RWX)存储可以以读写的方式被多个 Pod 共享

    静态Pv的使用

    准备存储设备和共享目录

    创建pv 资源 配置 存储类型 访问模式 存储能力大小

    创建pvc资源 配置请求pv 资源的访问模式和存储大小 绑定PV,PVC和PV是一对一的绑定关系。

    PV访问模式必须支持PVc的请求访问模式,请求的存储空间会优先选择相等存储大小的PV资源,如果没有会选择大于请求的存储大小的PV资源。

    创建Pod资源,存储类型设置成 persistentvolumeclaims,在容器配置中存储挂载。

    动态storage

    动态创建PV不同的设备支持的插件不一样 我们是以nfs为例

    StorageClass动态创建pv的过程

    StorageClass+NES+provisioner

    准备NES 共享服务器和共享目录。

    创建sa 服务账号 ,进行RBAC 资源操作权限的授权。

    创建nfs-client-provisioner存储卷插件 (以pod的形式运行的),配置中要关联sa服务账号使得存储卷插件获得相关资源的操作权限。

    创建 StorageClass资源,配置中要关联存储卷插件的名称配置。

    ----以上过程是一劳永逸, 以后只需要创建pvc 就可以动态生成相关的PV资源。

    创建pvc在配置中要关联storageClass资源的名称,此时会在NEs服务器上生成相关的PV的共享目录。

    创建pod 资源存储类型设置成persistentVolumeclaims,在容器配置中配置存储挂载。

    搭建 StorageClass + NFS,实现 NFS 的动态 PV 创建

    1. 1、在stor01节点上安装nfs,并配置nfs服务
    2. mkdir /opt/k8s
    3. chmod 777 /opt/k8s/
    4. vim /etc/exports
    5. /opt/k8s 192.168.11.0/24(rw,no_root_squash,sync)
    6. systemctl restart nfs

    1. 2、创建 Service Account,用来管理 NFS Provisioner 在 k8s 集群中运行的权限
    2. vim nfs-client-rbac.yaml
    3. apiVersion: v1
    4. kind: ServiceAccount
    5. metadata:
    6. name: nfs-client-provisioner
    7. ---
    8. apiVersion: rbac.authorization.k8s.io/v1
    9. kind: ClusterRole
    10. metadata:
    11. name: nfs-client-provisioner-clusterrole
    12. rules:
    13. - apiGroups: [""]
    14. resources: ["persistentvolumes"]
    15. verbs: ["get", "list", "watch", "create", "delete"]
    16. - apiGroups: [""]
    17. resources: ["persistentvolumeclaims"]
    18. verbs: ["get", "list", "watch", "update"]
    19. - apiGroups: ["storage.k8s.io"]
    20. resources: ["storageclasses"]
    21. verbs: ["get", "list", "watch"]
    22. - apiGroups: [""]
    23. resources: ["endpoints"]
    24. verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
    25. ---
    26. apiVersion: rbac.authorization.k8s.io/v1
    27. kind: ClusterRoleBinding
    28. metadata:
    29. name: nfs-client-provisioner-clusterrolebinding
    30. subjects:
    31. - kind: ServiceAccount
    32. name: nfs-client-provisioner
    33. namespace: default
    34. roleRef:
    35. kind: ClusterRole
    36. name: nfs-client-provisioner-clusterrole
    37. apiGroup: rbac.authorization.k8s.io
    38. kubectl apply -f nfs-client-rbac.yaml
    1. 3、使用 Deployment 来创建 NFS Provisioner
    2. vim /etc/kubernetes/manifests/kube-apiserver.yaml
    3. - --feature-gates=RemoveSelfLink=false #添加这一行
    4. kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
    5. kubectl delete pods kube-apiserver -n kube-system
    6. kubectl get pods -n kube-system | grep apiserver

    1. 创建 NFS Provisioner
    2. kind: Deployment
    3. apiVersion: apps/v1
    4. metadata:
    5. name: nfs-client-provisioner
    6. spec:
    7. replicas: 1
    8. selector:
    9. matchLabels:
    10. app: nfs-client-provisioner
    11. strategy:
    12. type: Recreate
    13. template:
    14. metadata:
    15. labels:
    16. app: nfs-client-provisioner
    17. spec:
    18. serviceAccountName: nfs-client-provisioner
    19. containers:
    20. - name: nfs-client-provisioner
    21. image: quay.io/external_storage/nfs-client-provisioner:latest
    22. imagePullPolicy: IfNotPresent
    23. volumeMounts:
    24. - name: nfs-client-root
    25. mountPath: /persistentvolumes
    26. env:
    27. - name: PROVISIONER_NAME
    28. value: nfs-storage
    29. - name: NFS_SERVER
    30. value: stor01
    31. - name: NFS_PATH
    32. value: /data/volumes
    33. volumes:
    34. - name: nfs-client-root
    35. nfs:
    36. server: stor01
    37. path: /data/volumes
    38. kubectl apply -f nfs-client-provisioner.yaml
    39. kubectl get pod
    1. 4、创建 StorageClass
    2. vim nfs-client-storageclass.yaml
    3. apiVersion: storage.k8s.io/v1
    4. kind: StorageClass
    5. metadata:
    6. name: nfs-client-storageclass
    7. provisioner: nfs-storage
    8. parameters:
    9. archiveOnDelete: "false"
    10. kubectl apply -f nfs-client-storageclass.yaml

    1. 5、创建 PVC 和 Pod 测试
    2. vim test-pvc.yaml
    3. apiVersion: v1
    4. kind: PersistentVolumeClaim
    5. metadata:
    6. name: test-nfs-pvc
    7. spec:
    8. accessModes:
    9. - ReadWriteMany
    10. storageClassName: nfs-client-storageclass
    11. resources:
    12. requests:
    13. storage: 1Gi
    14. vim test-pod.yaml
    15. apiVersion: v1
    16. kind: Pod
    17. metadata:
    18. name: test-storageclass-pod
    19. spec:
    20. containers:
    21. - name: nginx
    22. image: nginx:1.14
    23. imagePullPolicy: IfNotPresent
    24. volumeMounts:
    25. - name: nfs-pvc
    26. mountPath: /usr/share/nginx/html
    27. volumes:
    28. - name: nfs-pvc
    29. persistentVolumeClaim:
    30. claimName: test-nfs-pvc
    31. kubectl apply -f test-pvc.yaml test-pod.yaml

    kubectl get pvc

    去nfs查看是否生成目录

  • 相关阅读:
    Spring Security 6.x 系列【67】认证篇之安装 ApacheDS
    “论数据访问层设计技术及其应用”写作框架,系统架构设计师
    #边学边记 必修5 高项:对人管理 第1章 项目人力资源管理 之 项目团队组建
    北斗导航 | 从事卫星导航工作需要知道的基本算法
    Python基础-连接Mysql数据库
    Python中输入输出函数input和print用法
    利用Helm在K8S上部署 PolarDB-X 集群(详细步骤--亲测!!!)
    Hutool 实现敏感信息展示脱敏及其反脱敏
    孙卫琴的《精通Vue.js》读书笔记-组件的递归
    vue实战项目之vue-cli脚手架搭建过程详解
  • 原文地址:https://blog.csdn.net/ffdtj/article/details/134289864