Kubernetes ConfigMap
17 دقیقه زمان برای خواندن این مطلب نیاز است.
فهرست مطالب
- Kubernetes ConfigMap چیست؟
- چرا به Kubernetes ConfigMap نیاز داریم؟
- روشهای ایجاد Kubernetes ConfigMap
- نحوه مصرف Kubernetes ConfigMap در پادها
- بهروزرسانی ConfigMap و تأثیر بر پادهای در حال اجرا
- ConfigMap غیرقابل تغییر (Immutable ConfigMap)
- محدودیتها و نکات مهم
- بهترین روشها (Best Practices) برای کار با Kubernetes ConfigMap
- مثال عملی: یک اپلیکیشن Node.js با ConfigMap
- اشکالزدایی و عیبیابی
- نظارت و مانیتورینگ ConfigMap
- ادغام با Helm (مدیریت پکیج)
- تفاوت ConfigMap با Secret (مرور سریع)
- آینده ConfigMap در Kubernetes
- نتیجهگیری نهایی
- سوالات متداول (FAQ)
در دنیای مدرن اپلیکیشنهای کانتینری، جداسازی کد از پیکربندی (Configuration) یکی از اصول کلیدی برای ایجاد برنامههای قابل حمل، مقیاسپذیر و قابل نگهداری است. تصور کنید یک اپلیکیشن ساده دارید که باید در محیط توسعه، آزمایش، و تولید با پارامترهای متفاوتی مانند آدرس پایگاه داده، کلیدهای API، یا سطح لاگ اجرا شود. بدون ابزار مناسب، مجبورید تصاویر جداگانه بسازید یا متغیرهای محیطی را به صورت دستی مدیریت کنید. اینجاست که Kubernetes ConfigMap وارد میدان میشود. Kubernetes ConfigMap یک منبع (resource) استاندارد در Kubernetes است که به شما امکان میدهد دادههای پیکربندی غیرحساس (non-sensitive) را به صورت کلید-مقدار (key-value) ذخیره کرده و سپس در قالب متغیرهای محیطی، فایلهای درون حجم (volume) یا آرگومانهای خط فرمان در اختیار پادها (Pods) قرار دهید. در این مقاله از دانا پدیا، به صورت کاملاً تخصصی و جامع به بررسی Kubernetes ConfigMap میپردازیم. اگر شما یک مدیر زیرساخت، توسعهدهنده DevOps، یا هر فردی هستید که با Kubernetes کار میکند، این مطلب دقیقاً همان چیزی است که برای درک عمیق Kubernetes ConfigMap و استفاده مؤثر از آن در پروژههای واقعی نیاز دارید.
Kubernetes ConfigMap در نسخه ۱.۲ به Kubernetes اضافه شد و از آن زمان به یکی از اجزای اصلی مدیریت پیکربندی در کلاسترهای Kubernetes تبدیل شده است. با استفاده از ConfigMap میتوانید پیکربندی اپلیکیشن خود را از تصویر کانتینر جدا کنید، بدون نیاز به بازسازی تصویر، تنظیمات را تغییر دهید و به روزرسانیهای پیکربندی را به شیوهای اعلامی مدیریت نمایید. ConfigMap برای دادههای غیرحساس طراحی شده است. اگر دادههای شما حساس هستند (مانند رمز عبور، توکنها، کلیدهای API خصوصی)، باید از Secret استفاده کنید.
اهمیت Kubernetes ConfigMap زمانی بیشتر نمایان میشود که با میکروسرویسهای متعدد، محیطهای چندگانه (dev/staging/prod) و استقرارهای مکرر سر و کار دارید. به جای اینکه در هر استقرار تصاویر جدید بسازید یا با docker run متغیرهای محیطی را جفت کنید، یک ConfigMap تعریف میکنید و پادها به صورت خودکار پیکربندی صحیح را دریافت میکنند. این کار باعث افزایش قابلیت حمل (portability) و کاهش خطاهای انسانی میشود.
در این مقاله از دانا پدیـا، ابتدا به مفاهیم پایه و نحوه ایجاد Kubernetes ConfigMap (به دو روش دستوری و اعلامی) میپردازیم. سپس روشهای مصرف ConfigMap در پادها (متغیرهای محیطی، volume، args) را بررسی کرده و به موضوعات پیشرفته مانند بهروزرسانی پویا (dynamic update)، غیرقابل تغییر کردن (immutable ConfigMap)، محدودیتهای حجمی، و بهترین روشها میپردازیم. در ادامه، نحوه عیبیابی، نظارت، و ادغام با Helm را پوشش خواهیم داد. همچنین با مثالهای واقعی از یک اپلیکیشن Node.js و یک پایگاه داده نشان میدهیم که چگونه از Kubernetes ConfigMap در عمل استفاده کنید. در انتها نیز به سوالات متداول پاسخ میدهیم. هدف ما ارائه یک مرجع کامل و سئوشده است که هم برای مبتدیان و هم برای حرفهایها مفید باشد.
برنامه نویسی بدون کد (No-Code) در مقابل Low-

