ProHoster > وبلاگ > اداره > حجم های زودگذر با ردیابی ظرفیت ذخیره سازی: EmptyDir در استروئیدها
حجم های زودگذر با ردیابی ظرفیت ذخیره سازی: EmptyDir در استروئیدها
برخی از برنامه ها نیز نیاز به ذخیره داده دارند، اما با این واقعیت که داده ها پس از راه اندازی مجدد ذخیره نمی شوند، کاملا راحت هستند.
برای مثال، سرویسهای کش توسط RAM محدود میشوند، اما همچنین میتوانند دادههایی را که به ندرت استفاده میشوند به ذخیرهسازی کندتر از RAM منتقل کنند و تأثیر کمی بر عملکرد کلی داشته باشند. سایر برنامهها باید بدانند که ممکن است مقداری ورودی فقط خواندنی در فایلها وجود داشته باشد، مانند تنظیمات یا کلیدهای مخفی.
Kubernetes قبلاً چندین نوع دارد حجم های زودگذر، اما عملکرد آنها محدود به آنچه در K8s پیاده سازی شده است.
زودگذر مجلدات CSI به Kubernetes اجازه داد تا با درایورهای CSI توسعه یابد تا از حجم های محلی سبک پشتیبانی کند. به این ترتیب امکان استفاده وجود دارد ساختارهای دلخواه: تنظیمات، اسرار، داده های شناسایی، متغیرها و غیره. درایورهای CSI باید برای پشتیبانی از این ویژگی Kubernetes اصلاح شوند، زیرا فرض بر این است که درایورهای استاندارد معمولی کار نمی کنند - اما فرض بر این است که چنین حجم هایی را می توان در هر گره انتخاب شده برای pod استفاده کرد.
این ممکن است برای حجم هایی که منابع میزبان قابل توجهی را مصرف می کنند یا برای ذخیره سازی که فقط در برخی از هاست ها در دسترس است مشکل باشد. به همین دلیل است که Kubernetes 1.19 دو ویژگی جدید حجم تست آلفا را معرفی می کند که از نظر مفهومی شبیه به حجم های EmptyDir هستند:
حجم های زودگذر با هدف عمومی;
ردیابی ظرفیت ذخیره سازی CSI
مزایای رویکرد جدید:
ذخیره سازی می تواند محلی باشد یا از طریق شبکه متصل شود.
حجم ها می توانند اندازه مشخصی داشته باشند که برنامه نمی تواند از آن بیشتر شود.
با هر درایور CSI کار می کند که از ارائه حجم های پایدار پشتیبانی می کند و (برای پشتیبانی از ردیابی ظرفیت) تماس را اجرا می کند GetCapacity;
بسته به درایور و تنظیمات، حجم ممکن است دارای برخی از داده های اولیه باشد.
تمام عملیات استاندارد با حجم (ایجاد یک عکس فوری، تغییر اندازه و غیره) پشتیبانی می شود.
ولوم ها را می توان با هر برنامه کاربردی کنترل کننده ای که یک ماژول یا مشخصات حجم را می پذیرد استفاده کرد.
زمانبند Kubernetes گرههای مناسب را به تنهایی انتخاب میکند، بنابراین دیگر نیازی به تهیه و پیکربندی پسوندهای زمانبندی یا اصلاح وبکهکها نیست.
گزینه های برنامه
بنابراین، حجم های زودگذر با هدف عمومی برای موارد استفاده زیر مناسب هستند:
حافظه پایدار به عنوان جایگزینی برای RAM برای memcached
آخرین نسخه های memcached پشتیبانی اضافه شد با استفاده از حافظه پایدار (Intel Optane و غیره، تقریبا مترجم) به جای رم معمولی. هنگام استقرار memcached از طریق یک کنترلکننده برنامه، میتوانید از حجمهای زودگذر عمومی برای درخواست تخصیص حجمی با اندازه معین از PMEM با استفاده از درایور CSI استفاده کنید. PMEM-CSI.
ذخیره سازی محلی LVM به عنوان یک فضای کاری
برنامههایی که با دادههای بزرگتر از RAM کار میکنند ممکن است به ذخیرهسازی محلی با اندازه یا معیارهای عملکردی نیاز داشته باشند که حجمهای معمولی EmptyDir از Kubernetes نمیتوانند ارائه کنند. مثلا برای این منظور نوشته شد TopoLVM.
دسترسی فقط خواندنی برای حجم داده ها
تخصیص یک جلد می تواند منجر به ایجاد یک جلد کامل شود زمانی که:
این حجم ها را می توان در حالت فقط خواندنی نصب کرد.
چطور کار می کند؟
حجم های زودگذر با هدف عمومی
یکی از ویژگی های کلیدی حجم های زودگذر عمومی، منبع حجم جدید است، EphemeralVolumeSource، شامل تمام فیلدها برای ایجاد یک درخواست حجم (که از لحاظ تاریخی درخواست حجم مداوم، PVC نامیده می شود). کنترلر جدید در kube-controller-manager به غلاف هایی که چنین منبع حجمی را ایجاد می کنند نگاه می کند و سپس یک PVC برای آن غلاف ها ایجاد می کند. برای درایور CSI، این درخواست مانند سایر درخواست ها به نظر می رسد، بنابراین در اینجا به پشتیبانی خاصی نیاز نیست.
تا زمانی که چنین PVC وجود دارد، می توان از آنها مانند هر درخواست دیگری در حجم استفاده کرد. به طور خاص، هنگام کپی کردن یک جلد یا ایجاد یک عکس فوری از یک جلد، می توان به آنها به عنوان منبع داده اشاره کرد. شی PVC همچنین شامل وضعیت فعلی حجم است.
نام PVC های ایجاد شده به طور خودکار از پیش تعریف شده است: آنها ترکیبی از نام غلاف و نام حجم هستند که با خط فاصله از هم جدا شده اند. نامهای از پیش تعریفشده تعامل با PVC را آسانتر میکنند، زیرا اگر نام غلاف و نام حجم را میدانید، نیازی به جستجوی آن ندارید. نکته منفی این است که ممکن است نام قبلاً در حال استفاده باشد، که توسط Kubernetes شناسایی می شود و در نتیجه پاد از شروع مسدود می شود.
برای اطمینان از حذف ولوم به همراه پاد، کنترلر از ولوم تحت مالک درخواست می کند. هنگامی که غلاف حذف می شود، مکانیسم استاندارد جمع آوری زباله کار می کند، که هم درخواست و هم حجم را حذف می کند.
درخواستها توسط درایور ذخیرهسازی از طریق مکانیسم عادی کلاس ذخیرهسازی مطابقت داده میشوند. اگرچه کلاس هایی با صحافی فوری و دیررس (معروف به WaitForFirstConsumer) پشتیبانی می شوند، برای حجم های زودگذر استفاده از آن منطقی است WaitForFirstConsumer، سپس زمانبندی می تواند هنگام انتخاب یک گره، استفاده از گره و در دسترس بودن ذخیره سازی را در نظر بگیرد. یک ویژگی جدید در اینجا ظاهر می شود.
ردیابی ظرفیت ذخیره سازی
معمولاً زمانبند اطلاعی از محل ایجاد حجم توسط درایور CSI ندارد. همچنین هیچ راهی برای زمانبندی وجود ندارد که مستقیماً با راننده تماس بگیرد تا این اطلاعات را درخواست کند. بنابراین، زمانبندی گرهها را تا زمانی که گرههایی را پیدا کند که میتوان به حجمها دسترسی پیدا کرد (صحافی دیرهنگام) یا انتخاب مکان را به طور کامل به راننده واگذار میکند (صحافی فوری).
جدید APICSIStorageCapacity، که در مرحله آلفا است، اجازه می دهد تا داده های لازم در etcd ذخیره شود تا در دسترس زمانبند باشد. بر خلاف پشتیبانی از حجمهای زودگذر عمومی، وقتی درایور را نصب میکنید، باید ردیابی ظرفیت ذخیرهسازی را فعال کنید: external-provisioner باید اطلاعات ظرفیت دریافتی از راننده را از طریق عادی منتشر کند GetCapacity.
اگر زمانبند نیاز به انتخاب گرهای برای یک پاد با حجم غیر محدود دارد که از اتصال دیرهنگام استفاده میکند، و درایور این ویژگی را در حین استقرار با تنظیم پرچم فعال کرده است. CSIDriver.storageCapacity، سپس گره هایی که ظرفیت ذخیره سازی کافی ندارند به طور خودکار دور ریخته می شوند. این هم برای حجمهای زودگذر و هم برای حجمهای دائمی با هدف عمومی کار میکند، اما برای حجمهای زودگذر CSI نه، زیرا پارامترهای آنها توسط Kubernetes قابل خواندن نیستند.
طبق معمول، حجمهای مرتبط بلافاصله قبل از برنامهریزی پادها ایجاد میشوند و محل قرارگیری آنها توسط درایور ذخیرهسازی انتخاب میشود، بنابراین هنگام پیکربندی external-provisioner بهطور پیشفرض، کلاسهای ذخیرهسازی با اتصال فوری حذف میشوند، زیرا به هر حال از این دادهها استفاده نمیشود.
از آنجایی که زمانبندی kubernetes مجبور است با اطلاعات بالقوه قدیمی کار کند، هیچ تضمینی وجود ندارد که در هر موردی که حجم ایجاد میشود، ظرفیت در دسترس باشد، اما شانس ایجاد آن بدون تلاش مجدد افزایش مییابد.
NB شما می توانید اطلاعات دقیق تر و همچنین با خیال راحت "تمرین روی پایه گربه ها" دریافت کنید و در صورت وضعیت کاملاً غیرقابل درک ، در دوره های فشرده از پشتیبانی فنی واجد شرایط دریافت کنید - پایگاه کوبرنتیس در تاریخ 28-30 سپتامبر و برای متخصصان پیشرفته تر برگزار می شود Kubernetes Mega 14 تا 16 اکتبر.
امنیت
ظرفیت CSIStorage
اشیاء CSIStorageCapacity در فضاهای نام قرار دارند؛ زمانی که هر درایور CSI را در فضای نام خود منتشر میکنید، توصیه میشود حقوق RBAC را به CSIStorageCapacity در آن فضا محدود کنید، زیرا مشخص است که دادهها از کجا میآیند. Kubernetes به هر حال این مورد را بررسی نمیکند، و معمولا درایورها در فضای نام یکسانی قرار میگیرند، بنابراین در نهایت انتظار میرود درایورها کار کنند و دادههای نادرست را منتشر نکنند (و این جایی است که کارت من خراب شد، تقریبا مترجم بر اساس یک شوخی ریش دار)
حجم های زودگذر با هدف عمومی
اگر کاربران حق ایجاد یک پاد (مستقیم یا غیرمستقیم) را داشته باشند، حتی اگر حق ایجاد درخواست روی حجم را نداشته باشند، میتوانند حجمهای زودگذر با هدف عمومی ایجاد کنند. این به این دلیل است که بررسی های مجوز RBAC به کنترل کننده ای که PVC را ایجاد می کند اعمال می شود، نه برای کاربر. این تغییر اصلی برای اضافه کردن است به حساب شما، قبل از فعال کردن این ویژگی در خوشه هایی که کاربران غیرقابل اعتماد نباید حق ایجاد حجم را داشته باشند.
مثال
جداگانه، مجزا شاخه PMEM-CSI شامل تمام تغییرات لازم برای اجرای یک خوشه Kubernetes 1.19 در داخل ماشین های مجازی QEMU با تمام ویژگی ها در مرحله آلفا است. کد راننده تغییر نکرده است، فقط استقرار تغییر کرده است.
در یک ماشین مناسب (لینوکس، یک کاربر عادی می تواند استفاده کند کارگر بارانداز، نگاه کن اینجا جزئیات) این دستورات خوشه را نمایش می دهند و درایور PMEM-CSI را نصب می کنند:
git clone --branch=kubernetes-1-19-blog-post https://github.com/intel/pmem-csi.git
cd pmem-csi
export TEST_KUBERNETES_VERSION=1.19 TEST_FEATURE_GATES=CSIStorageCapacity=true,GenericEphemeralVolume=true TEST_PMEM_REGISTRY=intel
make start && echo && test/setup-deployment.sh
بعد از اینکه همه چیز کار کرد، خروجی حاوی دستورالعمل های استفاده خواهد بود:
The test cluster is ready. Log in with [...]/pmem-csi/_work/pmem-govm/ssh.0, run
kubectl once logged in. Alternatively, use kubectl directly with the
following env variable:
KUBECONFIG=[...]/pmem-csi/_work/pmem-govm/kube.config
secret/pmem-csi-registry-secrets created
secret/pmem-csi-node-secrets created
serviceaccount/pmem-csi-controller created
...
To try out the pmem-csi driver ephemeral volumes:
cat deploy/kubernetes-1.19/pmem-app-ephemeral.yaml |
[...]/pmem-csi/_work/pmem-govm/ssh.0 kubectl create -f -
اشیاء CSIStorageCapacity قرار نیست توسط انسان خوانده شوند، بنابراین مقداری پردازش مورد نیاز است. فیلترهای قالب Golang کلاس های ذخیره سازی را نشان می دهد، این مثال نام، توپولوژی و ظرفیت را نشان می دهد:
بیایید سعی کنیم یک برنامه آزمایشی با یک حجم موقتی تک هدف کلی ایجاد کنیم. محتویات فایل pmem-app-ephemeral.yaml:
# This example Pod definition demonstrates
# how to use generic ephemeral inline volumes
# with a PMEM-CSI storage class.
kind: Pod
apiVersion: v1
metadata:
name: my-csi-app-inline-volume
spec:
containers:
- name: my-frontend
image: intel/pmem-csi-driver-test:v0.7.14
command: [ "sleep", "100000" ]
volumeMounts:
- mountPath: "/data"
name: my-csi-volume
volumes:
- name: my-csi-volume
ephemeral:
volumeClaimTemplate:
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 4Gi
storageClassName: pmem-csi-sc-late-binding
پس از ایجاد، همانطور که در دستورالعمل های بالا نشان داده شده است، اکنون یک غلاف اضافی و PVC داریم:
$ kubectl get pods/my-csi-app-inline-volume -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-csi-app-inline-volume 1/1 Running 0 6m58s 10.36.0.2 pmem-csi-pmem-govm-worker1 <none> <none>
$ kubectl get pvc/my-csi-app-inline-volume-my-csi-volume
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
my-csi-app-inline-volume-my-csi-volume Bound pvc-c11eb7ab-a4fa-46fe-b515-b366be908823 4Gi RWO pmem-csi-sc-late-binding 9m21s
اگر برنامه دیگری به بیش از 26620Mi نیاز داشته باشد، زمانبندی آن را در نظر نمی گیرد pmem-csi-pmem-govm-worker1 در هر صورت.
گام بعدی چیست؟
هر دو ویژگی هنوز در حال توسعه هستند. چندین برنامه در طول تست آلفا باز شد. پیوندهای پیشنهادی بهبود، کارهایی را که برای انتقال به مرحله بتا باید انجام شود و همچنین جایگزینهایی که قبلاً در نظر گرفته شده و رد شدهاند را مستند میکند: