مقدمه
استقرار (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 یکی از بهترین ابزارهای موجود برای سازماندهی و کنترل پیکربندیها محسوب میشود.
از همراهی شما با پارمین کلود سپاسگزاریم.
نظرات کاربران