k8s~动态生成pvc和pv
有时,我们不想手动建立pv和pvc,这时,我们可以通过strongClass存储类来帮我们实现,动态建立pvc,并动态为它分配pv存储空间,我们以nfs为例,说一下动态分配在nfs存储截至上建立pv的方式。
本文导读
- StorageClass和PVC及PV
 - 集群权限与绑定rbac.yaml
 - 建立动态pvc的provisioner.yaml
 - 建立strongClass的strongclass.yaml
 - 在有状态服务StatefulSet中使用strongClass
 - 遇到的问题与解决
 
StorageClass和PVC及PV
当使用StorageClass创建PersistentVolumeClaim(PVC)时,它们之间的关系可以用以下文字图示表示:
           +------------------+
           |   StorageClass   |
           +------------------+
                     |
                     |  +------------------+
                     |  |       PVC        |
                     |  +------------------+
                     |         |
                     |         |
                     |  +------------------+
                     |  |        PV        |
                     |  +------------------+
在这个图示中:
- StorageClass是用于定义动态卷分配的规则和配置的对象。
 - PVC是用来请求存储资源的声明,它指定了所需的存储容量、访问模式等。
 - PV是实际的持久化存储资源,它是由集群管理员预先创建并配置好的。
 
当一个PVC被创建时,它会根据所指定的StorageClass进行动态分配,并绑定到一个可用的PV上。这样,PVC就可以通过PV来获取所需的存储资源。PVC和PV之间的绑定关系是自动完成的,不需要用户手动干预。
集群权限与绑定rbac.yaml
首先,你要在k8s中添加pvc,pv这些资源,你需要有自己的sa(service account),然后把你的pod(建立pvc和pv)去分配这个有权限的sa,这个pod就可以像人一样,为你在k8s中创建资源了。
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-provisioner
  namespace: elk
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
   name: nfs-provisioner-runner
