在建置完Kubernetes cluster之後,通常我會做的前幾件事之一就是建立一個StorageClass給應用服務使用,而NFS我認為是相對容易實現的做法。
接下來將分成幾個部分跟大家說明:
(1) StroageClass是什麼?
(2) 為什麼需要它?
(3) 運行的流程
(4) 部署NFS StorageClass
那就開始吧!!
官方定義如下:
StorageClass提供了一種供管理員描述其提供的存儲類別的方式。不同的類別可能映射到服務品質水平、
備份策略,或由叢集管理員決定的任意策略。Kubernetes 本身對類別代表的內容保持中立。在儲存系統中
,一般可以被稱為"Profile"。
StorageClass物件內將定義:
當描述了以上資訊後,Kubernetes就可以透過PVC找到對應的StorageClass,再由Kubernetes直接調用StorageClass內定義的plugin,再建立出相對應的PV資源。
不想因為手動建立PV的失誤反而造成我的PVC無法綁定PV而造成應用服務失敗。只要我寫好PVC,直接讓Kubernetes來管理我的PV資源就好。
如果在大規模的Cluster環境之下,如果不使用StorageClass,就代表有1000個PVC,就要手動建立1000個PV,在管理上就會是一場容易知道儲存的需求。
本文針對NFS provisioner還可以再簡化成下圖:
建立NFS provisioner之後,當PVC進行宣告後,就會連接到storageclass自動產生以NFS協定為基礎的PV資源來提供儲存。
(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: