نحوه مدیریت پیکربندی‌های Kubernetes با Kustomize

مقدمه

استقرار (Deploy) برنامه‌ها در Kubernetes گاهی می‌تواند پیچیده و زمان‌بر باشد. معمولاً برای اجرای یک برنامه باید چندین Pod ایجاد کنید، آن‌ها را با یک Deployment مدیریت کنید و دسترسی به آن‌ها را از طریق یک Service فراهم سازید. تمامی این منابع نیازمند فایل‌های YAML برای تعریف و پیکربندی هستند.

علاوه بر این، ممکن است برنامه شما نیاز به ارتباط با پایگاه داده، مدیریت محتوای وب یا تنظیم سطح لاگ‌گیری داشته باشد. این تنظیمات نیز معمولاً بین محیط‌های مختلف مانند توسعه (Development) و تولید (Production) متفاوت هستند. در نتیجه، تعداد زیادی فایل YAML با تفاوت‌های جزئی ایجاد می‌شود که مدیریت و نگهداری آن‌ها دشوار خواهد بود.

Kustomize یک ابزار متن‌باز برای مدیریت پیکربندی است که با هدف حل این مشکلات توسعه یافته است. از نسخه 1.14 کوبرنتیز به بعد، ابزار kubectl به‌صورت کامل از Kustomize و فایل‌های kustomization پشتیبانی می‌کند.

در این آموزش، یک برنامه وب ساده ایجاد می‌کنید و سپس با استفاده از Kustomize مدیریت پیکربندی‌های آن را انجام خواهید داد. برنامه را در محیط‌های توسعه و تولید با تنظیمات متفاوت مستقر می‌کنید و با استفاده از قابلیت‌های Base و Overlay در Kustomize، ساختار فایل‌ها را خواناتر و نگهداری آن‌ها را ساده‌تر خواهید کرد.


پیش‌نیازها

برای دنبال کردن این آموزش به موارد زیر نیاز دارید:

  • یک کلاستر Kubernetes نسخه 1.14 یا بالاتر
  • نصب و پیکربندی kubectl
  • دسترسی به کلاستر به‌عنوان تنظیم پیش‌فرض kubectl

مرحله اول — استقرار برنامه بدون Kustomize

قبل از استفاده از Kustomize، ابتدا برنامه را به روش سنتی در Kubernetes مستقر می‌کنیم.

در این مثال، نسخه توسعه‌ای برنامه‌ای به نام sammy-app را که یک وب‌سایت استاتیک مبتنی بر Nginx است، راه‌اندازی خواهیم کرد.

ابتدا پوشه پروژه را ایجاد کنید:

mkdir ~/sammy-app && cd ~/sammy-app

ایجاد ConfigMap

فایل زیر را ایجاد کنید:

nano configmap.yml

محتوای فایل:

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: sammy-app
  namespace: default
data:
  body: >
    <html>
      <style>
        body {
          background-color: #222;
        }
        p {
          font-family:"Courier New";
          font-size:xx-large;
          color:#f22;
          text-align:center;
        }
      </style>
      <body>
        <p>DEVELOPMENT</p>
      </body>
    </html>

این فایل یک ConfigMap به نام sammy-app ایجاد می‌کند که شامل محتوای HTML سایت است.


ایجاد Deployment

فایل زیر را ایجاد کنید:

nano deployment.yml

محتوا:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sammy-app
  namespace: default
  labels:
    app: sammy-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sammy-app
  template:
    metadata:
      labels:
        app: sammy-app
    spec:
      containers:
      - name: server
        image: nginx:1.17
        volumeMounts:
          - name: sammy-app
            mountPath: /usr/share/nginx/html
        ports:
        - containerPort: 80
          protocol: TCP
        resources:
          requests:
            cpu: 100m
            memory: "128M"
          limits:
            cpu: 100m
            memory: "256M"
        env:
        - name: LOG_LEVEL
          value: "DEBUG"
      volumes:
      - name: sammy-app
        configMap:
          name: sammy-app
          items:
          - key: body
            path: index.html

این فایل یک Deployment با یک Replica ایجاد می‌کند و محتوای ConfigMap را به عنوان فایل index.html در Nginx قرار می‌دهد.


استقرار منابع

فایل‌ها را اعمال کنید:

cat configmap.yml deployment.yml | kubectl apply -f -

وضعیت Pod را بررسی کنید:

kubectl get pods -l app=sammy-app

خروجی:

NAME                         READY   STATUS
sammy-app-56bbd86cc9-chs75   1/1     Running

ایجاد Service

فایل جدید:

nano service.yml

محتوا:

---
apiVersion: v1
kind: Service
metadata:
  name: sammy-app
  labels:
    app: sammy-app
spec:
  type: LoadBalancer
  ports:
  - name: sammy-app-http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: sammy-app

