DUMMY PRACTITIONERS

technical experiences using microservices

DUMMY PRACTITIONERS

technical experiences using microservices

How to use yaml configuraiton files؟

پنجشنبه, ۵ اسفند ۱۳۹۵، ۰۳:۳۶ ب.ظ


یکی از مهم‌ترین ابزار‌ها در کار با داکر و کیوب (kubernetes) که باید تا حد خوبی بلد باشید و در این پست میخواهیم به صورت مقدماتی بهش بپردازیم اینه : ساختن فایل‌های پیکربندی(configuration) به کمک YAML. به طور خاص میخواهیم نحوه ساختن pod و بعد از آن یک deployment را در kubernetes بررسی کنیم.


مقدمات

اول اینکه اگه بخواهید در زمینه‌ نرم‌افزار کار انجام بدید، سخته که از yaml فرار کنید. اگه در یه جمله بخوایم بگیم yaml چیه؟ یک فرمت مبتنی بر متن خوانا برای مشخص کردن اطلاعات از جنس پیکربندی (configuration) است. بعنوان مثال همانطور که گفتیم، در این پست می‌خواهیم از تعاریف yaml برای تعریف کردن و ساختن اولین pod و سپس یک deploymenet استفاده کنیم.

استفاده از yaml برای تعریف‌کردن المان‌های کیوب، مزایای زیادی دارد. از آن جمله میتوان به : 

  • convenience : نیازی به زدن همه پارامتر‌ها در ترمینال نیست
  • maintenance :‌ میتونه به source control اضافه بشه. بنابراین میتونه تغییراتش رو متوجه بشید
  • flexibility :‌ ساختارهای بسیار پیچیده‌تری، نسبت به چیزی که با ترمینال می‌تونید بسازید، میتونید داشته باشید.

میشه گفت yaml یه superset از Json هست. این به این معنی است که هر فایل معتبر JSON یک فایل معتبر yaml نیز هست.

برای yaml نویسی، تنها دو ساختار ( و یا ترکیبی از این دو ) استفاده میشه :

  • مپ (Maps)
  • لیست (Lists)
Maps
به کمک مپ، جفت‌های name-value  می‌تونید داشته باشید.مثلا یه فایل کانفیگ می‌تونه به شکل زیر شروع بشه:
---
apiVersion: v1
kind: Pod
metadata:
  name: rss-site
  labels:
    app: web

خط اول ( ---) نقش جدا کننده داره و گذاشتنش اختیاریه مگه اینکه چندین ساختار در یک فایل داشته باشید. همانطور که می‌بینید دو مقدار (value) داریم :‌  v1 , Pod که به دو کلید : apiVersion , kind ، مپ شده‌اند. همچنین یک کلید metadata داریم که مقدارش خودش یک مپ با دو کلید (name و label) است. این ساختار میتونه هرچقدر که نیاز باشه nested بشه!

نکته‌ای که اینجا هست اینه که پردازنده yaml از روی indentation متوجه این ارتباط‌ها میشه.(ضمنا حواستون باشه که از tab برای ایجاد indentation استفاده نکنید.)

Lists
همانطور که میدانید، لیست‌ها در واقع یک sequence از object‌ها هستند. برای مثال : 
---
apiVersion: v1
kind: Pod
metadata:
  name: rss-site
  labels:
    app: web
spec:
  containers:
    - name: front-end
      image: nginx
      ports:
        - containerPort: 80
    - name: rss-reader
      image: nickchase/rss-php-nginx:v1
      ports:
        - containerPort: 88
همانطور که می‌بینید، در اینجا لیستی از container object‌ها داریم، که هر کدام از یک اسم، یک  docker image و لیستی از پورت‌ها تشکیل شدند.
که خود ports یک مپ است که مقدارش مپ دیگری است.

برای اینکه یه حسی بگیرین از اینکه چرا yaml خیلی با سرعت داره جای Json رو میگیره یه نگاه به معادل json کانفیگ فایل بالا بندازیم ‌:
{
   "apiVersion": "v1",
   "kind": "Pod",
   "metadata": {
                 "name": "rss-site",
                 "labels": {
                             "app": "web"
                           }
               },
    "spec": {
       "containers": [{
                       "name": "front-end",
                       "image": "nginx",
                       "ports": [{
                                  "containerPort": "80"
                                 }]
                      }, 
                      {
                       "name": "rss-reader",
                       "image": "nickchase/rss-php-nginx:v1",
                       "ports": [{
                                  "containerPort": "88"
                                 }]
                      }]
            }
}
برای جمع‌بندی فهمیدیم ساختارهای زیر قابل استفاده هستند :
  • maps, which are groups of name-value pairs
  • lists, which are individual items
  • maps of maps
  • maps of lists
  • lists of lists
  • lists of maps
ساختن Pod به کمک yaml 
اگه تا الان cluster و kubectlتون رو راه ننداخته‌اید، به پست Deploying monitoring tools برید و این کار رو انجام بدید.
یک فایل نمونه yaml برای ساختن پاد رو در زیر می‌توانید مشاهده کنید:
apiVersion: v1
kind: Pod
metadata:
  name: redis-django
  labels:
    app: web
spec:
  containers:
    - name: key-value-store
      image: redis
      ports:
        - containerPort: 6379
    - name: frontend
      image: django
      ports:
        - containerPort: 8000
در ابتدا یک مپ apiVersion با مقدار v1 رو میبینید.( برای deployment باید یک apiVersion دیگه بزنیم چرا که برای اون v1 وجود نداره)

بعد میگیم که میخوایم یه pod درست کنیم.(kind : Pod) 

پس از آن metadata رو باید مشخص کنیم . که در اینجا نام پاد و برچسبش رو مشخص میکنیم ( که کیوب با این قراره بشناسدش)

در آخر، object‌های واقعی سازنده پاد رو مشخص میکنیم. در قسمت spec، هر گونه container، storage volumes یا هر چیز دیگه‌ای که کیوب لازمه درموردش بدونه، حتی properties مثل اینکه اگه کانتینر fail کرد آیا ریستارتش کنه یا نه. میتونید در اینجا لیست کاملی از این‌ها رو ببینید.

توجه :‌ اگر از private registry مثل gitlab استفاده میکنید برای ساخت پاد باید مراحل گفته شده در این لینک را دنبال کنید.
فقط حواستون باشه این لینک با این فرض رفته جلو که شما از hub.docker استفاده میکنید. اگه از gitlab استفاده میکنید باید
 docker login registry.gitlab.com
رو بزنید و همینطور موقع ایجاد secret نام داکر سرور رو هم مشخص کنید :

kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
secret "myregistrykey" created.



نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی