在 K3s Kubernetes 中为 NFS 共享创建 link

Creating a link to an NFS share in K3s Kubernetes

我是 Kubernetes 的新手,正在尝试在 raspberry pi 的小型集群上获取 node-red 运行 我很高兴地做到了这一点,但注意到一旦集群断电,下次我启动它时,node-red 中的流就消失了。

所以,我在我本地网络上的 freenas 盒子上创建了一个 NFS 共享,并且可以从另一个 RPI 安装它,所以我知道权限有效。

但是我无法让我的挂载在 kubernetes 部署中工作。

请问我哪里出错了?

apiVersion: apps/v1
kind: Deployment
metadata:
  name: node-red
  labels:
    app: node-red
spec:
  replicas: 1
  selector:
    matchLabels:
      app: node-red
  template:
    metadata:
      labels:
        app: node-red
    spec:
      containers:
      - name: node-red
        image: nodered/node-red:latest
        ports:
        - containerPort: 1880
          name: node-red-ui
        securityContext:
          privileged: true
        volumeMounts:
        - name: node-red-data
          mountPath: /data
        env:
        - name: NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        - name: TZ
          value: Europe/London
      volumes:
         - name: node-red-data
      nfs:
         server: 192.168.1.96
         path: /mnt/Pool1/ClusterStore/nodered

我得到的错误是

error: error validating "node-red-deploy.yml": error validating data: 
ValidationError(Deployment.spec.template.spec): unknown field "nfs" in io.k8s.api.core.v1.PodSpec; if 
you choose to ignore these errors, turn validation off with --validate=false

新信息

我现在有以下

apiVersion: v1
kind: PersistentVolume
metadata:
  name: clusterstore-nodered
  labels:
    type: nfs
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /mnt/Pool1/ClusterStore/nodered
    server: 192.168.1.96 
  persistentVolumeReclaimPolicy: Recycle

claim.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: clusterstore-nodered-claim
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi

现在,当我开始部署时,它会永远等待挂起,我看到以下 PVC 事件

事件: 消息类型原因年龄 ---- ------ ---- ---- -------- 正常 WaitForFirstConsumer 5m47s(x7 超过 7m3s)persistentvolume-controller 在绑定之前等待创建第一个消费者 正常供应 119s(x5 超过 5m44s)牧场主。io/local-path_local-path-provisioner-58fb86bdfd-rtcls_506528ac-afd0-11ea-930d-52d0b85bb2c2 外部供应商正在为索赔供应量 "default/clusterstore-nodered-claim" 警告 ProvisioningFailed 119s(x5 超过 5m44s)rancher。io/local-path_local-path-provisioner-58fb86bdfd-rtcls_506528ac-afd0-11ea-930d-52d0b85bb2c2 无法使用 StorageClass "local-path" 提供卷:仅支持 ReadWriteOnce 访问模式

正常 ExternalProvisioning 92s(x19 超过 5m44s)persistentvolume-controller 等待创建卷,由外部供应商 "rancher.io/local-path" 或由系统管理员手动创建

我认为这是因为我没有 nfs 提供程序,事实上,如果我执行 kubectl get storageclass,我只会看到本地路径

新问题,如何为 NFS 添加存储类?在谷歌上搜索了一下,我一无所知。

这是一个验证错误,指向部署 yaml 的最后一部分,因此使其成为无效对象。看起来你在缩进上犯了一个错误。它应该看起来更像这样:

  volumes:
  - name: node-red-data
    nfs:
      server: 192.168.1.96
      path: /mnt/Pool1/ClusterStore/nodered

此外,由于您是 Kubernetes 的新手,我强烈建议您熟悉 PersistentVolumes and its claims. PVs are volume plugins like Volumes 的概念,但要有一个独立于使用 PV 的任何单个 Pod 的生命周期。

如果有帮助,请告诉我。

好的,问题解决了。 Kubernetes 教程真的很深奥,缺少很多假设步骤。

我的问题是 pi 上的 k3s 仅与本地路径存储提供商一起提供。

我终于找到了安装 nfs 客户端存储提供程序的教程,现在我的集群可以正常工作了!

This was the tutorial I found the information in.

在规定的教程中,基本上需要完成以下步骤:

1.

showmount -e 192.168.1.XY 

检查共享是否可以从 NAS 外部访问

2.

helm install nfs-provisioner stable/nfs-client-provisioner --set nfs.server=192.168.1.**XY** --set nfs.path=/samplevolume/k3s --set image.repository=quay.io/external_storage/nfs-client-provisioner-arm

而您将 IP 替换为您的 NFS 服务器,并将 NFS 路径替换为您在 Synology 上的特定路径(两者都应该在您的 showmount -e IP[=43= 中可见]命令

更新 23.02.2021 看来你也得用别的 Chart 和 Image 了:

helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner --set nfs.server=192.168.1.**XY** --set nfs.path=/samplevolume/k3s --set image.repository=gcr.io/k8s-staging-sig-storage/nfs-subdir-external-provisioner
  1. kubectl 获取存储空间class

检查存储class现在是否存在

4.

kubectl patch storageclass nfs-client -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}' && kubectl patch storageclass local-path -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'

将新存储 class 配置为“默认”。用 kubectl get storageclass 告诉

的内容替换 nfs-client 和 local-path

5.

kubectl get storageclass

最后检查,如果它被标记为“默认”