rules:
   -  apiGroups: [""]
      resources: ["persistentvolumes"]
      verbs: ["get", "list", "watch", "create", "delete"]
   -  apiGroups: [""]
      resources: ["persistentvolumeclaims"]
      verbs: ["get", "list", "watch", "update","create"]
   -  apiGroups: ["storage.k8s.io"]
      resources: ["storageclasses"]
      verbs: ["get", "list", "watch"]
   -  apiGroups: [""]
      resources: ["events"]
      verbs: ["list", "watch", "create", "update", "patch"]
   -  apiGroups: [""]
      resources: ["services", "endpoints"]
      verbs: ["get","create","list", "watch","update"]
   -  apiGroups: ["extensions"]
      resources: ["podsecuritypolicies"]
      resourceNames: ["nfs-provisioner"]
      verbs: ["use"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-nfs-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-provisioner
roleRef:
  kind: ClusterRole
  name: nfs-provisioner-runner
  apiGroup: rbac.authorization.k8s.io
在Kubernetes中,ClusterRole和ClusterRoleBinding都是一种用于定义集群级别权限的资源,它与特定的命名空间无关。因此,在创建ClusterRole时,不需要为它指定namespace。
ClusterRole的权限范围覆盖整个集群,可以被任何命名空间中的对象引用和使用。这使得ClusterRole能够控制跨多个命名空间的资源和操作。
建立动态pvc的provisioner.yaml
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: nfs-client-provisioner
  namespace: elk
  labels:
    app: nfs-client-provisioner
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: nfs-client-provisioner
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccount: nfs-provisioner
      containers:
        - name: nfs-client-provisioner
          image: easzlab/nfs-subdir-external-provisioner:v4.0.1 #quay.io/external_storage/nfs-client-provisioner:latest
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: nfs-provisioner # 指定分配器的名称,创建storageclass会用到
            - name: NFS_SERVER
              value: 192.168.60.146
            - name: NFS_PATH
              value: /mnt/disk/nfs_data #这个nfs服务器上的目录
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.60.146
            path: /mnt/disk/nfs_data #这个nfs服务器上的目录
建立strongClass的strongclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: elk-nfs
provisioner: nfs-provisioner # 必须与provisioner.yaml中PROVISIONER_NAME的值一致
parameters:
  archiveOnDelete: "true"  # 删除pv的时候,pv的内容是否要备份
allowVolumeExpansion: true  #如果对PVC扩容,则其对应的"storage class"中allowVolumeExpansion字段需要设置成true
在Kubernetes中,建立StorageClass时不需要指定命名空间(namespace)。StorageClass是一种用于定义持久卷的存储类别的资源,它是集群级别的。
在有状态服务StatefulSet中使用strongClass
在Kubernetes中,StatefulSet是一种用于管理有状态应用的控制器。它可以确保Pod按照指定的顺序和唯一标识符进行创建、更新和删除。StatefulSet通常与PersistentVolumeClaim(PVC)一起使用,以为每个Pod提供持久化存储。
要动态创建PVC并将其绑定到StatefulSet的Pod上,你可以使用volumeClaimTemplates字段。这个字段允许你定义一个模板,用于创建PVC。
下面是一个示例StatefulSet配置文件,其中包含了volumeClaimTemplates字段:
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: example-statefulset
spec:
  serviceName: "example"
  replicas: 3
  selector:
    matchLabels:
      app: example
  template:
    metadata:
      labels:
        app: example
    spec:
      containers:
      - name: example-app
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - name: data
          mountPath: /data
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: elk-nfs
      resources:
        requests:
          storage: 1Gi
在上述配置中,我们定义了一个StatefulSet,它由3个Pod组成。每个Pod都会自动创建一个名为"data"的PVC,并将其挂载到/data路径上。你需要将elk-nfs替换为实际的存储类名称。
遇到的问题与解决
最近把kubernetes集群从1.18升级到1.20以后,新建pvc一直处于pending状态,查看nfs-client-provisioner日志,提示:
unexpected error getting claim reference: selfLink was empty, can't  make reference
主要原因是kubernetes 1.20版本 禁用了 selfLink导致。
网上大部分文档的解决方法都是修改kube-apiserver.yaml,添加- --feature-gates=RemoveSelfLink=false,然后重新部署。
spec:
  containers:
  - command:
    - kube-apiserver
    - --feature-gates=RemoveSelfLink=false
但是根据github的issues,直接更改nfs-subdir-external-provisioner为v4.0.0以上的版本就可以了。
相关文档:https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner/issues/25
网上找了一个可以下载的镜像easzlab/nfs-subdir-external-provisioner:v4.0.1,pull以后测试,发现pvc申请正常了。

k8s~动态生成pvc和pv的更多相关文章
- 4.k8s存储之Volume、PV、PVC和StatefulSet
		
3.Volume 容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题.首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失--容器以干净的状态(镜像最初的 ...
 - K8s存储之Volume、PV、PVC、SC
		
Volume Volume(存储卷)是Pod中能够被多个容器访问的共享目录.Kubernetes的Volume概念.用途和目的与Docker的Volume比较类似,但两者不能等价.首先,Kuberne ...
 - k8s_使用k8s部署博客系统-PV PVC(二)
		
PV和PVC PV(PersistentVolume)在声明的时候需要指定大小和续写模式:["ReadWriteMany","ReadWriteOnce",&q ...
 - Aop动态生成代理类时支持带参数构造函数
		
一.背景 在某些情况下,我们需要植入AOP代码的类并没有默认构造函数.那么此时动态生成的代理类也需要相同签名的构造函数,并且内部调用原始类的构造函数.自己折腾了1晚上没搞定,现在搞定了发出来供大家一起 ...
 - dynamic-css 动态 CSS 库,使得你可以借助 MVVM 模式动态生成和更新 css,从 js 事件和 css 选择器的苦海中脱离出来
		
dynamic-css 使得你可以借助 MVVM 模式动态生成和更新 css,从而将本插件到来之前,打散.嵌套在 js 中的修改样式的代码剥离出来.比如你要做元素跟随鼠标移动,或者根据滚动条位置的变化 ...
 - ABP(现代ASP.NET样板开发框架)系列之20、ABP展现层——动态生成WebApi
		
点这里进入ABP系列文章总目录 ABP(现代ASP.NET样板开发框架)系列之20.ABP展现层——动态生成WebApi ABP是“ASP.NET Boilerplate Project (ASP.N ...
 - 【.NET深呼吸】Zip文件操作(2):动态生成Zip文档
		
通过前面一篇烂文的介绍,大伙儿知道,ZipArchive类表示一个zip文档实例,除了用上一篇文章中所列的方法来读写zip文件外,还可以直接通过ZipArchive类,动态生成zip文件. 文件流操作 ...
 - jquery动态生成的元素添加事件的方法
		
动态生成的元素如果要添加事件,要写成 $(document).on("click", "#txtName", function() { alert(this.v ...
 - 利用Java动态生成 PDF 文档
		
利用Java动态生成 PDF 文档,则需要开源的API.首先我们先想象需求,在企业应用中,客户会提出一些复杂的需求,比如会针对具体的业务,构建比较典型的具备文档性质的内容,一般会导出PDF进行存档.那 ...
 - 用C#从数据库动态生成AdminLTE菜单的一种方法
		
当前的应用设计风格趋于Flat扁平化,很多基于BootStrap实现了很多UI非常漂亮的管理界面(Bootstrap admin template). 此核心文件开源在Github:https://g ...
 
随机推荐
- tensorboard可视化点云
			
tensorboard可视化点云 用 tensorboard 自带的 add_mesh 方法:支持可视化点云和网格,参考链接: tensorflow 网站的tensorboard pytorch 网站 ...
 - vim vimtutor
			
=============================================================================== = 歡 迎 閱 ...
 - 《美英报刊阅读教程(中级精选本)(第五版)》 ISBN:  9787301306864
			
作者: 端木义万 著 出版社: 北京大学出版社 出版时间: 2019-09 版次: 7 ISBN: 9787301306864 定价: 69.00 装帧: 平装 开本: 16开 纸张: ...
 - Go 函数的健壮性、panic异常处理、defer 机制
			
Go 函数的健壮性.panic异常处理.defer 机制 目录 Go 函数的健壮性.panic异常处理.defer 机制 一.函数健壮性的"三不要"原则 1.1 原则一:不要相信任 ...
 - 【分段传输】c#使用IAsyncEnumerable实现流式分段传输
			
引言 在使用SSE的时候,前端可以实现流式传输,但是有个问题就是这是一个独占的连接,相当于如果你不手动关闭连接,就会一直请求,一直连接调用接口,而且发送的数据格式也是按照定义好的协议来,而使用c#自带 ...
 - 【2023年更新】git 常用口令
			
1.已关联远程 fatal: remote origin already exists. 先输入$ git remote rm origin(删除关联的origin的远程库) 2.关联新远程 ...
 - k8s-服务网格实战-入门Istio
			
背景 终于进入大家都比较感兴趣的服务网格系列了,在前面已经讲解了: 如何部署应用到 kubernetes 服务之间如何调用 如何通过域名访问我们的服务 如何使用 kubernetes 自带的配置 Co ...
 - 论文精读:用于少样本目标检测的元调整损失函数和数据增强(Meta-tuning Loss Functions and Data Augmentation for Few-shot Object Detection)
			
论文链接:Meta-Tuning Loss Functions and Data Augmentation for Few-Shot Object Detection Abstract 现阶段的少样本 ...
 - C语言有一分数序列: 2/1, 3 / 2,5/3,8/5,1 3/8,2 1/13... 求出这个数列得前20项之与。
			
#include <stdio.h> void main() { int x, n = 20; double a = 2, b = 1, sws = 0; for (n; n >= ...
 - 解密Spring Cloud微服务调用:如何轻松获取请求目标方的IP和端口
			
公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享. 目的 Spring Cloud 线上微服务实例都是2个起步,如果出问题后,在没有ELK等日志分析平台,如何确定调用到了目标 ...