在K8S中部署NFS服务器并在K8S集群外使用NFS

背景说明

有这样一个场景,我们需要使用多个NFS Server来做负载均衡,Server中保存的文件只读,所以不用考虑数据同步。

一种可能的实现方式是在物理服务器上安装NFS Server,同时安装负载均衡软件来实现(如LVS等),配置起来比较繁琐。

这里考虑在kubernetes集群部署NFS server三副本,同时安装metallb实现负载均衡。

安装负载均衡器

由于这里使用的是rke2搭建的kubernetes集群,需要编辑/etc/rancher/rke2/config.yaml文件,增加如下配置后,重启rke2

bash 复制代码
kube-proxy-arg: # 不指定的话,默认是 iptables 模式
  - proxy-mode=ipvs
  - ipvs-strict-arp=true

helm一键安装metallb

bash 复制代码
helm repo add metallb https://metallb.github.io/metallb
helm install metallb metallb/metallb

创建L2Advertisement,使集群外的服务器也可以访问NFS Server

复制代码
cat<<EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
spec:
  addresses:
  - 192.168.122.20-192.168.122.24
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: example
EOF

在kubernetes集群中部署NFS Server

bash 复制代码
cat<<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-server
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nfs-server
  template:
    metadata:
      labels:
        app: nfs-server
    spec:
      containers:
      - name: nfs-server
        image: k8s.gcr.io/volume-nfs:0.8
        ports:
        - name: nfs
          containerPort: 2049
        - name: mountd
          containerPort: 20048
        - name: rpcbind
          containerPort: 111
        securityContext:
          privileged: true
        volumeMounts:
        - name: storage
          mountPath: /exports
      volumes:
      - name: storage
        hostPath:
          path: /data/nfs # store all data in "/data/nfs" directory of the node where it is running
          type: DirectoryOrCreate # if the directory does not exist then create it
---
apiVersion: v1
kind: Service
metadata:
  name: nfs-service
spec:
  ports:
  - name: nfs
    port: 2049
  - name: mountd
    port: 20048
  - name: rpcbind
    port: 111
  selector:
    app: nfs-server # must match with the label of NFS pod
  type: LoadBalancer
EOF

使用负载均衡测试nfs记录

bash 复制代码
# kubectl get svc | grep nfs
nfs-service               LoadBalancer   10.43.223.162   192.168.122.21   2049:31390/TCP,20048:31442/TCP,111:31111/TCP   23h

集群外的客户端挂载nfs

bash 复制代码
mount.nfs4  -onolock 192.168.122.21:/ /mnt
ll /mnt

参考链接:

https://github.com/appscode/third-party-tools/blob/master/storage/nfs/README.md

https://metallb.universe.tf/installation/

https://www.qiniu.com/qfans/qnso-53419624

相关推荐
影视飓风TIM4 分钟前
Linux基础入门笔记:命令、内核架构与压缩传输全梳理
linux·笔记·架构
敲上瘾8 分钟前
Linux系统调用mmap文件映射与malloc简单模拟实现指南
linux·服务器·c语言·缓存
APItesterCris10 分钟前
电商口碑自动化监控方案:30 分钟搭建商品评论实时采集 + 情感分析系统(完整可运行代码)
大数据·运维·数据仓库·自动化
wdfk_prog7 小时前
嵌入式面试真题第 10 题:高优化等级下共享状态可见性、内存模型与系统级同步设计
java·linux·开发语言·面试·职场和发展·架构·c
x-cmd9 小时前
Mac 涨价后,本地 AI 还能千元入门吗?
linux·人工智能·macos·ai·agent·amd·本地ai入门
Sirius Wu10 小时前
OpenClaw Skill:Matplotlib 可视化技能 + 沙箱双层隔离完整详解
服务器·网络·人工智能·安全·ai·架构·aigc
J-Tony1110 小时前
【Redis】 Redis 是单线程还是多线程
服务器·数据库·mysql
AOwhisky11 小时前
下一代容器来了?Docker 宣布原生支持 WebAssembly
java·运维·docker·容器·rust·wasm
众人皆醒我独醉14 小时前
OpenShift RBAC 与平台安全策略:比 K8s 多出来的那几道锁,每道都是为了堵一个曾经发生过的事故
面试·kubernetes
YYYing.15 小时前
【C++大型项目之高性能服务器框架 (七) 】Socket与ByteArray模块
服务器·c++·后端·框架·高性能·c/c++