سکوی ابری در واقع یک مدلی از رایانش ابری است که سرویس‌دهنده با ایجاد امکانات سخت‌افزاری و برخی ابزارها، سرعت توسعه‌ی نرم‌افزار را بالا برده و دغدغه‌ی توسعه‌دهنده را، در ارتباط با زیرساخت‌های مورد نیاز محصول، مرتفع می‌سازد.
در این مقاله به بررسی مفهوم Configmap و شیوه‌ی استفاده از آن، انواع و هم‌چنین اجزای سازنده‌ی یک Configmap و تعریف آن می‌پردازیم.

پیش‌نیازها

تنها پیش نیاز این سیستم، داشتن حساب کاربری ابر آروان و دسترسی به سکوی ابری در پنل کاربری است. برای آغاز کار، پس از ورود به‌ حساب کاربری به بخش پروفایل رفته و در سربرگ API KEYS برای خود یک API KEY جدید ساخته و آن را در جایی ذخیره کنید.
برای انجام مراحل این مقاله نیاز است که از CLI ابر آروان استفاده کنید. با استفاده از این لینک این CLI را دانلود کرده (در صورت نیاز آن را در PATH خود قرار داده) و از طریق خط فرمان لاگین کنید:

arvan login

سپس API KEY که از سایت دریافت کرده‌اید را در ادامه‌ی آن قرار دهید.

Configmap چیست؟

بسیاری از برنامه‌ها و سرویس‌ها، نیازمند تنظیماتی هستند که از راه فایل و یا متغیرهای محیطی آن‌ها را دریافت کرده و به واسطه‌ی آن‌ها پیکربندی می‌شوند. به کمک Configmap می‌توان این تنظیمات را از طریق کانتینر مستقل کرد تا امکان استفاده از کانتینر در محیط‌های مختلف فراهم شود.

Configmap شباهت زیادی به مفهوم Secret دارد. به طور معمول Secret برای نگه‌داری Passwordها و توکن‌های حساس استفاده می‌شود در حالی که Configmap برای استفاده در Configurationهای مربوط به برنامه یا سرویس مورد استفاده قرار می‌گیرد.

شیوه ایجاد Configmap

برای ساخت Configmap، می‌بایست اطلاعات مورد نیاز را در قالب yaml در یک فایل وارد کرده و سپس از طریق کامندلاین آن را به سکوی ابری آروان ارایه کرد. در ادامه مثالی ساده از یک Configmap که داده‌های مورد نیاز جهت اتصال به یک پایگاه داده mysql را دارد و مفهوم‌های مربوط به آن را بررسی می‌کنیم.

apiVersion: v1
kind: ConfigMap
metadata:
  name: example-app-config
data:
  system: |
    listen.port=2931
    authentication=enable
    listen.address=127.0.0.1
  ui: enable

نکته: توجه کنید که دندانه‌گذاری (Indentation) در فایل‌های yaml مهم است و کوچک‌ترین جابه‌جایی می‌تواند باعث برگرداندن خطا و یا تنظیمات ناخواسته شود.

در ادامه فیلدهای مربوطه توضیح داده می‌شود.

  • kind: مشخص‌کننده نوع ماهیت است. این فیلد می‌تواند مقادیری مانند‌ Pod ،Configmap ،Service StatefulSet و… داشته باشد. در این مثال، هدف تعریف Configmap است به همین دلیل این مقدار مشخص شده است.
  • metadata.name: مشخص کننده نام Configmap است.
  • data: به طور کلی داده‌های درون Configmap به شکل key:value باید ارایه شوند. در مثال بالا دو Key به نام‌های ui و system تعریف شده است. توجه کنید که مقدار مربوط به Keyها می‌تواند یک مقدار ساده (مانند ui) و یا شامل چند خط باشد. در این حالت، با علامت | مشخص می‌شود که مقدار شامل چند خط است.

