برنامه نویسی

Kubernetes ConfigMap

Kubernetes ConfigMap

17 دقیقه زمان برای خواندن این مطلب نیاز است.



در دنیای مدرن اپلیکیشن‌های کانتینری، جداسازی کد از پیکربندی (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 چیست؟

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) هستند.

Rust Async Programming

چرا به Kubernetes ConfigMap نیاز داریم؟

دلایل اصلی استفاده از Kubernetes ConfigMap عبارتند از:

  • جداسازی پیکربندی از کد (Separation of Concerns) : قانون Twelve-Factor App می‌گوید پیکربندی باید در محیط ذخیره شود، نه در کد. ConfigMap این قانون را پیاده‌سازی می‌کند.
  • قابلیت استفاده مجدد (Reusability) : یک ConfigMap واحد می‌تواند توسط چندین پاد مختلف استفاده شود.
  • تغییر پیکربندی بدون بازسازی تصویر : وقتی نیاز به تغییر متغیر محیطی یا فایل کانفیگ دارید، فقط ConfigMap را به‌روز می‌کنید و پادها را مجدداً راه‌اندازی می‌کنید (یا در صورت پشتیبانی از به‌روزرسانی پویا، بدون نیاز به restart).
  • مدیریت متمرکز پیکربندی : تمام پیکربندی‌های اپلیکیشن در یک جای مشخص (مانیفست‌های YAML) ذخیره می‌شوند و در سیستم کنترل نسخه (Git) قرار می‌گیرند.
  • پشتیبانی از محیط‌های چندگانه : می‌توانید ConfigMapهای جداگانه برای محیط توسعه، staging و تولید داشته باشید و فقط با تغییر Namespace یا مقادیر، پادها تنظیمات مناسب را دریافت کنند.

GraphQL Persisted Queries

روش‌های ایجاد 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 رمزگذاری شده‌اند) استفاده کنید.

React useDeferredValue

نحوه مصرف 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)"]

توجه: این روش فقط در صورتی کار می‌کند که متغیر محیطی قبلاً تعریف شده باشد.

PostgreSQL Connection Pooling

به‌روزرسانی ConfigMap و تأثیر بر پادهای در حال اجرا

یکی از سوالات متداول در مورد Kubernetes ConfigMap این است: «اگر ConfigMap را به‌روز کنم، پادهای در حال اجرا تغییر را می‌بینند؟»

پاسخ بستگی به روش مصرف دارد:

  • متغیرهای محیطی: خیر، تغییر ConfigMap بر متغیرهای محیطی پادهای در حال اجرا اثری ندارد. پاد باید مجدداً ایجاد شود (مثلاً با rolling update) تا متغیرهای جدید را دریافت کند.
  • حجم فایل (Volume): بله، اگر پاد از volume استفاده کند، Kubernetes به طور خودکار فایل‌های درون volume را با مقدار جدید به‌روز می‌کند (با کمی تأخیر، معمولاً کمتر از یک دقیقه). خود پاد نیازی به restart ندارد. با این حال، اپلیکیشن درون کانتینر باید قابلیت تشخیص تغییر فایل (مانند inotify یا polling) را داشته باشد تا تنظیمات جدید را بارگیری کند.
  • آرگومان‌های خط فرمان: خیر، آرگومان‌ها در زمان شروع پاد ثابت می‌شوند و تغییر نمی‌کنند.

بنابراین اگر نیاز به به‌روزرسانی پویا دارید، از volume mount استفاده کنید و اپلیکیشن خود را طوری طراحی کنید که فایل‌های پیکربندی را دوباره بخواند.

CSS Layers (@layer)

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هایی که ثابت هستند (مانند پیکربندی پایه برنامه)، این گزینه بسیار مفید است.

GitHub CoPilot Chat

محدودیت‌ها و نکات مهم

  • حداکثر اندازه: هر ConfigMap حداکثر ۱ مگابایت داده می‌تواند داشته باشد (قابل تنظیم). اگر به فایل پیکربندی بزرگ نیاز دارید، از PersistentVolume استفاده کنید.
  • قابل مشاهده بودن در Namespace: ConfigMap فقط در Namespace خود قابل دسترسی است.
  • عدم رمزنگاری: داده‌ها به صورت base64 در etcd ذخیره می‌شوند، اما رمز نیستند. برای داده‌های حساس از Secret استفاده کنید.
  • تغییر نام ConfigMap: پس از ایجاد، نام ConfigMap قابل تغییر نیست. باید آن را حذف و با نام جدید ایجاد کنید.
  • وابستگی به ترتیب ایجاد: اگر پادی به ConfigMap ارجاع دهد و آن ConfigMap وجود نداشته باشد، پاد ایجاد نمی‌شود (تا زمانی که ConfigMap را ایجاد کنید، ممکن است پاد در حالت pending بماند). بهتر است ابتدا ConfigMap را ایجاد کنید.
  • تأخیر در به‌روزرسانی volume: ممکن است تا یک دقیقه طول بکشد تا فایل‌های mount شده به‌روز شوند. از قابلیت ConfigMapPropagation آگاه باشید.

آموزش Django Rest Framework

بهترین روش‌ها (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 استفاده کنید تا فاصله‌ها حفظ شود.

Object.assign در جاوااسکریپت

مثال عملی: یک اپلیکیشن 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 را بخوانید.

Remix Framework چیست

اشکال‌زدایی و عیب‌یابی

هنگامی که 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 (مرور سریع)

ویژگیConfigMapSecret
دادهمتنی (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 را رعایت کنید. با پیاده‌سازی صحیح، می‌توانید زمان استقرار را کاهش دهید و کلاستری قابل اعتمادتر داشته باشید.

Kubernetes ConfigMap

سوالات متداول (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.

دیدگاهتان را بنویسید