استفاده از Configmap در پلتفرم ابری آروان
پلتفرم ابری در واقع یک مدل از مبحث رایانش ابری است که سرویسدهنده با ایجاد امکانات سختافزاری و برخی ابزارها، سرعت توسعه نرمافزار را بالا برده و دغدغه توسعهدهنده را، در ارتباط با زیرساختهای مورد نیاز محصول، مرتفع میسازد.
در این مقاله به بررسی مفهوم 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