خطوط بالا را در یک فایل به نام configmap.yaml وارد کرده و ذخیره کنید. سپس از طریق کامندلاین با دستور زیر، Configmap خود را به سکوی ابری آروان ارایه کنید.

arvan paas apply -f configmap.yaml

سپس با دستور زیر می‌توانید از وضعیت Configmap خود و اجرای آن روی سکوی ابری آروان آگاه شوید.

arvan paas get configmap

خروجی مشابه زیر خواهد بود:

$ arvan paas get configmap
NAME                                  DATA      AGE
example-app-config             2             19m

جهت مشاهده Configmap خود، دستور زیر را بزنید:

arvan paas get configmap example-app-config -o yaml

خروجی همانند تصویر زیر خواهد بود:

apiVersion: v1
data:
  system: |
    listen.port=2931
    authentication=enable
    listen.address=127.0.0.1
  ui: enable
kind: ConfigMap
metadata:
  creationTimestamp: 2020-04-19T10:09:43Z
  name: example-app-config
  namespace: example-project
  resourceVersion: "38346460"
  selfLink: /api/v1/namespaces/example-project/configmaps/example-app-config
  uid: e3fe22e7-8225-11ea-a7a5-fa163e28ed1e

ساخت Configmap با کامندلاین

جهت ساخت Configmap روش راحت‌تر، استفاده از کامندلاین و دستور arvan paas create configmap است که مثالی از آن در ادامه آمده است.

arvan paas create configmap some-config --from-literal=version="3.52" --from-literal=color=blue

دستور بالا یک Configmap به نام some-config، می‌سازد. در دستور بالا می‌توان مقادیر را به‌وسیله‌ی گزینه‌ی –from-literal و به‌شکل key=value به Configmap اختصاص داد.

هم‌چنین می‌توان به جای گزینه‌ی –from-literal از –from-file استفاده کرد که در این صورت مقدارهای موجود در فایل به عنوان Value و نام فایل به عنوان Key مقداردهی می‌شوند.

arvan paas create configmap configs --from-file=./game.properties

دستور بالا یک Secret براساس محتوای فایل game.properties می‌سازد. محتوی Secret را در ادامه مشاهده می‌کنید.

$ arvan paas get configmap configs -o yaml
apiVersion: v1
data:
  game.properties: |-
    enemies=aliens
    lives=3
    enemies.cheat=true
    enemies.cheat.level=noGoodRotten
    secret.code.passphrase=UUDDLRLRBABAS
    secret.code.allowed=true
    secret.code.lives=30
kind: ConfigMap
metadata:
  creationTimestamp: 2020-04-19T11:36:41Z
  name: configs
  namespace: example-project
  resourceVersion: "38373909"
  selfLink: /api/v1/namespaces/example-project/configmaps/configs
  uid: 0a059c8c-8232-11ea-97db-fa163e423165

استفاده از Configmap

در ادامه مثالی از یک Deployment نمونه، برای استفاده از Configmap آمده است. اطلاعات مورد نیاز توسط Configmap و از طریق env به Pod داده می‌شود.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: example-deployment
  labels:
    app: example-deployment
spec:
  replicas: 1
  Strategy:
    type: Recreate
  selector:
    matchLabels:
      app: example-app
  template:
    metadata:
      labels:
        app: example-app
    spec:
      containers:
      - env:
        - name: SYSTEM_CONF
          valueFrom:
            configMapKeyRef:
              name: example-app-config
              key: system
        - name: UI_CONF
          valueFrom:
            configMapKeyRef:
              name: example-app-config
              key: ui
        image: example-app:latest
        imagePullPolicy: IfNotPresent
        name: example-app
        ports:
        - containerPort: 2931
          protocol: TCP
        resources:
          limits:
            cpu: '1'
            ephemeral-storage: 2G
            memory: 1G
          requests:
            cpu: '1'
            ephemeral-storage: 2G
            memory: 1G

