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