نویسنده : Arvan

استفاده از Configmap در پلتفرم ابری آروان

linkedin

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

پیش‌نیازها

تنها پیش نیاز این سیستم، داشتن اکانت ابر آروان و دسترسی به پلتفرم ابری آروان است.
ابتدا یه سایت آروان به نشانی www.arvancloud.com بروید و یک اکانت بسازید. سپس به بخش پروفایل رفته و در سربرگ API KEYS برای خود یک API KEY جدید ساخته و آن را در جایی ذخیره کنید.
برای انجام مراحل این مقاله نیاز است که از کامند لاین ابر آروان استفاده کنید. با استفاده از این لینک کامندلاین را دانلود کرده (در صورت نیاز آن را در 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 تعریف شده است. توجه کنید که value مربوط به 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

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

 در ادامه فیلدهایی که در 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

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

در ادامه فیلدهایی که در 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 مراجعه کنید.

 

این مقاله از مراجع زیر اقتباس شده است:

https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap
https://docs.openshift.com/container-platform/3.11/dev_guide/configmaps.html

مطالب مرتبط