Kubernetes ConfigMap چیست؟
Kubernetes ConfigMap یک شیء API در Kubernetes است که برای ذخیرهسازی دادههای غیرحساس در قالب جفتهای کلید-مقدار استفاده میشود. این دادهها میتوانند شامل فایلهای پیکربندی (مانند nginx.conf، application.properties)، متغیرهای محیطی، آرگومانهای خط فرمان، یا هر رشته متنی دیگر باشند. ConfigMap به پادها (Pods) اجازه میدهد تا این دادهها را مصرف کنند، بدون اینکه پاد نیاز به دانستن جزئیات مبدا داشته باشد.
یک Kubernetes ConfigMap معمولاً در یک Namespace خاص ایجاد میشود و فقط پادهای همان Namespace میتوانند به آن دسترسی داشته باشند (مگر اینکه از RBAC برای دسترسی بین Namespace استفاده کنید که معمولاً توصیه نمیشود). دادههای ConfigMap به صورت متنی (UTF-8) ذخیره میشوند و حداکثر اندازه هر ConfigMap به طور پیشفرض ۱ مگابایت است (قابل افزایش با تنظیم --max-request-bytes در kube-apiserver).
تفاوت اصلی Kubernetes ConfigMap با Secret در این است که دادههای ConfigMap رمزنگاری نمیشوند (فقط در etcd به صورت base64 ذخیره میشوند، نه رمز) و برای اطلاعات حساس مناسب نیستند. همچنین Secretها دارای مکانیزمهای اضافی مانند رمزنگاری در حالت استراحت (encryption at rest) هستند.
چرا به Kubernetes ConfigMap نیاز داریم؟
دلایل اصلی استفاده از Kubernetes ConfigMap عبارتند از:
- جداسازی پیکربندی از کد (Separation of Concerns) : قانون Twelve-Factor App میگوید پیکربندی باید در محیط ذخیره شود، نه در کد. ConfigMap این قانون را پیادهسازی میکند.
- قابلیت استفاده مجدد (Reusability) : یک ConfigMap واحد میتواند توسط چندین پاد مختلف استفاده شود.
- تغییر پیکربندی بدون بازسازی تصویر : وقتی نیاز به تغییر متغیر محیطی یا فایل کانفیگ دارید، فقط ConfigMap را بهروز میکنید و پادها را مجدداً راهاندازی میکنید (یا در صورت پشتیبانی از بهروزرسانی پویا، بدون نیاز به restart).
- مدیریت متمرکز پیکربندی : تمام پیکربندیهای اپلیکیشن در یک جای مشخص (مانیفستهای YAML) ذخیره میشوند و در سیستم کنترل نسخه (Git) قرار میگیرند.
- پشتیبانی از محیطهای چندگانه : میتوانید ConfigMapهای جداگانه برای محیط توسعه، staging و تولید داشته باشید و فقط با تغییر Namespace یا مقادیر، پادها تنظیمات مناسب را دریافت کنند.
روشهای ایجاد Kubernetes ConfigMap
شما میتوانید Kubernetes ConfigMap را به دو روش اصلی ایجاد کنید: دستوری (imperative) با استفاده از خط فرمان kubectl، یا اعلامی (declarative) با نوشتن فایل YAML.
۱. ایجاد دستوری (Imperative)
مزیت روش دستوری سرعت در محیط توسعه و آزمایش است. مثالها:
bash
# از مقادیر literal (به صورت key-value) kubectl create configmap app-config --from-literal=DB_HOST=postgres.default.svc --from-literal=LOG_LEVEL=info # از یک فایل (محتوای فایل به عنوان مقدار یک کلید) kubectl create configmap app-config-file --from-file=./app.properties # از یک دایرکتوری (هر فایل یک کلید میشود) kubectl create configmap app-config-dir --from-file=./configs/ # با استفاده از env-file (فایل حاوی متغیرهای محیطی) kubectl create configmap app-env --from-env-file=config.env
پس از ایجاد، میتوانید با kubectl get configmap و kubectl describe configmap آن را ببینید.
۲. ایجاد اعلامی (Declarative) با فایل YAML
روش اعلامی برای محیطهای تولید و مدیریت نسخه (GitOps) توصیه میشود. یک فایل configmap.yaml به صورت زیر تعریف کنید:
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
namespace: default
data:
DB_HOST: "postgres.default.svc"
LOG_LEVEL: "info"
app.properties: |
server.port=8080
cache.ttl=300
سپس با kubectl apply -f configmap.yaml آن را اعمال کنید.
همچنین میتوانید از data (برای رشتههای ساده) و binaryData (برای دادههای باینری، مانند کلیدهای SSH که base64 رمزگذاری شدهاند) استفاده کنید.
نحوه مصرف Kubernetes ConfigMap در پادها
بعد از ایجاد ConfigMap، باید آن را درون پاد خود مصرف کنید. سه روش اصلی وجود دارد:
۱. متغیرهای محیطی (Environment Variables)
با استفاده از valueFrom و configMapKeyRef میتوانید یک کلید خاص از ConfigMap را به عنوان متغیر محیطی به کانتینر تزریق کنید:
yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-app
image: my-image:latest
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: app-config
key: DB_HOST
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: app-config
key: LOG_LEVEL
همچنین میتوانید با استفاده از envFrom تمام کلیدهای یک ConfigMap را به عنوان متغیر محیطی تزریق کنید (توجه: نام کلیدها باید معتبر برای متغیر محیطی باشند):
yaml
envFrom:
- configMapRef:
name: app-config
۲. حجم (Volume) فایل
در این روش، ConfigMap به صورت یک دایرکتوری با فایلهایی برابر با کلیدهای ConfigMap در مسیر مشخصی mount میشود. هر فایل شامل مقدار کلید مربوطه است:
yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-app
image: my-image:latest
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: app-config
پس از mount، فایل /etc/config/DB_HOST شامل مقدار postgres.default.svc و فایل /etc/config/LOG_LEVEL شامل info خواهد بود. اگر فایل چندخطی مانند app.properties داشته باشید، کامل mount میشود.
برای تغییر مجوز فایلها یا mount کردن فقط چند کلید خاص میتوانید از items استفاده کنید:
yaml
configMap:
name: app-config
items:
- key: app.properties
path: application.properties
mode: 0644
۳. آرگومانهای خط فرمان
میتوانید از متغیرهای محیطی که از ConfigMap گرفته شدهاند در args استفاده کنید (ابتدا متغیر محیطی تعریف کنید سپس در args ارجاع دهید):
yaml
env:
- name: DB_PORT
valueFrom:
configMapKeyRef:
name: app-config
key: DB_PORT
args: ["--port", "$(DB_PORT)"]
توجه: این روش فقط در صورتی کار میکند که متغیر محیطی قبلاً تعریف شده باشد.
بهروزرسانی ConfigMap و تأثیر بر پادهای در حال اجرا
یکی از سوالات متداول در مورد Kubernetes ConfigMap این است: «اگر ConfigMap را بهروز کنم، پادهای در حال اجرا تغییر را میبینند؟»
پاسخ بستگی به روش مصرف دارد:
- متغیرهای محیطی: خیر، تغییر ConfigMap بر متغیرهای محیطی پادهای در حال اجرا اثری ندارد. پاد باید مجدداً ایجاد شود (مثلاً با rolling update) تا متغیرهای جدید را دریافت کند.
- حجم فایل (Volume): بله، اگر پاد از volume استفاده کند، Kubernetes به طور خودکار فایلهای درون volume را با مقدار جدید بهروز میکند (با کمی تأخیر، معمولاً کمتر از یک دقیقه). خود پاد نیازی به restart ندارد. با این حال، اپلیکیشن درون کانتینر باید قابلیت تشخیص تغییر فایل (مانند inotify یا polling) را داشته باشد تا تنظیمات جدید را بارگیری کند.
- آرگومانهای خط فرمان: خیر، آرگومانها در زمان شروع پاد ثابت میشوند و تغییر نمیکنند.
بنابراین اگر نیاز به بهروزرسانی پویا دارید، از volume mount استفاده کنید و اپلیکیشن خود را طوری طراحی کنید که فایلهای پیکربندی را دوباره بخواند.
ConfigMap غیرقابل تغییر (Immutable ConfigMap)
از Kubernetes 1.19 به بعد، میتوانید ConfigMap را غیرقابل تغییر (immutable) علامتگذاری کنید. پس از تنظیم immutable: true، هیچ تغییری در آن ConfigMap مجاز نیست (حتی با kubectl edit یا kubectl apply). این قابلیت مزایای زیر را دارد:
- افزایش کارایی kube-apiserver و etcd: زیرا دیگر نیاز به نظارت بر تغییرات ConfigMapهایی که انتظار تغییر ندارند نیست.
- جلوگیری از تغییرات تصادفی: در محیط تولید، امنیت بیشتری ایجاد میکند.
برای تعریف ConfigMap غیرقابل تغییر:
yaml
apiVersion: v1 kind: ConfigMap metadata: name: immutable-config immutable: true data: key: value
پس از اعمال، هرگونه تلاش برای تغییر با خطا مواجه میشود. تنها راه تغییر، حذف و ایجاد مجدد ConfigMap است (که نیازمند تغییر در Deployment و راهاندازی مجدد پادها میباشد). برای ConfigMapهایی که ثابت هستند (مانند پیکربندی پایه برنامه)، این گزینه بسیار مفید است.
محدودیتها و نکات مهم
- حداکثر اندازه: هر ConfigMap حداکثر ۱ مگابایت داده میتواند داشته باشد (قابل تنظیم). اگر به فایل پیکربندی بزرگ نیاز دارید، از PersistentVolume استفاده کنید.
- قابل مشاهده بودن در Namespace: ConfigMap فقط در Namespace خود قابل دسترسی است.
- عدم رمزنگاری: دادهها به صورت base64 در etcd ذخیره میشوند، اما رمز نیستند. برای دادههای حساس از Secret استفاده کنید.
- تغییر نام ConfigMap: پس از ایجاد، نام ConfigMap قابل تغییر نیست. باید آن را حذف و با نام جدید ایجاد کنید.
- وابستگی به ترتیب ایجاد: اگر پادی به ConfigMap ارجاع دهد و آن ConfigMap وجود نداشته باشد، پاد ایجاد نمیشود (تا زمانی که ConfigMap را ایجاد کنید، ممکن است پاد در حالت pending بماند). بهتر است ابتدا ConfigMap را ایجاد کنید.
- تأخیر در بهروزرسانی volume: ممکن است تا یک دقیقه طول بکشد تا فایلهای mount شده بهروز شوند. از قابلیت
ConfigMapPropagationآگاه باشید.
بهترین روشها (Best Practices) برای کار با Kubernetes ConfigMap
بر اساس تجربه عملی در پروژههای بزرگ، این توصیهها را دنبال کنید:
۱. ConfigMapها را در سیستم کنترل نسخه (مثلاً Git) ذخیره کنید و از GitOps (مانند ArgoCD) برای استقرار استفاده کنید.
۲. برای محیطهای مختلف از ConfigMapهای جداگانه استفاده کنید (مثلاً app-config-dev، app-config-prod) و آنها را در Namespaceهای مجزا قرار دهید.
۳. از immutable: true برای ConfigMapهایی که نباید تغییر کنند استفاده کنید (مانند پیکربندی پایه کانتینر).
۴. از ConfigMap برای ذخیره فایلهای پیکربندی حجیم (بیش از ۱ مگابایت) خودداری کنید؛ در عوض از PersistentVolume یا راهکارهای متمرکز مانند Consul استفاده کنید.
۵. اگر از volume استفاده میکنید، در اپلیکیشن خود قابلیت reload پیکربندی را پیادهسازی کنید تا تغییرات بدون restart اعمال شوند.
۶. برای متغیرهای محیطی که زیاد تغییر میکنند، بهتر است از ConfigMap استفاده نکنید (چون پادها نیاز به restart دارند). در عوض از متغیرهای محیطی مستقیم در Deployment استفاده کنید.
۷. از envFrom با احتیاط استفاده کنید، زیرا اگر کلید غیرمجاز (مانند خط تیره یا نقطه) در ConfigMap وجود داشته باشد، متغیر محیطی ایجاد نمیشود (و خطای واضحی هم نمیبینید).
۸. نام کلیدهای ConfigMap را طوری انتخاب کنید که با استاندارد متغیرهای محیطی (حروف بزرگ، زیرخط) هماهنگ باشد تا در envFrom مشکل ایجاد نشود.
۹. برای اعمال تغییرات ConfigMap در متغیرهای محیطی، از استراتژی Rolling Update استفاده کنید (مثلاً با تغییر یک annotation در Deployment، rollout جدیدی انجام دهید).
۱۰. ConfigMapهایی که حاوی دادههای چندخطی (مانند JSON یا YAML) هستند را با دقت مدیریت کنید – از نماد | در YAML استفاده کنید تا فاصلهها حفظ شود.
مثال عملی: یک اپلیکیشن Node.js با ConfigMap
فرض کنید یک اپلیکیشن Node.js (Express) دارید که از فایل config.json برای تنظیمات استفاده میکند. محتویات فایل:
json
{
"db": {
"host": "localhost",
"port": 5432
},
"logLevel": "debug"
}
ما میخواهیم این پیکربندی را با ConfigMap به کانتینر تزریق کنیم.
مرحله ۱: ایجاد ConfigMap
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: node-config
data:
config.json: |
{
"db": {
"host": "postgres-service.default.svc",
"port": 5432
},
"logLevel": "info"
}
مرحله ۲: Deployment که ConfigMap را mount میکند
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: node-app
spec:
replicas: 3
selector:
matchLabels:
app: node-app
template:
metadata:
labels:
app: node-app
spec:
containers:
- name: app
image: my-node-app:latest
volumeMounts:
- name: config
mountPath: /app/config
readOnly: true
volumes:
- name: config
configMap:
name: node-config
در کد Node.js، مسیر /app/config/config.json را بخوانید.
اشکالزدایی و عیبیابی
هنگامی که Kubernetes ConfigMap به درستی کار نمیکند، از دستورات زیر استفاده کنید:
kubectl get configmap– لیست ConfigMapها را نشان میدهد.kubectl describe configmap <name>– جزئیات و محتوای (خلاصه) را نشان میدهد.kubectl get pod <pod-name> -o yaml– بررسی کنید که ارجاعات به ConfigMap درست تنظیم شده است.- برای volumeها: داخل پاد بروید و بررسی کنید که فایلها وجود دارند:
kubectl exec -it <pod> -- ls -l /etc/configوcat /etc/config/file - برای متغیرهای محیطی:
kubectl exec <pod> -- env | grep KEY - اگر پاد در حالت
ContainerCreatingیاPendingگیر کرده است، باkubectl describe pod <pod>خطاها را ببینید. خطای رایج:configmap "xyz" not found. - لاگهای kubelet: در صورتی که mount با شکست مواجه شود، لاگهای kubelet را در node بررسی کنید (
journalctl -u kubelet).
نظارت و مانیتورینگ ConfigMap
برای مانیتورینگ تغییرات ConfigMap در کلاستر، میتوانید از ابزارهای زیر استفاده کنید:
- kube-eventer یا kubewatch برای ضبط رویدادهای ایجاد/بهروزرسانی ConfigMap.
- Prometheus با اکسپورتر kube-state-metrics: متریکهایی مانند تعداد ConfigMapها، اندازه تقریبی، و تعداد پادهای وابسته.
- Datadog یا New Relic دارای ابزارهای built-in برای ردیابی منابع Kubernetes.
ادغام با Helm (مدیریت پکیج)
در چارتهای Helm، اغلب از مقادیر (values) برای تولید ConfigMap استفاده میشود. یک الگوی رایج:
yaml
# values.yaml config: db_host: postgres.default log_level: debug
و در فایل templates/configmap.yaml:
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ include "myapp.fullname" . }}-config
data:
DB_HOST: {{ .Values.config.db_host }}
LOG_LEVEL: {{ .Values.config.log_level }}
با این کار میتوانید پیکربندی را برای محیطهای مختلف با فایلهای values متفاوت سفارشی کنید.
تفاوت ConfigMap با Secret (مرور سریع)
| ویژگی | ConfigMap | Secret |
|---|---|---|
| داده | متنی (UTF-8)، حداکثر ۱ مگابایت | باینری مجاز، حداکثر ۱ مگابایت |
| رمزنگاری در etcd | خیر (فقط base64) | بله (اختیاری، با تنظیم encryption provider) |
| مناسب برای | پیکربندی غیرحساس | رمز عبور، توکن، کلید API |
| دسترسی از طریق volume | بله | بله |
| پشتیبانی از immutable | بله (از ۱.۱۹) | بله (از ۱.۱۹) |
آینده ConfigMap در Kubernetes
با تکامل Kubernetes، انتظار میرود قابلیتهای جدیدی به ConfigMap اضافه شود، از جمله:
- پشتیبانی از فایلهای بزرگتر (با استفاده از راهکارهای خارج از etcd مانند CRDهای خاص).
- بهروزرسانی پویای متغیرهای محیطی (از طریق rolling restart خودکار پادهای مرتبط).
- بهبود امنیت با رمزنگاری پیشفرض (برای ConfigMapهایی که به عنوان sensitive علامتگذاری میشوند).
- ادغام عمیقتر با ابزارهای GitOps (مانند Flux و ArgoCD).
نتیجهگیری نهایی
در این مقاله از دانا پدیا، به طور جامع و تخصصی به بررسی Kubernetes ConfigMap پرداختیم. Kubernetes ConfigMap یک ابزار ضروری برای هر مهندس DevOps یا توسعهدهندهای است که با Kubernetes کار میکند. با استفاده از ConfigMap میتوانید پیکربندی اپلیکیشن خود را از کد جدا کنید، محیطهای چندگانه را به سادگی مدیریت نمایید و بهروزرسانیهای پیکربندی را به شیوهای اعلامی و قابل ردگیری انجام دهید.
ما روشهای ایجاد، مصرف، بهروزرسانی و بهینهسازی ConfigMap را پوشش دادیم. همچنین به محدودیتها، بهترین روشها، و مثالهای عملی اشاره کردیم. به یاد داشته باشید که ConfigMap برای دادههای غیرحساس طراحی شده است. برای دادههای حساس حتماً از Secret استفاده کنید و از تنظیمات رمزنگاری etcd غافل نشوید.
توصیه میکنیم که در پروژههای خود از Kubernetes ConfigMap به صورت گسترده استفاده کنید، اما همواره اصول Immutable و GitOps را رعایت کنید. با پیادهسازی صحیح، میتوانید زمان استقرار را کاهش دهید و کلاستری قابل اعتمادتر داشته باشید.