اعمال تنظیمات:

kubectl apply -f service.yml

بررسی سرویس:

kubectl get services -w

پس از دریافت IP عمومی، با باز کردن آن در مرورگر نسخه Development برنامه نمایش داده خواهد شد.


مرحله دوم — استقرار برنامه با Kustomize

ساختار فعلی پروژه:

sammy-app/
├── configmap.yml
├── deployment.yml
└── service.yml

برای استفاده از Kustomize تنها کافی است یک فایل جدید اضافه کنید:

nano kustomization.yml

محتوا:

---
resources:
- configmap.yml
- deployment.yml
- service.yml

حذف منابع قبلی

kubectl delete deployment/sammy-app service/sammy-app configmap/sammy-app

استقرار با Kustomize

kubectl apply -k .

بررسی Pod:

kubectl get pods -l app=sammy-app

بررسی Service:

kubectl get services -l app=sammy-app

اکنون Kustomize مدیریت منابع را بر عهده گرفته است.


مرحله سوم — مدیریت تفاوت تنظیمات با Kustomize

فرض کنید اکنون می‌خواهید نسخه Production را منتشر کنید.

تفاوت‌های نسخه Production:

  • تعداد Replica از 1 به 3 افزایش یابد.
  • منابع CPU و حافظه افزایش یابد.
  • مقدار LOG_LEVEL از DEBUG به INFO تغییر کند.
  • محتوای ConfigMap متفاوت باشد.

ایجاد Base

پوشه Base را ایجاد کنید:

mkdir base

فایل‌های فعلی را به آن منتقل کنید:

mv configmap.yml deployment.yml service.yml kustomization.yml base/

ایجاد Overlay تولید

mkdir -p overlays/production

فایل:

nano overlays/production/kustomization.yml

محتوا:

---
bases:
- ../../base
patchesStrategicMerge:
- configmap.yml
- deployment.yml

Patch مربوط به Deployment

nano overlays/production/deployment.yml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sammy-app
  namespace: default
spec:
  replicas: 3
  template:
    spec:
      containers:
      - name: server
        resources:
          requests:
            cpu: 250m
            memory: "256M"
          limits:
            cpu: 1
            memory: "1G"
        env:
        - name: LOG_LEVEL
          value: "INFO"

Patch مربوط به ConfigMap

nano overlays/production/configmap.yml
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: sammy-app
  namespace: default
data:
  body: >
    <html>
      <style>
        body {
          background-color: #222;
        }
        p {
          font-family:"Courier New";
          font-size:xx-large;
          color:#22f;
          text-align:center;
        }
      </style>
      <body>
        <p>PRODUCTION</p>
      </body>
    </html>

ساختار نهایی پروژه

sammy-app/
├── base
│   ├── configmap.yml
│   ├── deployment.yml
│   ├── kustomization.yml
│   └── service.yml
└── overlays
    └── production
        ├── configmap.yml
        ├── deployment.yml
        └── kustomization.yml

استقرار نسخه Development

kubectl delete deployment/sammy-app service/sammy-app configmap/sammy-app
kubectl apply -k base/

استقرار نسخه Production

kubectl apply -k overlays/production/

بررسی منابع:

kubectl get pods,services -l app=sammy-app

خروجی:

pod/sammy-app-86759677b4-h5ndw   Running
pod/sammy-app-86759677b4-t2dml   Running
pod/sammy-app-86759677b4-z56f8   Running

مشاهده جزئیات Deployment:

kubectl get deployments -l app=sammy-app -o yaml

اکنون نسخه Production با سه Replica و تنظیمات اختصاصی خود اجرا می‌شود.


نتیجه‌گیری

در این آموزش با Kustomize آشنا شدید و یاد گرفتید چگونه پیکربندی‌های Kubernetes را به شکلی ساختاریافته و قابل نگهداری مدیریت کنید. با استفاده از Base و Overlay می‌توانید تغییرات محیط‌های مختلف مانند Development و Production را بدون ایجاد فایل‌های تکراری مدیریت کنید.

مزایای اصلی Kustomize عبارت‌اند از:

  • کاهش تکرار در فایل‌های YAML
  • مدیریت آسان محیط‌های مختلف
  • کاهش خطاهای پیکربندی
  • خوانایی و نگهداری بهتر پروژه
  • یکپارچگی کامل با kubectl

اگر قصد دارید پروژه‌های Kubernetes را در مقیاس بزرگ مدیریت کنید، Kustomize یکی از بهترین ابزارهای موجود برای سازمان‌دهی و کنترل پیکربندی‌ها محسوب می‌شود.

از همراهی شما با پارمین کلود سپاسگزاریم.

Click to rate this post!
[Total: 0 Average: 0]

نظرات کاربران

دیدگاهی بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *