NFS on Raspberry Pi
目前正学习如何在树莓派4集群上结合gromacs+mpich的分子动力学模拟,所以需要搭建一款分布式存储系统,又由于树莓派性能的限制,搭建OpenEBS会比较浪费计算资源,最后就采用轻量级的NFS来完成文件系统的共享和存储。
NFS on K3s aarch64
基础依赖
NFS Server:
sudo apt install nfs-kernel-server
添加共享文件目录到/etc/exports:
/mnt/data/nfs 192.168.1.0/24(rw,sync,no_root_squash,no_subtree_check) # 外部使用
/mnt/data/kubedata 192.168.1.0/24(rw,sync,no_root_squash,no_subtree_check) # k3s 使用
启动 NFS Server:
sudo systemctl restart nfs-kernel-server
NFS Client:
sudo apt install nfs-common
sudo mount 192.168.1.145:/mnt/data/nfs ./nfs
添加到/etc/fstab:
192.168.1.145:/mnt/data/nfs /home/chenfeng/nfs nfs auto,nofail,noatime,nolock 0 0
K3s NFS Volume
需要使用Kubernets提供的NFS Client Provisioner
k3s是跑在Ubuntu 20.04 aarch64 系统上的,而官方提供的NFS Client Provisioner是基于ARM v7的,所以需要重新编译Provisioner。
以下的操作全部在Raspberry pi 4上完成的。
以下为PATH:
diff -ur ./Makefile /tmp/nfs-client/Makefile
--- ./Makefile 2020-06-28 07:47:43.883181030 +0000
+++ /tmp/nfs-client/Makefile 2020-06-28 10:06:00.588586966 +0000
@@ -28,17 +28,16 @@
container: build image build_arm image_arm
build:
- CGO_ENABLED=0 GOOS=linux go build -a -ldflags '-extldflags "-static"' -o docker/x86_64/nfs-client-provisioner ./cmd/nfs-client-provisioner
+ go build -a -ldflags '-extldflags "-static"' -o docker/x86_64/nfs-client-provisioner ./cmd/nfs-client-provisioner
build_arm:
- CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 go build -a -ldflags '-extldflags "-static"' -o docker/arm/nfs-client-provisioner ./cmd/nfs-client-provisioner
+ go build -a -ldflags '-extldflags "-static"' -o docker/arm/nfs-client-provisioner ./cmd/nfs-client-provisioner
image:
docker build -t $(MUTABLE_IMAGE) docker/x86_64
docker tag $(MUTABLE_IMAGE) $(IMAGE)
image_arm:
- docker run --rm --privileged multiarch/qemu-user-static:register --reset
docker build -t $(MUTABLE_IMAGE_ARM) docker/arm
docker tag $(MUTABLE_IMAGE_ARM) $(IMAGE_ARM)
Only in /tmp/nfs-client/deploy: .deployment-arm.yaml.swp
diff -ur ./deploy/deployment-arm.yaml /tmp/nfs-client/deploy/deployment-arm.yaml
--- ./deploy/deployment-arm.yaml 2020-06-28 09:24:48.499572298 +0000
+++ /tmp/nfs-client/deploy/deployment-arm.yaml 2020-06-28 10:06:11.876117004 +0000
@@ -4,7 +4,8 @@
name: nfs-client-provisioner
labels:
app: nfs-client-provisioner
- namespace: nfs
+ # replace with namespace where provisioner is deployed
+ namespace: default
spec:
replicas: 1
strategy:
@@ -20,7 +21,7 @@
serviceAccountName: nfs-client-provisioner
containers:
- name: nfs-client-provisioner
- image: 192.168.1.114:5000/nfs-client-provisioner-arm
+ image: quay.io/external_storage/nfs-client-provisioner-arm:latest
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
@@ -28,11 +29,11 @@
- name: PROVISIONER_NAME
value: fuseim.pri/ifs
- name: NFS_SERVER
- value: 192.168.1.145
+ value: 10.10.10.60
- name: NFS_PATH
- value: /mnt/data/kubedata
+ value: /ifs/kubernetes
volumes:
- name: nfs-client-root
nfs:
- server: 192.168.1.145
- path: /mnt/data/kubedata
+ server: 10.10.10.60
+ path: /ifs/kubernetes
diff -ur ./deploy/test-pod.yaml /tmp/nfs-client/deploy/test-pod.yaml
--- ./deploy/test-pod.yaml 2020-06-28 09:36:06.872994438 +0000
+++ /tmp/nfs-client/deploy/test-pod.yaml 2020-06-28 10:06:11.920115180 +0000
@@ -5,7 +5,7 @@
spec:
containers:
- name: test-pod
- image: 192.168.1.114:5000/ubuntu:20.04
+ image: gcr.io/google_containers/busybox:1.24
command:
- "/bin/sh"
args:
diff -ur ./docker/arm/Dockerfile /tmp/nfs-client/docker/arm/Dockerfile
--- ./docker/arm/Dockerfile 2020-06-28 07:47:43.759177680 +0000
+++ /tmp/nfs-client/docker/arm/Dockerfile 2020-06-28 10:06:00.628585293 +0000
@@ -12,7 +12,6 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-FROM hypriot/rpi-alpine:3.6
-RUN apk update --no-cache && apk add ca-certificates
+FROM ubuntu:20.04
COPY nfs-client-provisioner /nfs-client-provisioner
ENTRYPOINT ["/nfs-client-provisioner"]
nfs-client/cmd/nfs-client-provisioner为Provisioner源码目录。
在调用make build_arm之前,我们需要安装golang,并且将编译需要的依赖从仓库external-storage/vendor/拷贝到$GOPATH/src中,编译完成的二进制文件位于nfs-client/docker/arm/nfs-client-provisioner。
构建打包的image直接修改为ubuntu:20.04,运行make image_arm。
根据上述PATCH修改完对应的文件之后,执行:
kubectl apply -f rbac.yaml
kubectl apply -f deployment-arm.yaml
kubectl apply -f class.yaml
最后测试test pod
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-claim
annotations:
volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Mi
kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
test-claim Bound pvc-dff7c47d-91ae-483e-9d95-d33074ec9e0b 1Mi RWX managed-nfs-storage 48m
kind: Pod
apiVersion: v1
metadata:
name: test-pod
spec:
containers:
- name: test-pod
image: 192.168.1.114:5000/ubuntu:20.04
command:
- "/bin/sh"
args:
- "-c"
- "touch /mnt/SUCCESS && exit 0 || exit 1"
volumeMounts:
- name: nfs-pvc
mountPath: "/mnt"
restartPolicy: "Never"
volumes:
- name: nfs-pvc
persistentVolumeClaim:
claimName: test-claim
如果PVC test-claim是Bound状态,并且test-pod运行结束之后,会在对应的NFS目录写入SUCCESS文件,则k3s NFS 搭建完成。