سوالات متداول (FAQ)
سوال ۱: آیا میتوانم یک ConfigMap را در چندین Namespace استفاده کنم؟
پاسخ: خیر، ConfigMap فقط در Namespace خودش قابل دسترسی است. اگر نیاز به اشتراک پیکربندی بین Namespaceها دارید، باید ConfigMap را در هر Namespace جداگانه ایجاد کنید (میتوانید از ابزارهایی مانند kubectl cp یا Helm با --set استفاده کنید).
سوال ۲: آیا تغییر محتویات ConfigMap باعث راهاندازی مجدد پاد میشود؟
پاسخ: نه به طور خودکار. اگر ConfigMap از طریق volume mount شده باشد، فایلها بهروز میشوند اما پاد restart نمیشود. اگر از متغیرهای محیطی استفاده میکنید، پاد باید restart شود (با kubectl rollout restart deployment).
سوال ۳: حداکثر اندازه ConfigMap چقدر است و چگونه میتوان آن را افزایش داد؟
پاسخ: مقدار پیشفرض ۱ مگابایت (۱۰۴۸۵۷۶ بایت) است. میتوانید با تنظیم --max-request-bytes در kube-apiserver (مقدار حداکثر ۱.۵ مگابایت) آن را افزایش دهید. اما بهتر است فایلهای حجیم را در volumeهای معمولی ذخیره کنید.
سوال ۴: چه اتفاقی میافتد اگر یک ConfigMap را حذف کنم در حالی که پادها به آن ارجاع دارند؟
پاسخ: پادهای در حال اجرا به کار خود ادامه میدهند (زیرا دادههای ConfigMap قبلاً در حافظه کپی شدهاند). اما اگر پادها restart شوند، دیگر نمیتوانند ConfigMap را پیدا کنند و با خطا مواجه میشوند. بنابراین قبل از حذف ConfigMap، مطمئن شوید که پادها به روز شدهاند یا وابستگی ندارند.
سوال ۵: آیا میتوانم از ConfigMap برای ذخیره اسکریپتهای bash یا فایلهای اجرایی استفاده کنم؟
پاسخ: بله، میتوانید اسکریپتها را به عنوان مقدار در ConfigMap ذخیره کرده و در volume mount کنید. سپس با command یا args در کانتینر آنها را اجرا کنید. اما به یاد داشته باشید که حجم اسکریپت نباید از ۱ مگابایت بیشتر شود.
سوال ۶: تفاوت بین ConfigMap و PersistentVolume چیست؟
پاسخ: ConfigMap برای دادههای پیکربندی کوچک و متنی طراحی شده است، در حالی که PersistentVolume برای دادههای برنامه (مانند فایلهای کاربر، پایگاه داده) با حجم زیاد و نیاز به نگهداری طولانی مدت است. ConfigMap در etcd ذخیره میشود، در حالی که PersistentVolume در فضای ذخیرهسازی خارجی (مانند EBS، NFS) قرار دارد.
سوال ۷: چگونه میتوانم یک ConfigMap را از یک فایل YAML ایجاد کنم که حاوی مقادیر چندخطی (مانند کد XML) باشد؟
پاسخ: از نماد | (literal block scalar) در YAML استفاده کنید. مثلاً:
yaml
data:
config.xml: |
<root>
<setting>value</setting>
</root>
سوال ۸: آیا میتوان ConfigMap را به عنوان منبع برای initContainer نیز استفاده کرد؟
پاسخ: بله، دقیقاً مانند کانتینر اصلی. میتوانید volumeها و متغیرهای محیطی را در initContainer نیز تعریف کنید و از همان ConfigMap استفاده کنید.
سوال ۹: در صورت استفاده از envFrom و وجود کلید تکراری، چه اتفاقی میافتد؟
پاسخ: اگر چندین ConfigMap (یا ConfigMap و Secret) کلید تکراری داشته باشند، آخرین مورد (از نظر ترتیب در لیست) مقدار را تعیین میکند. اما اگر کلید تکراری در یک ConfigMap وجود داشته باشد (غیرممکن است، زیرا کلیدها باید منحصر به فرد باشند).
سوال ۱۰: آیا Kubernetes خود از ConfigMap برای پیکربندی اجزای داخلی (مانند kube-proxy) استفاده میکند؟
پاسخ: برخی اجزای Kubernetes (مثلاً CoreDNS) از ConfigMap برای پیکربندی استفاده میکنند. اما اجزای اصلی (kube-apiserver، kubelet) معمولاً از فایلهای پیکربندی یا آرگومانهای خط فرمان استفاده میکنند، نه ConfigMap.