更新於 2024/10/09閱讀時間約 10 分鐘

StorageClass應用:NFS

在建置完Kubernetes cluster之後,通常我會做的前幾件事之一就是建立一個StorageClass給應用服務使用,而NFS我認為是相對容易實現的做法。

透過網路取得共享的資料

接下來將分成幾個部分跟大家說明:

(1) StroageClass是什麼?

(2) 為什麼需要它?

(3) 運行的流程

(4) 部署NFS StorageClass

那就開始吧!!


1. StorageClass是什麼?

官方定義如下:
StorageClass提供了一種供管理員描述其提供的存儲類別的方式。不同的類別可能映射到服務品質水平、
備份策略,或由叢集管理員決定的任意策略。Kubernetes 本身對類別代表的內容保持中立。在儲存系統中
,一般可以被稱為"Profile"


StorageClass物件內將定義:

  • PV的屬性,包含儲存的類型,Volume Size…
  • 這個PV要用到那種Plugin

當描述了以上資訊後,Kubernetes就可以透過PVC找到對應的StorageClass,再由Kubernetes直接調用StorageClass內定義的plugin,再建立出相對應的PV資源。

2. 為什麼要使用StorageClass?

不想因為手動建立PV的失誤反而造成我的PVC無法綁定PV而造成應用服務失敗。只要我寫好PVC,直接讓Kubernetes來管理我的PV資源就好。

如果在大規模的Cluster環境之下,如果不使用StorageClass,就代表有1000個PVC,就要手動建立1000個PV,在管理上就會是一場容易知道儲存的需求。

儲存需求依照不同特性進行分類

3. 運行的流程

From: https://forum.huawei.com/enterprise/en/dynamic-provisioning-with-kubernetes-storage-classes-huawei-evs/thread/694728783145353216-667213860102352896

本文針對NFS provisioner還可以再簡化成下圖:

建立NFS provisioner之後,當PVC進行宣告後,就會連接到storageclass自動產生以NFS協定為基礎的PV資源來提供儲存。

4. 部署StorageClass

(1) 建立nfs server

# cat >> /etc/fstab << EOF
/dev/vg00/nfs /var/nfsshare xfs defaults 0 0
EOF
// 安裝nfs-server

# yum install -y nfs-utils policycoreutils-python-utils policycoreutils-python
# mkdir /var/nfsshare
# chmod 777 /var/nfsshare
# cat > /etc/exports << EOF
/var/nfsshare *(rw,sync,no_wdelay,no_root_squash,insecure)
EOF

# systemctl start rpcbind nfs-server nfs-lock nfs-idmap
# systemctl enable rpcbind nfs-server nfs-lock nfs-idmap
# systemctl start rpcbind nfs-server nfs-lock nfs-idmap
//設定Firewalld放行規則

# export FIREWALLD_DEFAULT_ZONE=`firewall-cmd --get-default-zone`
# echo ${FIREWALLD_DEFAULT_ZONE}
public

# firewall-cmd --permanent --zone=${FIREWALLD_DEFAULT_ZONE} --add-service=rpc-bind
# firewall-cmd --permanent --zone=${FIREWALLD_DEFAULT_ZONE} --add-service=nfs
# firewall-cmd --permanent --zone=${FIREWALLD_DEFAULT_ZONE} --add-service=mountd
# firewall-cmd --reload ; firewall-cmd --list-all
//設定SELINUX

# setsebool -P nfs_export_all_rw 1
# setsebool -P nfs_export_all_ro 1
# semanage fcontext -a -t public_content_rw_t "/var/nfsshare(/.*)?"
# restorecon -R /var/nfsshare
//測試

# mount -t nfs nfs-server:/var/nfsshare /mnt
# touch /mnt/1 && rm -f /mnt/1

(2) 建立NFS provisioner in Kubernetes

//取得資源

# git clone https://github.com/kubernetes-incubator/external-storage.git kubernetes-incubator
// 建立namespace

# kubectl create namespace k8s-nfs-storage
// 更新 deployment與RBAC

# cd kubernetes-incubator/nfs-client/
# sed -i'' "s/namespace:.*/namespace: k8s-nfs-storage/g" ./deploy/rbac.yaml
# sed -i'' "s/namespace:.*/namespace: k8s-nfs-storage/g" ./deploy/deployment.yaml
# kubectl create -f rbac.yaml
// 更新權限

# kubectl adm policy add-scc-to-user hostmount-anyuid system:serviceaccount:k8s-nfs-storage:nfs-client-provisioner
// 修改deployment.yaml

containers:
- name: nfs-client-provisioner
image: groundhog2k/nfs-subdir-external-provisioner:v3.2.0
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: storage.io/nfs
- name: NFS_SERVER
value: 192.168.1.10
- name: NFS_PATH
value: /var/nfsshare
volumes:
- name: nfs-client-root
nfs:
server: 192.168.1.10
path: /var/nfsshare
// 更新class.yaml

# vim deploy/class.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: managed-nfs-storage
provisioner: storage.io/nfs # or choose another name, must match deployment's env PROVISIONER_NAME'
parameters:
archiveOnDelete: "false"
// 部署

# kubectl create -f deploy/class.yaml
# kubectl create -f deploy/deployment.yaml
# kubectl get all -n k8s-nfs-storage

後續使用資料夾內的test-pvc.yaml測試是否可以正確的自動產生對應的PV並且PVC有取得資源。

如果要修改預設的storageClass,可以使用以下方式實現:

# kubectl patch storageclass managed-nfs-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
storageclass.storage.k8s.io/managed-nfs-storage patched

以上就是基本的NFS storageclass的部署與StorageClass的說明,還有一些storageclass的操作後續文章再跟大家分享。


References:

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.