در ادامه فیلدهایی که در Deployment اضافه شده تا از Configmapهای ساخته شده استفاده کند، توضیح داده شده است.

  • spec.template.spec.containers.env.valueFrom: این بخش مشخص می‌کند که، مقدار متغیر محیطی قرار است از configmap خوانده شود.
  • spec.template.spec.containers.env.valueFrom.configMapKeyRef.key: این بخش نام key درون configmap که قرار است متغیر محیطی Value مربوط به آن را استفاده کند مشخص می‌کند.
  • spec.template.spec.containers.env.valueFrom.configMapKeyRef.name: این بخش نام Configmap که قرار است متغیر محیطی از آن استفاده کند مشخص می‌کند.

همچنین علاوه بر env می‌توان Configmap را به صورت Volume نیز درون Pod استفاده کرد و اصطلاحن آن را Mount کرد. این شیوه‌ی استفاده در ادامه توضیح مختصری داده شده است.

استفاده از Configmap به‌شکل Volume

همان‎‌طور که گفته شد یکی دیگر از روش‌های استفاده از Configmap، استفاده از آن در قالب Volume و Mount کردن آن درون Pod است. از جمله از مزایای این روش، امکان استفاده از Configmap برای ارایه Configها و یا فایل‌های حاوی کلید به Pod است.

جهت استفاده از Configmap به این شکل، کافیست یک Volume برای Pod تعریف کرده و سپس نام Configmap را به‌عنوان دیسک آن ارایه کنید. در ادامه مثالی از این نوع آمده:

فرض کنید، می‌خواهید محتوای Configs را که در بخش‌های پیشین تعریف شد، در یک Deployment دیگر و در یک مسیر Mount کنید. این امر همانند آن‌چه در مثال پایین آمده انجام می‌شود.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: example-deployment
  labels:
    app: example
spec:
  replicas: 1
  selector:
    matchLabels:
      app: example
  template:
    metadata:
      labels:
        app: example
    spec:
      containers:
      - image: example-app:latest
        imagePullPolicy: IfNotPresent
        name: example
        ports:
        - containerPort: 2368
          protocol: TCP
        resources:
          limits:
            cpu: '1'
            ephemeral-storage: 2G
            memory: 1G
          requests:
            cpu: '1'
            ephemeral-storage: 2G
            memory: 1G
        volumeMounts:
        - name: vol
          mountPath: "/opt/cfg"
      volumes:
      - name: vol
        configMap:
          name: configs

در ادامه فیلدهایی که در Deployment اضافه شده تا Configmap را به‌شکل volume استفاده شود، توضیح داده شده است.

  • spec.template.spec.containers.volumeMount: در این بخش نام و محلی که قرار است Configmap مورد نظر Mount شود مشخص می‌شود. این بخش همانند سایر Volumeها که تاکنون استفاده شده است تعریف می‌شود.
  • spec.template.spec.volumes: در این بخش مشخصات Configmap مورد نظر ارایه می‌شود.
  • spec.template.spec.volumes.name: مشخص کننده volume است که قرار است Configmap مورد نظر در آن Mount شود.
  • spec.template.spec.volumes.configmap: مشخص می‌کند که در Volume مورد نظر قرار است که Configmap اصطلاحن Mount شود.
  • spec.template.spec.volumes.configmap.name:‌ نام Configmapای که باید استفاده شود را مشخص می‌کند.

پس از اجرای فایل بالا در صورتی که وارد Pod شوید و به مسیر تعیین شده بروید مشاهده خواهید کرد که هر یک از فیلدهای تعریف شده در Configmap به‌شکل یک فایل جداگانه در مسیر مورد نظر قرار گرفته شده است.

 $ arvan paas exec -it example-658fd8d59f-jptmb bash
root@example-658fd8d59f-jptmb:/# cat /opt/cfg/game.properties
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true

برای اطلاعات بیش‌تر می‌توانید به مستندات OKD و Kubernetes مراجعه کنید.