文章目录

Toggle

- 群辉配置
- VMware vSphere ESXI8.0一键安装黑群晖DSM7教程
- Kubernetes 存储卷创建

目前单机创建NFS服务器高可用数据不好实现,使用CEPH数据存储又可能比较麻烦,还需要额外维护单独CEPH集群,本次采用群辉NFS存储进行模拟测试

群辉配置


登录群辉,需要搭建可以参考下面的文章





https://i4t.com/6102.htmljavascript:void(0))

VMware vSphere ESXI8.0一键安装黑群晖DSM7教程


新闻联播老司机

- 22年12月4日
- 喜欢:0
- 浏览:4.1k

1751465238633.png

开启NFS Server服务
1751465936015.png

创建共享目录,打开控制面板
1751465546209.png

创建共享目录
1751465588134.png

设置目录名称nfs-k8s

1751465621672.png

按照下面的配置,设置NFS Server权限

1751465741517.png

开启File Station 匿名用户访问权限

1751465819655.png

挂载目录可以在共享目录中看到
1751465995701.png

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