Selama siklus hidup Pod aplikasi, daemon Filesystem in Userspace (FUSE) dapat mengalami crash secara tak terduga, sehingga Pod aplikasi tidak lagi dapat menggunakan sistem file FUSE untuk mengakses data. Topik ini menjelaskan cara mengaktifkan fitur pemulihan otomatis untuk titik pemasangan sistem file FUSE guna memulihkan akses ke data aplikasi tanpa harus me-restart Pod aplikasi.
Prasyarat
Kluster Container Service for Kubernetes (ACK) Pro dengan non-containerOS telah dibuat, dan versi Kubernetes kluster tersebut adalah 1.18 atau lebih baru. Untuk informasi selengkapnya, lihat Buat kluster ACK Pro.
PentingKomponen ack-fluid saat ini tidak didukung pada ContainerOS.
Suite AI cloud-native telah diinstal dan komponen ack-fluid telah dideploy.
PentingJika Anda telah menginstal Fluid open source, uninstall Fluid sebelum mendeploy komponen ack-fluid.
Jika Anda belum menginstal suite AI cloud-native: Deploy Fluid dan aktifkan akselerasi caching data. Untuk informasi selengkapnya, lihat Deploy suite AI cloud-native.
Jika Anda telah menginstal suite AI cloud-native, buka halaman Cloud-native AI Suite di Konsol ACK dan deploy komponen ack-fluid.
Node virtual telah dideploy di kluster ACK Pro. Untuk informasi selengkapnya, lihat Jadwalkan pod ke instans kontainer elastis.
Klien kubectl telah terhubung ke kluster ACK Pro. Untuk informasi selengkapnya, lihat Hubungkan ke kluster menggunakan kubectl.
Object Storage Service (OSS) telah diaktifkan dan bucket telah dibuat. Untuk informasi selengkapnya, lihat Aktifkan OSS dan Buat bucket.
Ikhtisar
Pod aplikasi yang menggunakan dataset Fluid mengakses data dalam sistem cache terdistribusi melalui sistem file FUSE. Setiap sistem file FUSE dikaitkan dengan proses daemon FUSE yang memproses permintaan akses file ke sistem file tersebut.
Selama siklus hidup Pod aplikasi, daemon FUSE dapat mengalami crash secara tak terduga—misalnya, ketika penggunaan memorinya melebihi batas, sehingga proses tersebut dihentikan. Akibatnya, Pod aplikasi akan menerima error "Transport Endpoint is Not Connected" saat mengakses file dalam sistem file FUSE. Untuk mengatasi masalah ini, Anda biasanya harus me-restart atau membangun ulang Pod aplikasi secara manual agar akses ke sistem file FUSE dapat dipulihkan.
Fluid menyediakan fitur pemulihan otomatis untuk titik pemasangan sistem file FUSE. Dengan melakukan kueri berkala terhadap status sistem file FUSE yang dipasang ke setiap Pod aplikasi pada suatu node, Fluid memungkinkan pemulihan akses data tanpa perlu me-restart atau membangun ulang Pod tersebut.
Batasan
Proses pemulihan otomatis memiliki jeda waktu dan tidak mendukung pemulihan tanpa gangguan bagi aplikasi bisnis. Aplikasi bisnis harus mampu menoleransi kegagalan akses data dan terus mencoba hingga akses data dipulihkan.
Fitur ini hanya dapat diaktifkan untuk dataset read-only. Jika kluster berisi dataset yang dapat dibaca dan ditulis, pastikan fitur ini dinonaktifkan untuk mencegah penulisan data yang tidak diinginkan ke dataset tersebut.
Fitur ini tidak mendukung pemasangan Pod aplikasi ke klaim volume persisten (PVC) dataset dalam mode subPath.
Fitur pemulihan otomatis untuk FUSE harus diaktifkan setelah daemon FUSE di-restart secara otomatis. Daemon FUSE berjalan dalam sebuah kontainer; ketika sering mengalami crash, interval waktu Kubernetes untuk me-restart kontainer tersebut meningkat secara eksponensial, sehingga memperpanjang durasi pemulihan otomatis untuk FUSE.
Aktifkan pemulihan otomatis untuk titik pemasangan FUSE di kluster ACK
Langkah 1: Aktifkan pemulihan otomatis untuk titik pemasangan FUSE
Jalankan perintah berikut untuk mengaktifkan pemulihan otomatis untuk titik pemasangan FUSE:
kubectl get ds -n fluid-system csi-nodeplugin-fluid -oyaml | sed 's/FuseRecovery=false/FuseRecovery=true/g' | kubectl apply -f -Output yang diharapkan:
daemonset.apps/csi-nodeplugin-fluid configuredJalankan perintah berikut untuk memeriksa apakah pemulihan otomatis telah diaktifkan untuk titik pemasangan FUSE:
kubectl get ds -n fluid-system csi-nodeplugin-fluid -oyaml | grep '\- \-\-feature-gates='Jika output berikut dikembalikan, pemulihan otomatis telah diaktifkan untuk titik pemasangan FUSE:
- --feature-gates=FuseRecovery=trueLangkah 2: Buat dataset Fluid
Pada contoh ini, JindoFS dideploy untuk mempercepat akses ke OSS.
Buat file bernama secret.yaml dan salin konten berikut ke dalam file tersebut:
apiVersion: v1 kind: Secret metadata: name: mysecret stringData: fs.oss.accessKeyId: <YOUR_ACCESS_KEY_ID> fs.oss.accessKeySecret: <YOUR_ACCESS_KEY_SECRET>fs.oss.accessKeyIddanfs.oss.accessKeySecretmenentukanID AccessKeydanAccessKey Secretyang digunakan untuk mengakses OSS.Jalankan perintah berikut untuk membuat Secret:
kubectl create -f secret.yamlBuat file bernama dataset.yaml dan salin konten berikut ke dalam file tersebut:
apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: demo-dataset spec: mounts: - mountPoint: oss://<oss_bucket>/<bucket_dir> options: fs.oss.endpoint: <oss_endpoint> name: mybucket path: "/" encryptOptions: - name: fs.oss.accessKeyId valueFrom: secretKeyRef: name: mysecret key: fs.oss.accessKeyId - name: fs.oss.accessKeySecret valueFrom: secretKeyRef: name: mysecret key: fs.oss.accessKeySecret --- apiVersion: data.fluid.io/v1alpha1 kind: JindoRuntime metadata: name: demo-dataset spec: replicas: 2 tieredstore: levels: - mediumtype: MEM path: /dev/shm volumeType: emptyDir quota: 2Gi high: "0.99" low: "0.95"Tabel berikut menjelaskan parameter-parameter tersebut.
Parameter
Deskripsi
mountPoint
oss://<oss_bucket>/<bucket_dir> menentukan path ke UFS yang dipasang. Titik akhir tidak diperlukan dalam path tersebut.
fs.oss.endpoint
Titik akhir publik atau privat dari bucket OSS. Untuk informasi selengkapnya, lihat Wilayah dan titik akhir.
replicas
Jumlah worker dalam kluster JindoFS.
mediumtype
Jenis cache. Saat membuat templat JindoRuntime, JindoFS hanya mendukung salah satu jenis cache berikut: HDD, SSD, dan MEM.
path
Path penyimpanan. Anda hanya dapat menentukan satu path. Jika Anda mengatur mediumtype ke MEM, Anda harus menentukan path penyimpanan lokal untuk menyimpan data seperti log.
quota
Ukuran maksimum data yang di-cache. Satuan: GB.
high
Batas atas kapasitas penyimpanan.
low
Batas bawah kapasitas penyimpanan.
Jalankan perintah berikut untuk membuat objek Dataset dan objek JindoRuntime:
kubectl create -f dataset.yaml
Langkah 3: Buat Pod aplikasi dan pasang dataset Fluid
Pada contoh ini, dataset Fluid dipasang ke Pod NGINX dan Pod tersebut digunakan untuk mengakses data dalam dataset.
Buat file bernama app.yaml dan salin konten berikut ke dalam file tersebut:
apiVersion: v1 kind: Pod metadata: name: demo-app labels: fuse.serverful.fluid.io/inject: "true" spec: containers: - name: demo image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 volumeMounts: - mountPath: /data name: data-vol volumes: - name: data-vol persistentVolumeClaim: claimName: demo-dataset # Nilai parameter ini harus sama dengan nama Dataset.Label
fuse.serverful.fluid.io/inject=truedigunakan untuk mengaktifkan pemulihan otomatis untuk titik pemasangan FUSE Pod tersebut.Jalankan perintah berikut untuk membuat kontainer aplikasi:
kubectl create -f app.yamlJalankan perintah berikut untuk melihat status kontainer aplikasi:
kubectl get pod demo-appJika kolom STATUS kontainer tersebut adalah Running, kontainer aplikasi berhasil dijalankan.
NAME READY STATUS RESTARTS AGE demo-app 1/1 Running 0 16s
Langkah 4: Verifikasi fitur pemulihan otomatis untuk titik pemasangan FUSE
Jalankan perintah berikut untuk login ke kontainer aplikasi dan menjalankan skrip yang secara berkala mengakses metadata file. Skrip tersebut akan mencantumkan file-file dalam dataset Fluid yang dipasang setiap detik.
kubectl exec -it demo-app -- bash -c 'while true; do ls -l /data; sleep 1; done'Biarkan skrip di atas tetap berjalan di latar belakang dan jalankan perintah berikut untuk mensimulasikan crash pada komponen FUSE:
# Dapatkan node tempat demo-pod berada. demo_pod_node_name=$(kubectl get pod demo-app -ojsonpath='{.spec.nodeName}') # Dapatkan nama Pod FUSE pada node yang sama dengan demo-pod. fuse_pod_name=$(kubectl get pod --field-selector spec.nodeName=$demo_pod_node_name --selector role=jindofs-fuse,release=demo-dataset -oname) # Simulasikan crash pada Pod FUSE. kubectl exec -it $fuse_pod_name -- bash -c 'kill 1'Lihat output skrip yang dijalankan di demo-app. Jika output berikut dikembalikan, titik pemasangan FUSE berhasil dipulihkan.
... total 172 -rwxrwxr-x 1 root root 18 Jul 1 15:17 myfile -rwxrwxr-x 1 root root 154 Jul 1 17:06 myfile.txt total 172 -rwxrwxr-x 1 root root 18 Jul 1 15:17 myfile -rwxrwxr-x 1 root root 154 Jul 1 17:06 myfile.txt ls: cannot access '/data/': Transport endpoint is not connected ls: cannot access '/data/': Transport endpoint is not connected ls: cannot access '/data/': Transport endpoint is not connected ls: cannot access '/data/': Transport endpoint is not connected ls: cannot access '/data/': Transport endpoint is not connected ls: cannot access '/data/': Transport endpoint is not connected ls: cannot access '/data/': Transport endpoint is not connected ls: cannot access '/data/': Transport endpoint is not connected total 172 -rwxrwxr-x 1 root root 18 Jul 1 15:17 myfile -rwxrwxr-x 1 root root 154 Jul 1 17:06 myfile.txt total 172 -rwxrwxr-x 1 root root 18 Jul 1 15:17 myfile -rwxrwxr-x 1 root root 154 Jul 1 17:06 myfile.txt ...
Aktifkan pemulihan otomatis untuk titik pemasangan FUSE di lingkungan serverless
Anda telah membuat kluster ACK Serverless Pro yang menggunakan sistem operasi selain ContainerOS, dan versi kluster tersebut adalah 1.18 atau lebih baru. Untuk informasi selengkapnya, lihat Buat kluster ACK Serverless.
Langkah 1: Buat dataset Fluid
Pada contoh ini, JindoFS dideploy untuk mempercepat akses ke OSS.
Buat file bernama secret.yaml dan salin konten berikut ke dalam file tersebut:
apiVersion: v1 kind: Secret metadata: name: mysecret stringData: fs.oss.accessKeyId: <YOUR_ACCESS_KEY_ID> fs.oss.accessKeySecret: <YOUR_ACCESS_KEY_SECRET>fs.oss.accessKeyIddanfs.oss.accessKeySecretmenentukanID AccessKeydanAccessKey Secretyang digunakan untuk mengakses OSS.Jalankan perintah berikut untuk membuat Secret:
kubectl create -f secret.yamlBuat file bernama dataset.yaml dan salin konten berikut ke dalam file tersebut:
apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: demo-dataset spec: mounts: - mountPoint: oss://<oss_bucket>/<bucket_dir> options: fs.oss.endpoint: <oss_endpoint> name: mybucket path: "/" encryptOptions: - name: fs.oss.accessKeyId valueFrom: secretKeyRef: name: mysecret key: fs.oss.accessKeyId - name: fs.oss.accessKeySecret valueFrom: secretKeyRef: name: mysecret key: fs.oss.accessKeySecret --- apiVersion: data.fluid.io/v1alpha1 kind: JindoRuntime metadata: name: demo-dataset spec: replicas: 2 tieredstore: levels: - mediumtype: MEM path: /dev/shm volumeType: emptyDir quota: 2Gi high: "0.99" low: "0.95"Tabel berikut menjelaskan parameter-parameter tersebut.
Parameter
Deskripsi
mountPoint
oss://<oss_bucket>/<bucket_dir> menentukan path ke UFS yang dipasang. Titik akhir tidak diperlukan dalam path tersebut.
fs.oss.endpoint
Titik akhir publik atau privat dari bucket OSS. Untuk informasi selengkapnya, lihat Wilayah dan titik akhir.
replicas
Jumlah worker dalam kluster JindoFS.
mediumtype
Jenis cache. Saat membuat templat JindoRuntime, JindoFS hanya mendukung salah satu jenis cache berikut: HDD, SSD, dan MEM.
path
Path penyimpanan. Anda hanya dapat menentukan satu path. Jika Anda mengatur mediumtype ke MEM, Anda harus menentukan path penyimpanan lokal untuk menyimpan data seperti log.
quota
Ukuran maksimum data yang di-cache. Satuan: GB.
high
Batas atas kapasitas penyimpanan.
low
Batas bawah kapasitas penyimpanan.
Jalankan perintah berikut untuk membuat objek Dataset dan objek JindoRuntime:
kubectl create -f dataset.yaml
Langkah 2: Buat Pod aplikasi dan pasang dataset Fluid
Pada contoh ini, dataset Fluid dipasang ke Pod NGINX dan Pod tersebut digunakan untuk mengakses data dalam dataset.
Buat file bernama app.yaml dan salin konten berikut ke dalam file tersebut:
apiVersion: v1 kind: Pod metadata: name: demo-app labels: alibabacloud.com/fluid-sidecar-target: eci annotations: # Nonaktifkan kebijakan penjadwalan pod berbasis node virtual. alibabacloud.com/burst-resource: eci_only # Aktifkan pemulihan otomatis untuk titik pemasangan FUSE alibabacloud.com/fuse-recover-policy: auto spec: containers: - name: demo image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 volumeMounts: - mountPath: /data name: data-vol volumes: - name: data-vol persistentVolumeClaim: claimName: demo-dataset # Nilai parameter ini harus sama dengan nama Dataset.Anotasi
alibabacloud.com/fuse-recover-policy=autodigunakan untuk mengaktifkan pemulihan otomatis untuk titik pemasangan FUSE Pod tersebut. Anotasi ini hanya berlaku pada Pod aplikasi yang berjalan di lingkungan serverless.Jalankan perintah berikut untuk membuat Pod aplikasi:
kubectl create -f app.yamlJalankan perintah berikut untuk melihat status kontainer aplikasi:
kubectl get pod demo-appJika kolom STATUS kontainer tersebut adalah Running, kontainer aplikasi berhasil dijalankan.
NAME READY STATUS RESTARTS AGE demo-app 2/2 Running 0 110s
Langkah 3: Verifikasi fitur pemulihan otomatis untuk titik pemasangan FUSE
Jalankan perintah berikut untuk login ke kontainer aplikasi dan menjalankan skrip yang secara berkala mengakses metadata file. Skrip tersebut akan mencantumkan file-file dalam dataset Fluid yang dipasang setiap detik.
kubectl exec -it demo-app -c demo -- bash -c 'while true; do ls -l /data; sleep 1; done'Biarkan skrip di atas tetap berjalan di latar belakang dan jalankan perintah berikut untuk mensimulasikan crash pada komponen FUSE:
# Simulasikan crash pada Pod FUSE. kubectl exec -it demo-app -c fluid-fuse-0 -- bash -c 'kill 1'Lihat output skrip yang dijalankan di demo-app. Jika output berikut dikembalikan, titik pemasangan FUSE berhasil dipulihkan.
total 172 -rwxrwxr-x 1 root root 18 Jul 1 15:17 myfile -rwxrwxr-x 1 root root 154 Jul 1 17:06 myfile.txt total 172 -rwxrwxr-x 1 root root 18 Jul 1 15:17 myfile -rwxrwxr-x 1 root root 154 Jul 1 17:06 myfile.txt ls: cannot access '/data/demo2': Transport endpoint is not connected ls: cannot access '/data/demo2': Transport endpoint is not connected ls: cannot access '/data/demo2': Transport endpoint is not connected ls: cannot access '/data/demo2': Transport endpoint is not connected total 172 -rwxrwxr-x 1 root root 18 Jul 1 15:17 myfile -rwxrwxr-x 1 root root 154 Jul 1 17:06 myfile.txt total 172 -rwxrwxr-x 1 root root 18 Jul 1 15:17 myfile -rwxrwxr-x 1 root root 154 Jul 1 17:06 myfile.txt