跳转至

6.4 创建storageclass——实现pvc自动创建pv

1. 创建storageclass目录

mkdir -p /k8s/storageclass
cd /k8s/storageclass

2. provisioner.yaml

# 傻瓜式部署,都是一套模板,不用了解
vim provisioner.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  labels:
    app: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: nfs-provisioner
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs-client-provisioner
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: nfs-client-provisioner
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          image: quay.io/external_storage/nfs-client-provisioner:latest
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: chupeng.cloud/nfs      #这个名字要记住了,后面的storageclass要用到!!!#这个域名有什么要求吗?
            - name: NFS_SERVER
              value: 10.0.8.3       #修改为nfs所在的宿主机IP
            - name: NFS_PATH  
              value: /nfs/sharefolder   #修改为nfs的共享目录
      volumes:
        - name: nfs-client-root
          nfs:
            server: 10.0.8.3        #修改为nfs所在的宿主机IP
            path: /nfs/sharefolder  #修改为nfs的共享目录

3. rbac.yaml

# 傻瓜式部署,不需要修改
vim rbac.yaml
kind: ServiceAccount
apiVersion: v1
metadata:
  name: nfs-client-provisioner
  namespace: nfs-provisioner
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-client-provisioner-runner
  namespace: nfs-provisioner
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-nfs-client-provisioner
  namespace: nfs-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    namespace: nfs-provisioner
roleRef:
  kind: ClusterRole
  name: nfs-client-provisioner-runner
  apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
  namespace: nfs-provisioner
rules:
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
  namespace: nfs-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    # replace with namespace where provisioner is deployed
    namespace: nfs-provisioner
roleRef:
  kind: Role
  name: leader-locking-nfs-client-provisioner
  apiGroup: rbac.authorization.k8s.io

4. storage-class.yaml

vim storage-class.yaml
#原来的
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs     #storageclass的名称可以自己起
provisioner: chupeng.cloud/nfs  #这里与provisioner中保持一致!
# 貌似不能自动创建pv,新的
vim new-storage-class.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs             #storageclass的名称可以自己起
provisioner: chupeng.cloud/nfs  #这里与provisioner中保持一致!
parameters:
  type: gp2     #这是默认值!
reclaimPolicy: Retain
allowVolumeExpansion: true
mountOptions:
  - debug
  - noresvport  #貌似加上这个参数后,服务器就能自动给pvc创建pv了!
volumeBindingMode: Immediate

5. 创建命名空间nfs-provisioner

kubectl create ns nfs-provisioner

6. 提前拉取镜像

# 可以提前下载镜像
docker pull quay.io/external_storage/nfs-client-provisioner:latest

7. 创建上面3个资源

kubectl apply -f .

8. 查看资源

#查看资源
kubectl -n nfs-provisioner get all
kubectl get storageclass
root@k8s-master:~# mkdir -p /k8s/storageclass
root@k8s-master:~# cd /k8s/storageclass
root@k8s-master:/k8s/storageclass#
root@k8s-master:/k8s/storageclass# vim provisioner.yaml
root@k8s-master:/k8s/storageclass#
root@k8s-master:/k8s/storageclass# vim rbac.yaml
root@k8s-master:/k8s/storageclass#
root@k8s-master:/k8s/storageclass# vim storage-class.yaml
root@k8s-master:/k8s/storageclass#
root@k8s-master:/k8s/storageclass# kubectl create ns nfs-provisioner
namespace/nfs-provisioner created
root@k8s-master:/k8s/storageclass# kubectl apply -f .
deployment.apps/nfs-client-provisioner created
serviceaccount/nfs-client-provisioner created
clusterrole.rbac.authorization.k8s.io/nfs-client-provisioner-runner created
clusterrolebinding.rbac.authorization.k8s.io/run-nfs-client-provisioner created
role.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created
rolebinding.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created
storageclass.storage.k8s.io/nfs created
root@k8s-master:/k8s/storageclass#
root@k8s-master:/k8s/storageclass# kubectl -n nfs-provisioner get all
NAME                                          READY   STATUS    RESTARTS   AGE
pod/nfs-client-provisioner-75cb84f6c6-6zskk   1/1     Running   0          17s

NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nfs-client-provisioner   1/1     1            1           17s

NAME                                                DESIRED   CURRENT   READY   AGE
replicaset.apps/nfs-client-provisioner-75cb84f6c6   1         1         1       17s
root@k8s-master:/k8s/storageclass# kubectl get storageclass
NAME   PROVISIONER         RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs    chupeng.cloud/nfs   Delete          Immediate           false                  3m59s
#ALLOWVOLUMEEXPANSION出现false!!!后面创建pvc后没有自动创建pv!百度后发现不是这个问题!

8.1 打开storageclass书签

# https://kubernetes.io/zh/docs/concepts/storage/storage-classes/

8.2 得到storageclass模板

# 得到storageclass模板
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
reclaimPolicy: Retain
allowVolumeExpansion: true
mountOptions:
  - debug
volumeBindingMode: Immediate

8.3 修改storageclass模板

vim new-storage-class.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs     #storageclass的名称可以自己起
provisioner: chupeng.cloud/nfs  #这里与provisioner中保持一致!
parameters:
  type: gp2 #这是默认值!
reclaimPolicy: Retain
allowVolumeExpansion: true
mountOptions:
  - debug
volumeBindingMode: Immediate

8.4 重新创建storageclass

kubectl delete storageclass nfs
kubectl apply -f new-storage-class.yaml

8.5 再次查看storageclass

kubectl get storageclass
root@k8s-master:/k8s/storageclass# kubectl get storageclass
NAME   PROVISIONER         RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs    chupeng.cloud/nfs   Retain          Immediate           true                   17s

9. 创建pvc测试

vim pvc-test.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: test-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Mi
  storageClassName: nfs         #跟之前的pvc相比,只是多了这一行!
kubectl get pv
kubectl get pvc
kubectl apply -f pvc-test.yaml

10. 查看pvc和pv

kubectl get pv
kubectl get pvc
#可以发现,k8s自动帮我们创建了一个pv!!!
root@k8s-master:/k8s/storageclass# kubectl get pvc
NAME        STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS      AGE
pv-volume   Pending                                      csi-hostpath-sc   4d3h
test-pvc    Pending                                      nfs               7s
root@k8s-master:/k8s/storageclass#
root@k8s-master:/k8s/storageclass# kubectl describe pvc test-pvc
Name:          test-pvc
Namespace:     default
StorageClass:  nfs
Status:        Pending
Volume:
Labels:        <none>
Annotations:   volume.beta.kubernetes.io/storage-provisioner: chupeng.cloud/nfs
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:
Access Modes:
VolumeMode:    Filesystem
Used By:       <none>
Events:
  Type    Reason                Age               From                         Message
  ----    ------                ----              ----                         -------
  Normal  ExternalProvisioning  8s (x3 over 24s)  persistentvolume-controller  waiting for a volume to be created, either by external provisioner "chupeng.cloud/nfs" or manually created by system administrator

最后更新: 2022-02-22 04:55:01