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