Kubernetes练习<13>---动态存储分配器(NFS Client Provisioner)

官方文档:
https://kubernetes.io/zh/docs/concepts/storage/storage-classes/

PV是运维人员来创建的,开发操作PVC,可是大规模集群中可能会有很多PV,如果这些PV都需要运维手动来处理这也是一件很繁琐的事情,所以就有了动态供给概念,也就是Dynamic Provisioning。而我们上面的创建的PV都是静态供给方式,也就是Static Provisioning。而动态供给的关键就是StorageClass,它的作用就是创建PV模板。
每个 StorageClass 都包含 provisioner、parameters 和 reclaimPolicy 字段, 这些字段会在 StorageClass 需要动态分配 PersistentVolume 时会使用到。

StorageClass属性
provisioner存储分配器:用来决定使用哪个卷插件使用PV,该字段必须指定,可以指定内部分配器,也可以指定外部分配器
reclaimPolicy回收策略:由 StorageClass 动态创建的 PersistentVolume 会在类的 reclaimPolicy 字段中指定回收策略,可以是 Delete 或者 Retain。如果 StorageClass 对象被创建时没有指定 reclaimPolicy,它将默认为 Delete。通过 StorageClass 手动创建并管理的 PersistentVolume 会使用它们被创建时指定的回收政策。

一、NFS Client Provisioner
是一个动态存储分配器,使用NFS作为存储,自动创建pv及对应的pvc,其本身不提供NFS作为储存需要外部现有一套NFS存储服务。

1、NFS动态分配PV示例

nfs服务端:

[root@server4 ~]# cd /mnt/nfs/
[root@server4 nfs]# showmount -e
Export list for server4:
/mnt/nfs *

在这里插入图片描述
(1)rbac授权官方文档:

https://github.com/kubernetes-incubator/external-storage/blob/master/nfs-client/deploy/rbac.yaml
[wjjk8s@server1 pv]$ kubectl create -f rbac.yaml 

在这里插入图片描述
(2)nfs部署

https://github.com/kubernetes-incubator/external-storage/blob/master/nfs-client/deploy/deployment.yaml
[wjjk8s@server1 nfsclass]$ vim deployment.yaml 

在这里插入图片描述
(3)动态卷声明

[wjjk8s@server1 nfsclass]$ vim class.yaml 
[wjjk8s@server1 nfsclass]$ kubectl apply -f .

在这里插入图片描述
在这里插入图片描述

[wjjk8s@server1 nfsclass]$ kubectl get pv		#没有专门创建pv
No resources found in default namespace.
[wjjk8s@server1 nfsclass]$ kubectl get sc
NAME                  PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
managed-nfs-storage   westos.org/nfs   Delete          Immediate           false                  2m51s

在这里插入图片描述
(4)测试

[wjjk8s@server1 nfsclass]$ vim pvc.yaml
[wjjk8s@server1 nfsclass]$ kubectl apply -f pvc.yaml 
persistentvolumeclaim/test-claim created

在这里插入图片描述

[wjjk8s@server1 nfsclass]$ kubectl get all
[wjjk8s@server1 nfsclass]$ kubectl get pv		#自动创建pv,删除pvc后pv即不存在
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                STORAGECLASS          REASON   AGE
pvc-55cc42fb-a718-4601-aae2-9196efe28046   100Mi      RWX            Delete           Bound    default/test-claim   managed-nfs-storage            57s

在这里插入图片描述
(5)删除在服务端备份

[wjjk8s@server1 nfsclass]$ vim class.yaml 	#改成true即可
archiveOnDelete: "true"

(6)测试pod

[wjjk8s@server1 nfsclass]$ \vi pod.yaml
[wjjk8s@server1 nfsclass]$ kubectl apply -f pod.yaml 

在这里插入图片描述

[root@server4 default-test-claim-pvc-55cc42fb-a718-4601-aae2-9196efe28046]# pwd
/mnt/nfs/default-test-claim-pvc-55cc42fb-a718-4601-aae2-9196efe28046
[root@server4 default-test-claim-pvc-55cc42fb-a718-4601-aae2-9196efe28046]# echo westos > index.html

[wjjk8s@server1 nfsclass]$ curl 10.244.2.103
westos

在这里插入图片描述
在这里插入图片描述
二、没有指定名词提供持久卷
默认的StorageClass将被用于动态的为没有特定StorageClass需求的persistentvolumeclaims(pvc)配置存储:

[wjjk8s@server1 nfsclass]$ vim pvc.yaml
#annotations:
#volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
[wjjk8s@server1 nfsclass]$ kubectl apply -f pvc.yaml 
[wjjk8s@server1 nfsclass]$ kubectl get pvc		#没有指定名称,没有匹配pvc创建失败
NAME         STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
test-claim   Pending                                                     29s

在这里插入图片描述
解决方法:

[wjjk8s@server1 nfsclass]$ kubectl patch storageclass managed-nfs-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
storageclass.storage.k8s.io/managed-nfs-storage patched
[wjjk8s@server1 nfsclass]$ kubectl get sc		#default
NAME                            PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
managed-nfs-storage (default)   westos.org/nfs   Delete          Immediate           false                  30m

在这里插入图片描述

[wjjk8s@server1 nfsclass]$ kubectl delete -f pvc.yaml 
persistentvolumeclaim "test-claim" deleted
[wjjk8s@server1 nfsclass]$ kubectl apply -f pvc.yaml 
persistentvolumeclaim/test-claim created
[wjjk8s@server1 nfsclass]$ kubectl get pvc
NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGE
test-claim   Bound    pvc-f6776ccd-7e5b-4c30-9519-69391436d172   100Mi      RWX            managed-nfs-storage   2s

