k8s存储卷和数据卷下

静态pv和pvc

运维负责pv:创建号持久化存储卷,申明好读写和挂载类型,以及可以提供的存储空间

Pvc开发做,要和开发沟通好,你期望的读写和挂载类型,以及存储空间

当我发布vc之后可以生成pv,还可以在共享服务器上直接生成挂载目录

Pvc直接绑定和使用pv

动态pv需要两个组件

1

卷插件,k8s本身支持的动态pv创建不包括nfs,需要声明和安装一个外部插件provisioner:存储分配器,可以动态创建pv,然后根据pvc的请求自动绑定和使用

2

StorageClass:来定义pv的属性,存储类型,大小,回收策略

还是用nfs来实现动态pv,nfs支持的格式nfs-client,先把Provisioner来适配nfs-client

SesrviceAccount

NFS PRovisioner:是一个插件,没有权限是无法在集群当中获取k8s的消息,插件要有权限能够监听apiserver,获取get,list(获取集群的列表资源)create delete

Rbac:Role-based ACCESS CONTROL

定义角色在集群当中可以使用的权限

1.20之后有一个新的机制

SelfLink:API的资源对象之一,表示资源对象在集群当中自身的一个链接,self-link是一个唯一的表示符号,可以用于表示k8s集群当中每个资源的对象

Selfink的值是一个URL,指向该资源对象的k8s api的路径

更好的视线资源对象的查找和引用

Feature-gates=RemoveSelfLink=false

Feature-gates:在不破快现有规则以及功能基础上引入新功能或者修改先有功能的机制

禁用不影响之前的规则

部署nfs-provisioner的插件

Nfs的provisioner的客户端以podded方式运行在集群中,今天k8s集群当中pv的请求,动态的创建于NFS服务器相关的pv

容器里使用的配置,在provisioner当中定义好环境变量,床给容器,storgeclass的名称,nfs服务器的地址,已经nfs的目录

创建 Service Account

apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: nfs-Client-provisioner-role
rules:
  - apiGroups: [""]
#apiGroups定义了规则适用于哪个api的组,这里使用了空字符"",空字符表示直接使用API的核心组的资源
    resources: ["persistentvolumes"]
    verbs: ["get","list","watch","create","delete"]
#表示权限的动作
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["watch","get","list","update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get","list","watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["list","watch","create","update","patch"]
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["create","delete","get","list","watch","patch","update"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: nfs-client-provisioner-bind
subjects:
- kind: ServiceAccount
  name: nfs-client-provisioner
  namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-client-provisioner-role
  apiGroup: rbac.authorization.k8s.io

使用 Deployment 来创建 NFS Provisioner

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-provisioner
  labels:
    app: nfs1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs1
  template:
    metadata:
      labels:
        app: nfs1
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
      - name: nfs1
        image: quay.io/external_storage/nfs-client-provisioner:latest
        volumeMounts:
        - name: nfs
          mountPath: /persistentvolumes
        env:
          - name: PROVISIONER_NAME
            value: nfs-storage
#配置provisioner的账户名称,要和storageclass的资源名称一致
          - name: NFS_SERVER
#指定的是nfs共享服务器的地址
            value: 192.168.233.84
          - name: NFS_PATH
            value: /opt/k8s
      volumes:
      - name: nfs
        nfs:
          server: 192.168.233.84
          path: /opt/k8s

vim /etc/kubernetes/manifests/kube-apiserver.yaml
spec:
  containers:
  - command:
    - kube-apiserver
    - --feature-gates=RemoveSelfLink=false       #添加这一行
    - --advertise-address=192.168.233.91

 NFS Provisioner

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-client-storageclass
#匹配provisioner
provisioner: nfs-storage
parameters:
  archiveOnDelete: "false"
#pvc被删除之后,pv的状态,定义的false,pvc如果被删除,pv的状态将是released,可以人工调整,继续使用,如果定义的是true,pv的将是Achived,表示pv不再可用
reclaimPolicy: Retain
#定义pv的回收策略,retain,另一个是delete,不支持回收
allowVolumeExpansion: true
#pv的存储空间可以动态的扩缩容

创建 StorageClass

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: nfs-client-storageclass
  resources:
    requests:
      storage: 2Gi
#创建一个pvc,名称为nfs-pvc,使用的pv属性是nfs-client-storageclass定义的属性,创建的pv大小是2G,pv
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx1
  labels:
    app: nginx1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx1
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      containers:
      - name: nginx1
        image: nginx:1.22
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html
      volumes:
      - name: html
        persistentVolumeClaim:
          claimName: nfs-pvc
查看 NFS 服务器上是否生成对应的目录,自动创建的 PV ${namespace}-${pvcName}-${pvName} 的目录格式放到 NFS 服务器上
ls /opt/k8s/

你可能感兴趣的:(kubernetes,容器,云原生)