通過配置JindoRuntime實(shí)現(xiàn)Master組件狀態(tài)持久化存儲(chǔ)
為避免運(yùn)行Master組件的容器重啟造成緩存系統(tǒng)元數(shù)據(jù)丟失,F(xiàn)luid支持通過配置JindoRuntime,持久化存儲(chǔ)JindoFS Master組件的元數(shù)據(jù),從而提升JindoFS分布式緩存集群的可用性。
功能介紹
JindoFS來源于阿里云EMR團(tuán)隊(duì),是基于C++實(shí)現(xiàn)的支撐Dataset數(shù)據(jù)管理和數(shù)據(jù)緩存的執(zhí)行引擎,同時(shí)支持對(duì)OSS、OSS-HDFS和PVC等多種數(shù)據(jù)源提供數(shù)據(jù)緩存服務(wù)。更多信息,請(qǐng)參見JindoData概述。
JindoFS采用Master-Worker架構(gòu),Master組件和Worker組件均容器化運(yùn)行于集群中,其中Master組件負(fù)責(zé)記錄緩存數(shù)據(jù)元信息和掛載點(diǎn)信息等,Worker組件負(fù)責(zé)維護(hù)緩存數(shù)據(jù)信息。當(dāng)運(yùn)行Master組件的容器重啟或重新調(diào)度時(shí),Master組件緩存的數(shù)據(jù)元信息和掛載點(diǎn)信息可能會(huì)丟失,從而導(dǎo)致JindoFS分布式緩存集群不可用。您可以通過配置Fluid JindoRuntime,使JindoFS Master組件將元信息持久化存儲(chǔ)于Kubernetes存儲(chǔ)卷中,提高JindoFS分布式緩存集群的可用性。
前提條件
已創(chuàng)建ACK集群Pro版,且集群版本為1.18及以上。具體操作,請(qǐng)參見創(chuàng)建ACK Pro版集群。
已安裝云原生AI套件并部署ack-fluid組件,且ack-fluid版本為1.0.5及以上。具體操作,請(qǐng)參見安裝云原生AI套件。
重要若您已安裝開源Fluid,請(qǐng)卸載后再部署ack-fluid組件。
已通過kubectl連接Kubernetes集群。具體操作,請(qǐng)參見獲取集群KubeConfig并通過kubectl工具連接集群。
已創(chuàng)建OSS存儲(chǔ)空間(Bucket)并上傳文件,且為RAM用戶授予訪問該Bucket的權(quán)限。具體操作,請(qǐng)參見創(chuàng)建存儲(chǔ)空間和添加Bucket Policy。
步驟一:準(zhǔn)備云盤存儲(chǔ)卷
創(chuàng)建
pvc.yaml
文件,配置云盤存儲(chǔ)卷PVC。說明如果您需要為云盤存儲(chǔ)卷PVC配置更多參數(shù),請(qǐng)參見通過kubectl命令行使用云盤動(dòng)態(tài)存儲(chǔ)卷。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: demo-jindo-master-meta spec: accessModes: - ReadWriteOnce storageClassName: alicloud-disk-topology-alltype resources: requests: storage: 30Gi
執(zhí)行以下命令,創(chuàng)建PVC資源。
kubectl create -f pvc.yaml
預(yù)期輸出:
persistentvolumeclaim/demo-jindo-master-meta created
步驟二:創(chuàng)建Dataset和JindoRuntime
創(chuàng)建
secret.yaml
文件,保存用于RAM訪問OSS Bucket的AccessKeyId(AK)和AccessKeySecret(SK)。apiVersion: v1 kind: Secret metadata: name: access-key stringData: fs.oss.accessKeyId: ****** # 請(qǐng)輸入AccessKeyId。 fs.oss.accessKeySecret: ****** # 請(qǐng)輸入AccessKeySecret。
執(zhí)行以下命令,創(chuàng)建Secret資源。
kubectl create -f secret.yaml
預(yù)期輸出:
secret/access-key created
創(chuàng)建
dataset.yaml
文件,配置Fluid Dataset資源和Fluid JindoRuntime資源的參數(shù)信息。apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: demo spec: mounts: - mountPoint: oss://<OSS_BUCKET>/<BUCKET_DIR> name: demo path: / options: fs.oss.endpoint: <OSS_BUCKET_ENDPOINT> encryptOptions: - name: fs.oss.accessKeyId valueFrom: secretKeyRef: name: access-key key: fs.oss.accessKeyId - name: fs.oss.accessKeySecret valueFrom: secretKeyRef: name: access-key key: fs.oss.accessKeySecret --- apiVersion: data.fluid.io/v1alpha1 kind: JindoRuntime metadata: name: demo spec: replicas: 2 volumes: - name: meta-vol persistentVolumeClaim: claimName: demo-jindo-master-meta master: volumeMounts: - name: meta-vol mountPath: /root/jindofsx-meta properties: namespace.meta-dir: "/root/jindofsx-meta" tieredstore: levels: - mediumtype: MEM path: /dev/shm volumeType: emptyDir quota: 12Gi high: "0.99" low: "0.99"
與本功能相關(guān)的關(guān)鍵參數(shù)說明如下:
參數(shù)
說明
JindoRuntime
volumes
配置JindoRuntime各組件可掛載的存儲(chǔ)卷信息。您需要選擇步驟一:準(zhǔn)備云盤存儲(chǔ)卷中創(chuàng)建的云盤存儲(chǔ)卷PVC。
master.volumeMounts
配置運(yùn)行JindoRuntime Master組件的容器所掛載的存儲(chǔ)卷和掛載路徑。
master.properties
配置JindoRuntime Master組件的詳細(xì)參數(shù)信息。為啟用Master組件的元信息持久化存儲(chǔ)能力,需指定
namespace.meta-dir: <path>
,其中<path>
為master.volumeMounts
中指定的存儲(chǔ)卷掛載路徑(即mountPath
參數(shù)值)。執(zhí)行以下命令,創(chuàng)建JindoRuntime和Dataset。
kubectl create -f dataset.yaml
預(yù)期輸出:
dataset.data.fluid.io/demo created jindoruntime.data.fluid.io/demo created
執(zhí)行以下命令,查看Dataset部署情況。
kubectl get dataset
預(yù)期輸出:
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE demo 531.89MiB 0.00B 24.00GiB 0.0% Bound 5m35s
PHASE
字段變?yōu)?code data-tag="code" code-type="xCode" class="code">Bound狀態(tài),表明Dataset和JindoRuntime已部署成功。Fluid將自動(dòng)為Bound
狀態(tài)的Dataset創(chuàng)建同名PVC,應(yīng)用Pod可通過掛載該P(yáng)VC,訪問Dataset掛載點(diǎn)(Dataset.spec.mountPoint
)中指定的數(shù)據(jù)。
步驟三:驗(yàn)證Master組件狀態(tài)持久化存儲(chǔ)功能
在本步驟中,通過對(duì)節(jié)點(diǎn)添加污點(diǎn)模擬運(yùn)行Master組件的Pod重新調(diào)度的場景,以驗(yàn)證本功能是否正確配置并生效。
創(chuàng)建
pod.yaml
文件,用于掛載PVC。apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: registry.openanolis.cn/openanolis/nginx:1.14.1-8.6 volumeMounts: - mountPath: /data name: data-vol volumes: - name: data-vol persistentVolumeClaim: claimName: demo
執(zhí)行以下命令,在Kubernetes集群中部署Nginx應(yīng)用。
kubectl create -f pod.yaml
預(yù)期輸出:
pod/nginx created
執(zhí)行以下命令,從應(yīng)用Pod中訪問數(shù)據(jù)。
kubectl exec -it nginx -- ls /data
預(yù)期輸出Dataset掛載點(diǎn)(
Dataset.spec.mountPoint
)中指定的OSS文件系統(tǒng)中的數(shù)據(jù)。執(zhí)行以下命令,獲取運(yùn)行JindoFS Master組件的Pod所在的節(jié)點(diǎn)。
master_node=$(kubectl get pod -o wide | awk '/demo-jindofs-master-0/ {print $7}')
執(zhí)行以下命令,通過污點(diǎn)阻止新的Pod調(diào)度至步驟4中查詢的節(jié)點(diǎn)。
kubectl taint node $master_node test-jindofs-master=reschedule:NoSchedule
預(yù)期輸出:
node/cn-beijing.192.168.xx.xx tainted
執(zhí)行以下命令,刪除并自動(dòng)重建JindoFS Master組件的Pod。
kubectl delete pod demo-jindofs-master-0
預(yù)期輸出:
pod "demo-jindofs-master-0" deleted
此時(shí),重建的Pod(
demo-jindofs-master-0
)將會(huì)被調(diào)度到集群中的另一個(gè)節(jié)點(diǎn)上。但是由于運(yùn)行JindoFS Master組件的Pod掛載了存儲(chǔ)卷,因此Master組件可以通過存儲(chǔ)卷恢復(fù)到Pod被重建前的狀態(tài)。說明由于云盤存儲(chǔ)卷不支持跨可用區(qū)掛載,因此在使用云盤作為持久化存儲(chǔ)時(shí),重建的Pod只能被調(diào)度到同可用區(qū)的其他節(jié)點(diǎn)上。請(qǐng)確保集群中至少包含另一個(gè)與重建前Pod同可用區(qū)的ECS節(jié)點(diǎn)。
執(zhí)行以下命令,重建應(yīng)用Pod。
kubectl delete -f pod.yaml && kubectl create -f pod.yaml
預(yù)期輸出:
pod "nginx" deleted pod/nginx created
執(zhí)行以下命令,從重建后的應(yīng)用Pod中再次訪問數(shù)據(jù)。
kubectl exec -it nginx -- ls /data
預(yù)期輸出Dataset掛載點(diǎn)(
Dataset.spec.mountPoint
)中指定的OSS文件系統(tǒng)中的數(shù)據(jù)。
步驟四:環(huán)境清理
執(zhí)行以下命令,刪除Pod。
kubectl delete -f pod.yaml
預(yù)期輸出:
pod "nginx" deleted
執(zhí)行以下命令,刪除為節(jié)點(diǎn)添加的污點(diǎn)。
kubectl taint node $master_node test-jindofs-master-
預(yù)期輸出:
node/cn-beijing.192.168.xx.xx untainted
(可選)依次執(zhí)行以下命令,清理云盤存儲(chǔ)卷資源。
重要本示例中創(chuàng)建的云盤存儲(chǔ)卷將持續(xù)產(chǎn)生費(fèi)用。如果您不再需要使用該數(shù)據(jù)加速功能,請(qǐng)及時(shí)清理環(huán)境。關(guān)于云盤存儲(chǔ)卷產(chǎn)生的費(fèi)用,請(qǐng)參見云盤存儲(chǔ)卷概述。
清理前,確保沒有正在使用該數(shù)據(jù)集并進(jìn)行I/O操作的應(yīng)用Pod。
kubectl delete -f dataset.yaml kubectl delete -f pvc.yaml