Kubernetes版本 v1.19.14
在 Kubernetes 上部署 NFS Client Provisioner
NFS Client Provisioner 是一個 Kubernetes 存儲類的實(shí)現(xiàn),它利用 NFS(Network File System)來動態(tài)創(chuàng)建持久卷(Persistent Volume)。在本篇博客中,我們將介紹如何在 Kubernetes 集群上部署和配置 NFS Client Provisioner。
步驟一:部署 NFS 服務(wù)器
首先,我們需要準(zhǔn)備一個 NFS 服務(wù)器來提供存儲服務(wù)??梢允褂靡粋€現(xiàn)有的 NFS 服務(wù)器或者自己搭建一個。
- 安裝并配置 NFS 服務(wù)器:
# 在 Ubuntu 上安裝 NFS 服務(wù)器
sudo apt update
sudo apt install nfs-kernel-server
# 創(chuàng)建共享目錄
sudo mkdir /shared_directory
# 配置 NFS 導(dǎo)出
sudo nano /etc/exports
# 在文件中添加以下行
/shared_directory *(rw,sync,no_subtree_check)
# 重新加載 NFS 配置
sudo exportfs -a
# 啟動 NFS 服務(wù)
sudo systemctl start nfs-kernel-server
sudo systemctl enable nfs-kernel-server
確保將 /shared_directory
替換為實(shí)際的共享目錄路徑,并根據(jù)需要調(diào)整其他配置。
- 驗(yàn)證 NFS 服務(wù)器是否正常運(yùn)行:
shellCopy code# 檢查 NFS 服務(wù)狀態(tài)
sudo systemctl status nfs-kernel-server
# 確保 NFS 導(dǎo)出可用
showmount -e localhost
確保顯示出 /shared_directory
的導(dǎo)出信息。
更多內(nèi)容可參考作者NFS介紹,或者官方網(wǎng)站內(nèi)容
步驟二:部署 NFS Client Provisioner
在部署 NFS Client Provisioner 之前,確保你的 Kubernetes 集群已經(jīng)配置好,并且具有可用的存儲類。
- 編寫rbac.yaml文件,進(jìn)行權(quán)限分配
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-client-provisioner
namespace: kube-system
---
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
namespace: kube-system
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
namespace: kube-system
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
namespace: kube-system
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
namespace: kube-system
roleRef:
kind: Role
name: leader-locking-nfs-client-provisioner
apiGroup: rbac.authorization.k8s.io
- 編寫storageclass.yaml文件
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-storage
annotations:
storageclass.kubernetes.io/is-default-class: "false"
provisioner: "k8s-sigs.io/nfs-subdir-external-provisioner"
parameters:
archiveOnDelete: "true"
-
編寫deployment.yaml文件
修改配置
將 替換為 NFS 服務(wù)器的 IP 地址
將 替換為 NFS 服務(wù)器上的共享目錄路徑
可根據(jù)需要修改其他配置
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-client-provisioner
namespace: kube-system
labels:
app: nfs-client-provisioner
spec:
replicas: 1
strategy:
type: Recreate ## 設(shè)置升級策略為刪除再創(chuàng)建(默認(rèn)為滾動更新)
selector:
matchLabels:
app: nfs-client-provisioner
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccountName: nfs-client-provisioner
containers:
- name: nfs-client-provisioner
image: eipwork/nfs-subdir-external-provisioner:4.0.2
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: k8s-sigs.io/nfs-subdir-external-provisioner
# 設(shè)置高可用允許選舉
#- name: ENABLE_LEADER_ELECTION
# value: "True"
- name: NFS_SERVER
value: 192.168.0.80
- name: NFS_PATH
value: /data/nfs
imagePullSecrets:
- name: default-secret
volumes:
- name: nfs-client-root
nfs:
server: nfs-server-ip
path: shared-directory
- 部署 NFS Client Provisioner:
kubectl apply -f rbac.yaml
kubectl apply -f storageclass.yaml
kubectl apply -f deployment.yaml
- 驗(yàn)證部署是否成功:
kubectl get pods -n kube-system
確保 NFS Client Provisioner 的 Pod 運(yùn)行正常。
步驟三:創(chuàng)建持久卷
現(xiàn)在,你可以創(chuàng)建使用 NFS Client Provisioner 的持久卷了。下面是一個示例的持久卷聲明 YAML 文件的例子 pvc.yaml:
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-pvc
spec:
storageClassName: nfs-storage
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Mi
根據(jù)需要,調(diào)整存儲容量、訪問模式等配置。然后,使用 kubectl apply -f pvc.yaml
命令創(chuàng)建持久卷聲明。
測試掛載卷,編寫pod.yaml
kind: Pod
apiVersion: v1
metadata:
name: test-pod
spec:
containers:
- name: test-pod
image: busybox:latest
command:
- "/bin/sh"
args:
- "-c"
- "touch /mnt/SUCCESS && exit 0 || exit 1" ## 創(chuàng)建一個名稱為"SUCCESS"的文件
volumeMounts:
- name: nfs-pvc
mountPath: "/mnt"
restartPolicy: "Never"
volumes:
- name: nfs-pvc
persistentVolumeClaim:
claimName: test-pvc
根據(jù)需要,調(diào)整鏡像、測試命令、掛載路徑等配置。然后,使用 kubectl apply -f pod.yaml
命令創(chuàng)建持久卷聲明。
結(jié)論
通過部署和配置 NFS Client Provisioner,你可以在 Kubernetes 集群中輕松創(chuàng)建動態(tài)的 NFS 持久卷。這提供了一種方便且可擴(kuò)展的方式來管理存儲,并為應(yīng)用程序提供持久化的存儲支持。
希望這篇博客對你部署 NFS Client Provisioner 有所幫助!文章來源:http://www.zghlxwxcb.cn/news/detail-567402.html
參考資源:文章來源地址http://www.zghlxwxcb.cn/news/detail-567402.html
- Kubernetes NFS Client Provisioner GitHub 倉庫
- Kubernetes NFS 存儲類文檔
- NFS 官方文檔
到了這里,關(guān)于kubernetes系列教程之 nfs-client-provisioner部署的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!