Kubernetes使用NFS共享存储有两种方式:

  • 手动方式静态创建所需要的PV和PVC;
  • 通过创建PVC动态地创建对应PV,无需手动创建PV。

动态创建PV,是指在现有PV不满足PVC的请求时,可以使用存储分类(StorageClass),描述具体过程为:PV先创建分类,PVC请求已创建的某个类(StorageClass)的资源,这样就达到动态配置的效果。即通过一个叫 Storage Class的对象由存储系统根据PVC的要求自动创建。

其中动态方式是通过StorageClass来完成的,这是一种新的存储供应方式。动态卷供给能力让管理员不必进行预先创建存储卷,而是随用户需求进行创建。

使用StorageClass有什么好处呢?除了由存储系统动态创建,节省了管理员的时间,还有一个好处是可以封装不同类型的存储供PVC选用。

在StorageClass出现以前,PVC绑定一个PV只能根据两个条件,一个是存储的大小,另一个是访问模式。在StorageClass出现后,等于增加了一个绑定维度。

1、下载动态PV配置yaml文件

https://github.com/kubernetes-retired/external-storage/tree/master/nfs-client/deploy

[root@master1 pv-d]# ls
class.yaml  deployment.yaml  rbac.yaml

更改deployment.yaml,将nfs地址和路径修改为自己的本地地址

 

2、依次应用yaml文件

[root@master1 pv-d]# kubectl apply -f rbac.yaml 
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
[root@master1 pv-d]# kubectl apply -f class.yaml 
storageclass.storage.k8s.io/managed-nfs-storage created
[root@master1 pv-d]# kubectl apply -f deployment.yaml 
deployment.apps/nfs-client-provisioner created

3、创建nginx-svc.yaml文件

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: nginx
  selector:
    app: nginx
  clusterIP: None

创建pod   nginx-stfset.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx
  serviceName: "nginx"
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      imagePullSecrets:
      - name: huoban-harbor
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "managed-nfs-storage"
      resources:
        requests:
          storage: 1Gi

应用两个yaml文件

[root@master1 pv-d]# kubectl apply -f nginx-svc.yaml 
service/nginx created
[root@master1 pv-d]# kubectl apply -f nginx-stfset.yaml 
statefulset.apps/web created

如果pod一直处于pending状态,

#在/etc/kubernetes/manifests/kube-apiserver.yaml配置文件中加入如下代码:
- --feature-gates=RemoveSelfLink=false
#重新应用apiserver yaml文件,同时重新创建所有NFS yaml文件即可。
kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml

 

 

 

Logo

开源、云原生的融合云平台

更多推荐