**三、StatefulSet如何通过headless service维持pod的拓扑状态:*
StatefulSet 是用来管理有状态应用的工作负载 API 对象。StatefulSet 用来管理 Deployment 和扩展一组 Pod,并且能为这些 Pod 提供*序号和唯一性保证
和 Deployment 相同的是,StatefulSet 管理了基于相同容器定义的一组 Pod。但和 Deployment 不同的是,StatefulSet 为它们的每个 Pod 维护了一个固定的 ID。这些 Pod 是基于相同的声明来创建的,但是不能相互替换:无论怎么调度,每个 Pod 都有一个永久不变的 ID。
1、创建无头服务headless service
[wjjk8s@server1 statefulset]$ vim headless.yaml
[wjjk8s@server1 statefulset]$ kubectl apply -f headless.yaml
在这里插入图片描述
在这里插入图片描述
2、创建StatefulSet控制器

[wjjk8s@server1 statefulset]$ \vi deployment.yaml
[wjjk8s@server1 statefulset]$ kubectl apply -f deployment.yaml 

在这里插入图片描述
#Pod 提供序号和唯一性保证

[wjjk8s@server1 statefulset]$ kubectl get pod
NAME                                      READY   STATUS    RESTARTS   AGE
web-0                                     1/1     Running   0          46s
web-1                                     1/1     Running   0          27s

在这里插入图片描述

pod重建后ip更改,使用序号访问:

[wjjk8s@server1 statefulset]$ kubectl run test --image=busyboxplus -it

nslookup web-0.nginx.default.svc.cluster.local
curl web-0.nginx

3、挂接存储

[wjjk8s@server1 statefulset]$ kubectl apply -f state.yaml 
The StatefulSet "web" is invalid: spec: Forbidden: updates to statefulset spec for fields other than 'replicas', 'template', and 'updateStrategy' are forbidden
#改为0回收一下即可
[wjjk8s@server1 statefulset]$ kubectl get pod		#会一个一个创建,且会为每一个pod创建一个pv

StatefulSet还会为每一个Pod分配并创建一个同样编号的PVC。这样,kubernetes就可以通过Persistent Volume机制为这个PVC绑定对应的PV,从而保证每一个Pod都拥有一个独立的Volumea
在删除StatefulSet类型的文件时,将replicas设置为0,会自动回收pod

4、kubectl的弹性伸缩
首先,想要弹缩的StatefulSet. 需先清楚是否能弹缩该应用.

[wjjk8s@server1 statefulset]$ kubectl get statefulset
NAME   READY   AGE
web    0/2     7m50s

方式一:改变StatefulSet副本数量

kubectl scale statefulsets <stateful-set-name> --replicas=<new-replicas>

方式二:更改yaml文件
如果StatefulSet开始由 kubectl apply 或 kubectl create --save-config 创建,更新StatefulSet manifests中的 .spec.replicas(更改replicas的数目), 然后执行命令 kubectl apply:

kubectl apply -f <stateful-set-file-updated>

方式三:命令 kubectl edit 编辑该字段:

kubectl edit statefulsets <stateful-set-name>

方式四:使用 kubectl patch

kubectl patch statefulsets <stateful-set-name> -p '{"spec":{"replicas":<new-replicas>}}'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 通过 Helm Chart 安装 nfs-client-provisioner 使用 Helm Chart 安装 nfs-client-provisioner 可以很容易地创建多个实例。首先,需要安装 Helm 工具和 Tiller 服务。然后,可以使用以下命令安装 nfs-client-provisioner: ``` helm install --name nfs-client-provisioner-1 stable/nfs-client-provisioner \ --set nfs.server=<NFS server IP address> \ --set nfs.path=<NFS server path> \ --set storageClass.name=nfs-client-provisioner-1 \ --set storageClass.defaultClass=false \ --set storageClass.archiveOnDelete=false \ --set storageClass.reclaimPolicy=Retain \ --set resources.requests.storage=1Gi ``` 通过更改 `--name` 和 `storageClass.name` 参数的值,可以创建多个 nfs-client-provisioner 实例。 2. 使用 Kubernetes 部署多个 nfs-client-provisionerKubernetes 中,可以创建多个 nfs-client-provisioner 实例,每个实例都有自己的 Deployment、Service 和 StorageClass。可以使用以下 YAML 文件创建一个 nfs-client-provisioner 实例: ``` apiVersion: v1 kind: ServiceAccount metadata: name: nfs-client-provisioner --- kind: Deployment apiVersion: extensions/v1beta1 metadata: name: nfs-client-provisioner-1 spec: replicas: 1 selector: matchLabels: app: nfs-client-provisioner-1 template: metadata: labels: app: nfs-client-provisioner-1 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: nfs-client-provisioner-1 - name: NFS_SERVER value: <NFS server IP address> - name: NFS_PATH value: <NFS server path> volumes: - name: nfs-client-root nfs: server: <NFS server IP address> path: <NFS server path> --- kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: nfs-client-provisioner-1 provisioner: nfs-client-provisioner-1 reclaimPolicy: Retain parameters: archiveOnDelete: "false" mountOptions: "nfsvers=4.1" ``` 然后,可以将文件中的 `nfs-client-provisioner-1` 更改为另一个名称,以创建另一个 nfs-client-provisioner 实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值