Kubernetes 1.29使用群辉dsm7 NFS存储创建StorageClass持久化
- 系统运维
- 22小时前
- 13热度
- 0评论
目前单机创建NFS服务器高可用数据不好实现,使用CEPH数据存储又可能比较麻烦,还需要额外维护单独CEPH集群,本次采用群辉NFS存储进行模拟测试
群辉配置
登录群辉,需要搭建可以参考下面的文章
开启NFS Server服务
创建共享目录,打开控制面板
创建共享目录
设置目录名称nfs-k8s
按照下面的配置,设置NFS Server权限
开启File Station 匿名用户访问权限
挂载目录可以在共享目录中看到
Kubernetes 存储卷创建
- 所有k8s节点安装nfs (我这里以Ubuntu为例)
sudo apt update
sudo apt install nfs-kernel-server
执行showmount测试nfs挂载情况
root@k8s-master-01:~# showmount -e 192.168.21.27
Export list for 192.168.21.27:
/volume1/nfs-k8s *
root@k8s-master-01:~#
接下来为nfs创建rbac权限
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-client-provisioner
# replace with namespace where provisioner is deployed
namespace: default
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nfs-client-provisioner-runner
rules:
- apiGroups: [""]
resources: ["nodes"]
verbs: ["get", "list", "watch"]
- 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
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
# replace with namespace where provisioner is deployed
namespace: default
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
# replace with namespace where provisioner is deployed
namespace: default
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
# replace with namespace where provisioner is deployed
namespace: default
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
# replace with namespace where provisioner is deployed
namespace: default
roleRef:
kind: Role
name: leader-locking-nfs-client-provisioner
apiGroup: rbac.authorization.k8s.io
创建Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-client-provisioner
labels:
app: nfs-client-provisioner
# replace with namespace where provisioner is deployed
namespace: default
spec:
replicas: 1
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: dockerproxy.frps.fun/dyrnq/nfs-subdir-external-provisioner:v4.0.1
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: k8s-sigs.io/nfs-subdir-external-provisioner
- name: NFS_SERVER
value: 192.168.21.27
- name: NFS_PATH
value: /volume1/nfs-k8s
volumes:
- name: nfs-client-root
nfs:
server: 192.168.21.27
path: /volume1/nfs-k8s
我这里提供下面镜像
dockerproxy.frps.fun/dyrnq/nfs-subdir-external-provisioner:v4.0.1
官方默认镜像地址为dyrnq/nfs-subdir-external-provisioner:v4.0.1
这里是创建StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: dsm7-nfs-client
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner # or choose another name, must match deployment's env PROVISIONER_NAME'
parameters:
archiveOnDelete: "false"
查看所有已创建的资源
root@k8s-master-01:~/nfs# kubectl get pod,sa,sc
NAME READY STATUS RESTARTS AGE
pod/nfs-client-provisioner-594f79d67b-wvx5s 1/1 Running 0 23m
NAME SECRETS AGE
serviceaccount/default 0 22h
serviceaccount/nfs-client-provisioner 0 26m
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
storageclass.storage.k8s.io/dsm7-nfs-client k8s-sigs.io/nfs-subdir-external-provisioner Delete Immediate false 13s
将dsm7-nfs-client
设置为默认storageclass
root@k8s-master-01:~/nfs# kubectl patch storageclass dsm7-nfs-client -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}'
查看设置default状态
root@k8s-master-01:~/nfs# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
dsm7-nfs-client (default) k8s-sigs.io/nfs-subdir-external-provisioner Delete Immediate false 5m
测试pvc如下
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
namespace: default
name: abcdocker-test-pvc
labels: {}
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
storageClassName: dsm7-nfs-client
这里提示已绑定,代表PVC验证完毕
root@k8s-master-01:~/nfs# kubectl apply -f test-pvc.yaml
persistentvolumeclaim/abcdocker-test-pvc created
root@k8s-master-01:~/nfs# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
abcdocker-test-pvc Bound pvc-ba81924e-3d04-4173-9abf-d17972f6fa5b 10Gi RWX dsm7-nfs-client <unset> 5s