前言
NFS Subdir External Provisioner
可以使用现有的 NFS 服务器动态创建 pv 和 pvc
部署 NFS server
镜像准备
这块可以看我之前的博客,这里就不啰嗦了
节点打标签
采用 hostpath 的方式来持久化 NFS 的共享目录,需要绑定节点不让 NFS 飘移
k label node 192.168.22.124 nfs-server=true
启动 NFS server
- 这里记录两个问题
- NFS 的配置文件,根目录或者说第一个共享目录,需要加上 fsid=0 ,然后挂载的时候直接使用 / ,如果不加 fsid=0,挂载会报错找不到文件或目录,细节什么的,可以看一下官方的手册:exports
- 因为需要本地宿主机挂载 NFS 共享目录到 kubelet 的目录下面,宿主机就没办法使用 svc 的方式来挂载,除非本地 DNS 服务器包含了 k8s 集群内的 DNS,我这边就暂时使用指定的 clusterIP 地址来创建 svc,集群内直接使用 svc 的 ip 地址来挂载 NFS
- 关于 clusterip 的 ip 范围,需要看 apiserver 的
--service-cluster-ip-range
参数,一般都是10.96.0.0/12
,可用的范围在10.96.0.0
到10.111.255.255
之间,找一个集群内不存在的 ip 来用就行- Service ClusterIP 分配
- exports 里面要把 node 节点的 ip 网段,svc 的网段和 pod 的网段都写进去,如果嫌烦,也可以直接写
*
,只要不是对外暴露的,问题不是很大
---
apiVersion: v1
data:
exports: |
/nfs-share-data 192.168.22.0/24(rw,fsid=0,sync,no_subtree_check,no_auth_nlm,insecure,no_root_squash)
/nfs-share-data 10.96.0.0/12(rw,fsid=0,sync,no_subtree_check,no_auth_nlm,insecure,no_root_squash)
/nfs-share-data 172.22.0.0/16(rw,fsid=0,sync,no_subtree_check,no_auth_nlm,insecure,no_root_squash)
kind: ConfigMap
metadata:
name: nfs-server-cm
namespace: storage
---
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/name: nfs-server
name: nfs-server-svc
namespace: storage
spec:
clusterIP: 10.111.111.111
ports:
- name: tcp
port: 2049
targetPort: tcp
selector:
app.kubernetes.io/name: nfs-server
type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/name: nfs-server
name: nfs-server
namespace: storage
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: nfs-server
strategy:
type: RollingUpdate
template:
metadata:
labels:
app.kubernetes.io/name: nfs-server
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: nfs-server
operator: In
values:
- "true"
containers:
- env:
- name: SHARED_DIRECTORY
value: /nfs-share-data
image: nfs-server-2.6.4:alpine-3.20
imagePullPolicy: IfNotPresent
name: nfs-server
ports:
- containerPort: 2049
name: tcp
protocol: TCP
resources:
limits:
cpu