به نظرتان بهترین روش برای مدیریت و ذخیره فایلهای پیکربندی و اطلاعات مربوط به آن چیست؟ مطمئنا در محیطهای مختلف این کار بهصورتهای متفاوتی انجام خواهد شد. در کوبرنتیز برای انجام چنین کاری از ConfigMap استفاده میشود.
ConfigMap در کوبرنتیز وظیفه نگهداری و مدیریت دادههای مربوط به پیکربندی پادها (Pod) را برعهده دارد. کانفیگمپها، شامل مجموعهای از API Object هستند که دادهها را بهصورت Key-Value ذخیره میکنند.
در این مطلب از وبلاگ همروش قصد داریم با چیستی ConfigMap و مزایا آن آشنا شویم و همچنین نحوه استفادهپذیری آن را مشاهده کنیم.
ConfigMap چیست؟
در دنیای کوبرنتیز، برای ذخیره اطلاعات پیکربندی غیرحساس از ConfigMap استفاده میشود. کانفیگمپ یک API Object استاندارد است که اطلاعات پیکربندی اپلیکیشن را بهصورت Key-Value ذخیره میکند. از این جهت میتوان آن را بهعنوان دیتابیسی برای فایلهای پیکربندی پروژه نیز در نظر بگیرید.
هدف از ایجاد ConfigMap در کوبرنتیز این است که بتوانیم فایلها و اطلاعات پیکربندی را در جایی جداگانه از کدها و کانتینر ایمیجها ذخیره کنیم.
ConfigMap در داخل کلاستر کوبرنتیز ذخیره میشود. از این طریق، پادها میتوانند به اطلاعات مورد نیازشان دسترسی پیدا کنند.
نوع محتوایی که در ConfigMap قرار میگیرد میتواند دو حالت باشد: String یا Base64-Encoded Binary Data. همچنین هر آبجکت در ساختار ConfigMap باید زیر یک مگابایت حجم داشته باشد. برای اطلاعات بزرگتر و مدیریت آنها، نیاز است که پیکربندیهایتان را در چند ConfigMap ذخیره کنید. همچنین یک رویکرد دیگر برای انجام این کار، استفاده از یک دیتابیس Key-Value جداگانه است.
این نکته را هم در نظر داشته باشید که از آنجایی که ConfigMap بخشی از ساختار Kubernetes API است، شما میتوانید مقادیر داخل آن را بدون نیاز به دیپلوی مجدد پادهای اپلیکیشن، بروزرسانی کنید.
چرا به ConfigMap نیاز داریم؟
دلیل اصلی استفاده از ConfigMap ذخیره اطلاعات مربوط به پیکربندی اپلیکیشن در جایی غیر از محیط کدنویسی است. از آنجایی که این اطلاعات کمتر تغییر پیدا میکنند و نیاز است که در یک محیط نسبتا امنتری ذخیره شوند، ما به ConfigMap نیاز داریم.
یک مثال از این اطلاعات، Database Connection است. با ذخیره اطلاعات مورد نیاز برای دسترسی به دیتابیس در یک مکان ثابت، اپلیکیشن شما میتواند بهصورت یکپارچه به آن دسترسی داشته و همچنین در مکان نسبتا امنتری ذخیره شود.
در ادامه به برخی از اصلیترین کاربردها و مزایا ConfigMaps اشاره میکنیم:
- جداسازی پیکربندی از کد اصلی اپلیکیشن: کانفیگمپ اجازه میدهد تا پیکربندیهای برنامه جدا از کد اصلی برنامه نگهداری شوند. این امر باعث میشود تا تغییرات پیکربندی بدون نیاز به تغییر کد اصلی برنامه قابل اجرا باشند و همچنین امنیت آنها افزایش پیدا کند.
- سهولت در مدیریت و بهروزرسانیها: با استفاده از ConfigMap، میتوانیم پیکربندیها را بهراحتی بهروزرسانی کرده و آنها را تغییر دهیم. این فرایند بدون اینکه نیاز به ایجاد تغییرات در Container Image و یا استقرار مجدد کانتینرها باشد، انجام خواهد شد.
- قابلیت استفاده مجدد: ConfigMap قابلیت استفاده مجدد در چندین پاد (Pod) یا سرویس مختلف را فراهم میآورد. این امر به کاهش تکرار و افزایش کارایی کمک میکند.
- مدیریت متمرکز: با استفاده از ConfigMap همه پیکربندیها در یک مکان متمرکز قرار میگیرند، از این جهت تیمهای مختلف بهراحتی میتوانند از یک مخزن مشترک و یکپارچه، به پیکربندیهای مورد نیاز برای اجرای برنامهها در محیط کوبرنتیز دسترسی پیدا کنند.
- امنیت: با استفاده از ConfigMap، میتوان اطلاعات حساس یا محرمانه را از پیکربندیهای عمومی جدا نگه داشت، که این امر به بهبود امنیت کمک میکند. البته برای اطلاعات حساستر، استفاده از Secrets در کوبرنتیز توصیه میشود.
- انعطافپذیری در استقرار: در آخر ConfigMapها این امکان را میدهند تا پیکربندیهای مختلف برای محیطهای متفاوت (مثلاً توسعه، آزمایش و پروداکشن) بهراحتی قابل تنظیم و استفاده باشند.
ConfigMap چگونه کار میکند؟
برای درک کلی نحوه کارکرد ConfigMap ما نیاز داریم که با سه مرحله اصلی این عملیات آشنا شویم. همچنین برای درک بهتر، یک انیمیشن ساده را در ادامه اضافه میکنیم.
- مرحله اول: یک ConfigMap جدید را ایجاد میکنید.
- مرحله دوم: ConfigMap مورد نظر را به کلاستر کوبرنتیز اضافه میکنید
- مرحله سوم: در نهایت کانتینرها در پاد به ConfigMap مراجعه کرده و از مقادیر داخل آن استفاده میکنند.
پیادهسازی ConfigMaps
از آنجایی که ConfigMap بخشی از ساختار کوبرنتیز است، شما میتوانید با استفاده از فایل YAML آن را تعریف و پیادهسازی کنید.
برای انجام این کار نیاز است که اطلاعات پیکربندیتان را بهصورت key:value در فیلد data وارد کنید. در زیر مثالی از این حالت را مشاهده خواهید کرد:
apiVersion: v1
kind: ConfigMap
metadata:
name: test-config
data:
database_host: "192.168.1.12"
debug_mode: "1"
log_level: "verbose"
همانطور که مشاهده میکنید، سه مشخصه اصلی این پیکربندی شامل database_host
،debug_mode
و log_level
میشوند.
این کد را در فایلی با عنوان test-config.yaml
ذخیره کرده و بعد دستور زیر را اجرا کنید.
kubectl apply -f test-config.yaml
با استفاده از kubectl
میتوانید ConfigMap مورد نظر را ایجاد کرده و آن را روی کلاستر اعمال کنید.
همانطور که پیشتر گفتیم ConfigMap از دو نوع حالت String و Base64-Encoded پشتیبانی میکند، در نتیجه از قالبهای دادهای دیگر استفاده نکنید.
لیست کردن ConfigMapهای ایجاد شده
برای مشاهده لیستی از کانفیگمپهای ایجاد شده میتوانید دستور زیر را وارد کنید.
kubectl get configmaps
این دستور خروجی شبیه به حالت زیر را به شما نشان خواهد داد:
NAME DATA AGE
test-config 3 83m
همچنین برای مشاهده مقادیر key:value هر کدام از ConfigMapها میتوانید از دستور زیر استفاده کنید:
kubectl describe configmap test-config
خروجی این دستور بهصورت زیر خواهد بود:
Data
====
database_host:
----
192.168.1.12
debug_mode:
----
1
log_level:
----
verbose
BinaryData
====
Events: <none>
تفاوت میان ConfigMap و Secret
در محیط Kubernetes، هم ConfigMap و هم Secret برای ذخیرهسازی اطلاعات، مورد استفاده قرار میگیرند، اما هدف و کاربرد آنها متفاوت است:
- ConfigMap
- هدف: استفاده برای ذخیرهسازی پارامترهای پیکربندی که به صورت عمومی قابل دسترسی هستند.
- استفاده: برای ذخیرهسازی تنظیمات، پارامترهای پیکربندی و متغیرهای محیطی که نیازی به رمزنگاری ندارند.
- امنیت: اطلاعات در ConfigMap به صورت متن ساده ذخیره میشوند و از نظر امنیتی محفاظت نمیشوند. بنابراین نباید از آنها برای ذخیره اطلاعات حساس استفاده کرد.
- Secret
- هدف: ذخیرهسازی اطلاعات حساس مانند رمزهای عبور، کلیدهای خصوصی، یا اطلاعات دسترسی.
- استفاده: برای ذخیره اطلاعاتی که نیاز به حفاظت دارند و نباید به راحتی قابل دسترسی باشند.
- امنیت: اطلاعات در Secret به صورت رمزنگاری شده ذخیره میشوند (هرچند رمزنگاری بسیار پایهای است و نباید به عنوان تنها روش امنیتی به کار رود) و دسترسی به آنها باید به دقت کنترل شود.
به طور خلاصه، ConfigMap برای پیکربندیهای غیرحساس و Secret برای اطلاعات حساس استفاده میشود. انتخاب میان این دو بستگی به نوع دادهها و نیازهای امنیتی دارد.
در پایان
ConfigMap یکی از بخشهای کلیدی در محیط کوبرنتیز به شمار میرود و برای مدیریت و نگهداری از پیکربندیهای مربوط به اپلیکیشن بسیار ضروری است. به همین دلیل در این مطلب از وبلاگ همروش سعی کردیم تا شما را با چیستی، مزایا، شیوه کارکرد و همچنین پیادهسازی ConfigMapها آشنا شویم.