تغییرات اخیر

در اینجا اطلاعیه‌ها، نسخه‌ها و تغییرات جدید لیارا فهرست می‌شوند.

نحوه استقرار اپلیکیشن در Kubernetes با Helm


۱۸ مرداد ۱۴۰۴

زمانی‌که صحبت از استقرار اپلیکیشن‌ها در کوبرنتیز به میان می‌آید، اولین چیزی که به ذهن‌مان می‌رسد، پیچیدگی‌های فراوان و مراحل طولانی آن است. مخصوصا وقتی بخواهیم چندین سرویس را همزمان در یک کلاستر راه بیاندازیم، ممکن است با چالش‌های زیادی روبه‌رو شویم. در چنین موقعیت‌هایی Helm به کمک ما می‌آید. Helm یک ابزار برای مدیریت پکیج‌ها در Kubernetes است که فرایند دیپلوی اپلیکیشن‌ها را بسیار ساده می‌کند. به‌جای اینکه تمام منابع و تنظیمات را به‌صورت دستی پیکربندی کنید، با Helm فقط باید از چارت‌ها(Charts) استفاده کنید، آن‌ها همه موارد را مدیریت و تنظیم می‌کنند. بنابراین اگر می‌خواهید فرایند دیپلوی را به حداقل زمان و خطا برسانید، این مقاله از سری آموزش‌های کوبرنتیز را از دست ندهید، و تا انتهای این مطلب همراه ما باشید:)

توجه کنید که در این معماری نهایی، چهار سرویس درون کلاستر مستقر خواهند شد؛ kanban-ui (فرانت‌اند)، kanban-app (بک‌اند)، postgres (پایگاه‌داده)، adminer (ابزار GUI برای مدیریت دیتابیس)

پیش‌نیازها

قبل از شروع آموزش این مقاله، ابزارهای زیر باید روی سیستم شما نصب شده باشد:

  • Docker
  • Minikube (کلاستر Kubernetes محلی)
  • kubectl (ابزار CLI برای Kubernetes)
  • Helm
نحوه استقرار اپلیکیشن در Kubernetes با Helm

آنچه در این مقاله می‌خوانید:

  • تکرار و پیچیدگی YAML‌ها
  • گام اول: نصب Helm
  • گام دوم: ایجاد Helm Chart
  • گام سوم: شخصی‌سازی Chart
  • گام چهارم: استقرار اپلیکیشن
  • جمع‌بندی
  • سوالات متداول

تکرار و پیچیدگی YAML‌ها

در روش عادی و بدون Helm برای استقرار اپلیکیشن در کوبرنتیز، با kubectl، حداقل باید دو فایل YAML برای هر اپلیکیشن به‌صورت جداگانه بنویسیم: یکی برای Deployment و یکی برای Service. اگر اپلیکیشن پیچیده‌تر باشد مثل Postgres، باید PersistentVolumeClaim و ConfigMap هم اضافه کنیم.

این موضوع باعث می‌شود در پروژه‌های حتی ساده، ده‌ها فایل مشابه اما تکراری تولید شود، بنابراین راه‌حل چیست؟ استفاده از Helm!

نحوه ساخت کلاستر Kubernetes مدیریت‌شده با Terraform را در مقاله زیر می‌توانید مطالعه کنید.
ساخت کلاستر Kubernetes با Terraform

گام اول: نصب Helm

همان‌طور که در مقدمه گفتیم، Helm یک ابزار مدیریت پکیج در کوبرنتیز است که به استقرار اپلیکیشن‌های پیچیده کمک می‌کند. برای مثال اگر بخواهیم Prometheus را روی یک کلاستر اجرا کنیم، به‌سادگی می‌توانیم از chart آماده‌ی آن استفاده کنیم. برای این‌کار دستور زیر را اجرا کنید:

$ helm install stable/prometheus

با این دستور، ابزار Helm همه منابع مورد نیاز را ایجاد می‌کند؛ از Service و Deployment گرفته تا ConfigMap و PersistentVolume؛ بدون نیاز به نوشتن حتی یک خط YAML دستی!

حتما این را بدانید، چارت‌هایی که در Helm وجود دارند، معمولا تنظیمات پیش‌فرض دارند، اما می‌توانید آن‌ها را با یک فایل YAML نیز تغییر دهید و هنگام نصب این تغییرات را به chart اعمال کنید. نکته مهم این است که، قدرت Helm به چارت‌های آماده محدود نمی‌شود، شما می‌توانید چارت اختصاصی خودتان را ایجاد کنید.

گام دوم: ایجاد Helm Chart

برای ایجاد chart، دستور زیر را وارد کنید:

$ helm create example
Creating example

خروجی:

 ایجاد Helm Chart

با اجرای دستور بالا، یک فولدر با ساختار اولیه یک چارت ساخته می‌شود که شامل تمام فایل‌های مورد نیاز برای تعریف منابع اپلیکیشن شما در Kubernetes است. فایل‌هایی مانند:

  • deployment.yaml برای تعریف دپلویمنت
  • service.yaml برای سرویس‌دهی
  • values.yaml برای تنظیم مقادیر قابل سفارشی‌سازی
  • یک فایل Chart.yaml که اطلاعات زیادی درباره چارت شما را نگه می‌دارد

حالا همه چیز آماده است تا شما مقادیر دلخواه خود را وارد کنید و با چند تغییر ساده، اپلیکیشن خود را استقرار دهید.

در فولدر templates/، الگوهای Helm وجود دارند که با ترکیب با فایل values.yaml، مجموعه‌ای از اشیاء Kubernetes را تولید خواهند کرد.

گام سوم: شخصی‌سازی Chart

در این گام، چارت اختصاصی postgres را ایجاد می‌کنیم. اما قبل از آن، نصب و پیکربندی‌های زیر را حتما انجام دهید:

  • نصب داکر
  • کلاستر Kubernetes محلی، minikube
  • ابزار خط فرمان kubectl

زمانی که این ابزارها را نصب کردید، کلاستر minikube را راه‌اندازی کرده و پلاگین Ingress را فعال کنید:

$ minikube start
😄  minikube v1.8.1 on Ubuntu 18.04
✨  Automatically selected the docker driver
🔥  Creating Kubernetes in docker container with (CPUs=2) (8 available), Memory=2200MB (7826MB available) ...
🐳  Preparing Kubernetes v1.17.3 on Docker 19.03.2 ...
▪ kubeadm.pod-network-cidr=10.244.0.0/16
❌  Unable to load cached images: loading cached images: stat /home/wojtek/.minikube/cache/images/k8s.gcr.io/kube-proxy_v1.17.3: no such file or directory
🚀  Launching Kubernetes ...
🌟  Enabling addons: default-storageclass, storage-provisioner
⌛  Waiting for cluster to come online ...
🏄  Done! kubectl is now configured to use "minikube"
$ minikube addons enable ingress
🌟  The 'ingress' addon is enabled

پس از آن، نیاز خواهید داشت که فایل hosts خود را ویرایش کنید. مکان آن بسته به سیستم‌عامل شما متفاوت است.زمانی که آن‌را پیدا کردید، خطوط زیر را به آن اضافه کنید:

172.17.0.2  adminer.k8s.com
172.17.0.2  kanban.k8s.com

سپس برای اینکه مطمئن شوید، تنظیمات به‌صورت صحیح اعمال شده‌اند، باید بررسی کنید که آدرس IP کلاستر minikube بر روی سیستم شما با آدرسی که در بالا آمده، یکسان باشد. برای این‌کار دستور زیر را وارد کنید:

$ minikube ip
172.17.0.2

اکنون، می‌توانیم اولین چارت Helm را با دستور زیر ایجاد کنیم:

$ helm create postgres
Creating postgres

بهتر است بدانید، به فایل‌های تولید شده در فولدر ./templates نیازی نداریم. بنابراین آن‌ها را حذف کرده و تمام محتوای داخل فایل values.yaml را پاک می‌کنیم.

حالا می‌توانیم تمام فایل‌های لازم برای ایجاد چارت postgres را تعریف کنیم. اگر یادتان باشد برای استقرار آن با kubectl به فایل‌های YAML زیر نیاز داشتیم:(

 ایجاد Helm Chart

این فایل‌ها شامل تعاریف ConfigMap، Deployment، PersistentVolumeClaim و ClusterIP هستند. تعاریف کامل آن‌ها را می‌توان در یک ریپازیتوری پیدا کرد.

ابتدا بیایید یک قالب برای شیء Deployment پایگاه داده postgres ایجاد کنیم. بنابراین داخل فولدر./templates یک فایل deployment.yaml ایجاد می‌کنیم:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Values.postgres.name }}
  labels:
    app: {{ .Values.postgres.name }}
    group: {{ .Values.postgres.group }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ .Values.postgres.name }}
  template:
    metadata:
      labels:
        app: {{ .Values.postgres.name }}
        group: {{ .Values.postgres.group }}
    spec:
      volumes:
        - name: {{ .Values.postgres.volume.name }}
          persistentVolumeClaim:
            claimName: {{ .Values.postgres.volume.pvc.name }}
      containers:
        - name: {{ .Values.postgres.name }}
          image: {{ .Values.postgres.container.image }}  
          ports:
            - containerPort: {{ .Values.postgres.container.port }}
          envFrom:
            - configMapRef:
                name: {{ .Values.postgres.config.name }}
          volumeMounts:             
            - name: {{ .Values.postgres.volume.name }}
              mountPath: {{ .Values.postgres.volume.mountPath }} 

در کد بالا و در نگاه اول ممکن است این بخش‌های عجیب را بین دو جفت آکولاد مشاهده کنید، مانند {{ .Values.postgres.name }}. این‌ها به زبان قالب‌سازی Go نوشته شده‌اند و به مقداری اشاره دارند که در فایل values.yaml قرار دارد که در فولدر ریشه‌ی چارت قرار دارد.

برای مثال ذکر شده، Helm سعی می‌کند آن را مانند زیر با مقداری از فایل values.yaml مطابقت دهد:

postgres:
    name: postgres

مورد دیگر؛ مقداری برای ایمیج پایه Docker، که در image: {{ .Values.postgres.container.image }} تعریف شده است، از موارد زیر گرفته می‌شود:

postgres:
    name: postgres
    container:
        image: postgres:9.6-alpine

و همچنین، می‌توانیم ساختار داخل این فایل را هر طور که بخواهیم تعریف کنیم. این استقرار دیتابیس، نیاز به ایجاد یک PersistentVolumeClaim دارد تا فضای ذخیره‌سازی بر روی دیسک رزرو شود، پس نیاز داریم که یک قالب Helm به نام pvc.yaml داخل پوشه ./templates ایجاد کنیم:

apiVersion: v1
kind: {{ .Values.postgres.volume.kind }}
metadata:
  name: {{ .Values.postgres.volume.pvc.name }}
spec:
  accessModes:
    - {{ .Values.postgres.volume.pvc.accessMode }}
  resources:
    requests:
      storage: {{ .Values.postgres.volume.pvc.storage }}

این قالب کوتاه‌تر است و هیچ مورد جدیدی در آن وجود ندارد.

قالب بعدی که باید ایجاد کنیم، ClusterIP است، که به سایر Podها در داخل کلاستر اجازه می‌دهد به Pod حاوی postgres دسترسی پیدا کند؛ قالب service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: {{ .Values.postgres.name }}
  labels: 
    group: {{ .Values.postgres.group }}
spec:
  type: {{ .Values.postgres.service.type }}
  selector:             
    app: {{ .Values.postgres.name }}
  ports:
    - port: {{ .Values.postgres.service.port }}       
      targetPort: {{ .Values.postgres.container.port }} 

در نهایت باید قالبی به نام config.yaml برای ConfigMap ایجاد کنیم.

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

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Values.postgres.config.name }}
  labels:
    group: {{ .Values.postgres.group }}
data: 
{{- range .Values.postgres.config.data }}
  {{ .key }}: {{ .value }}
{{- end}}

در این قالب ممکن است با عبارتی مثل {{- range … }} روبرو شوید که شبیه حلقه for each در زبان‌های برنامه‌نویسی است؛ یعنی Helm به ازای هر مقدار موجود در یک لیست (که در فایل values.yaml تعریف شده)، یک بخش از قالب را تولید می‌کند، مانند زیر:

postgres:
    config:
        data:
            - key: key
              value: value

در داخل قالب‌ها فقط مقادیر پیش‌فرض قرار دارند. اگر بخواهید از مقادیر واقعی یا شخصی سازی شده استفاده کنید، باید هنگام نصب این مجموعه روی کلاستر Kubernetes، آن‌ها را تغییر (override) دهید.

فایل کامل values.yaml به شکل زیر است:

replicaCount: 1
postgres:
  name: postgres
  group: db
  container:
    image: postgres:9.6-alpine
    port: 5432
  service:
    type: ClusterIP
    port: 5432
  volume:
    name: postgres-storage
    kind: PersistentVolumeClaim
    mountPath: /var/lib/postgresql/data
    pvc:
      name: postgres-persistent-volume-claim
      accessMode: ReadWriteOnce
      storage: 4Gi
  config:
    name: postgres-config
    data:
       - key: key
         value: value

برای تکمیل ساخت اولین Chart، باید برخی از اطلاعات متادیتا(metadata) را در فایل Chart.yaml ویرایش کنیم، مانند زیر:

apiVersion: v2
name: postgres
description: A Helm chart for PostgreSQL database
type: application
version: 0.1.0
appVersion: 1.16.0
keywords:
  - database
  - postgres
home: https://github.com/wkrzywiec/k8s-helm-helmfile/tree/master/helm
maintainers:
  - name: Wojtek Krzywiec
    url: https://github.com/wkrzywiec

بطوریکه در این گام، باید اطلاعاتی مانند نام چارت (name)، نسخه (version)، و سایر توضیحات مربوط به چارت Helm را داخل فایل Chart.yaml قرار بدهید یا به‌روزرسانی کنید تا چارت شما آماده استفاده باشد.

پس از آن، یک فایل جدید به نام kanban-postgres.yaml بسازید که بایستی شامل مقادیر خاصی باشد. این فایل را بیرون از فولدر چارت postgres قرار بدهید تا ساختار فولدرها چیزی شبیه به شکل زیر باشد:

 ایجاد Helm Chart

داخل این فایل (kanban-postgres.yaml) مقادیری را قرار دهید که مخصوص همین استقرار هستند. به‌طور مثال اطلاعات لاگین دیتابیس Postgres، و باقی مقادیر را پیش‌فرض نگه می‌داریم:

postgres:
    config:
        data:
            - key: POSTGRES_DB
              value: kanban
            - key: POSTGRES_USER
              value: kanban
            - key: POSTGRES_PASSWORD
              value: kanban
برای آشنایی کامل با کوبرنتیز و نحوه کارکرد آن، مقاله زیر را از دست ندهید.
کوبرنتیز چیست؟

گام چهارم: استقرار اپلیکیشن

در این گام، اکنون همه موارد آماده شده، حالا می‌توانید دیتابیس Postgres را داخل کلاستر مستقر کنید. در دنیای Helm، این کار را ایجاد یک نسخه (release) جدید می‌گویند.

$ helm install -f kanban-postgres.yaml postgres ./postgres
NAME: postgres
LAST DEPLOYED: Mon Apr 13 16:13:16 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
$ helm list 
NAME     NAMESPACE REVISION  STATUS    CHART          APP VERSION
postgres default   1         deployed  postgres-0.1.0 1.16.0
$ kubectl get deployments
NAME       READY   UP-TO-DATE   AVAILABLE   AGE
postgres   1/1     1            1           2m14s

اکنون دیتابیس Postgres بالا آماده و در حال اجرا است. قبل از ادامه آموزش، نگاهی بیاندازیم به دستور helm install و بررسی کنیم، هر کدام از بخش‌هایش چه مفهومی دارند:

 ایجاد Helm Chart

تا اینجا یک چارت Helm برای دیتابیس Postgres ایجاد کرده و این Chart برای نصب Postgres در کلاستر کوبرنتیز استفاده شد. در این بخش نشان می‌دهیم که چطور می‌توانیم از یک چارت برای استقرار چندین برنامه استفاده کنیم؛ با این ‌کار می‌توانیم سه اپلیکیشن adminer، kanban-app و kanban-ui را با یک چارت واحد مدیریت کنیم و نیازی به ایجاد چارت‌های جداگانه برای هر برنامه نداشته باشیم.

برای این‌کار دستور زیر را اجرا کنید:

$ helm create app
Creating app

پس از حذف فایل‌های غیرضروری از فولدر ./templates و تمیز کردن فایل values.yaml، یک فایل deployment.yaml با محتوای زیر ایجاد کنید:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Values.app.name }}
  labels:
    app: {{ .Values.app.name }}
    group: {{ .Values.app.group }}
spec:
  replicas: {{ .Values.app.replicaCount }}
  selector:
    matchLabels:
      app: {{ .Values.app.name }}
  template:
    metadata:
      labels:
        app: {{ .Values.app.name }}
        group: {{ .Values.app.group }}
    spec:
      containers:
        - name: {{ .Values.app.name }}
          image: {{ .Values.app.container.image }}  
          ports:
            - containerPort: {{ .Values.app.container.port }}
          envFrom:
            {{- range .Values.app.container.config }}
            - configMapRef:
                name: {{ .name }}
            {{- end}}
          env:
            {{- range .Values.app.container.env}}
            - name: {{ .key}}
              value: {{ .value}}
            {{- end}}

در این بخش، فقط چند جایگزین و دو حلقه range برای وارد کردن مقادیر از ConfigMapها یا مقادیر ساده به کانتینر اپلیکیشن نیاز داریم.

هر سه اپلیکیشن نیاز دارند که اشیاء ClusterIP نیز برای آن‌ها استقرار داده شود؛ مطابق فایل service.yaml زیر:

apiVersion: v1
kind: Service
metadata:
  name: {{ .Values.app.name }}
  labels: 
    group: {{ .Values.app.group }}
spec:
  type: {{ .Values.app.service.type }}
  selector:             
    app: {{ .Values.app.name }}
  ports:
    - port: {{ .Values.app.service.port }}       
      targetPort: {{ .Values.app.container.port }}   

در کد بالا، تمام مقادیر پیش‌فرضی که در هر دو فایل template وجود دارند، از فایل values.yaml گرفته می‌شوند و داخل این فایل‌های قالب (قالب Helm) وارد می‌شوند:

app:
  name: app
  group: app
  replicaCount: 1
  container:
    image: add-image-here
    port: 8080
    config: []
    env:
       - key: key
         value: value
  service:
    type: ClusterIP
    port: 8080

برای اتمام کار ساخت چارت اپلیکیشن‌، باید برخی از متادیتاها را در فایل Chart.yaml تعریف کنید:

apiVersion: v2
name: app
description: A Helm chart for any application
type: application
version: 0.1.0
appVersion: 1.16.0
keywords:
  - app
  - java
  - javascript
  - angular
home: https://github.com/wkrzywiec/k8s-helm-helmfile/tree/master/helm
maintainers:
  - name: Wojtek Krzywiec
    url: https://github.com/wkrzywiec

سپس، مشابه قبلی، باید مقادیر خاصی را وارد کنید تا تنظیمات پیش‌فرض را تغییر دهد.

فایل adminer.yaml به شکل زیر خواهد بود:

app:
  name: adminer
  group: db
  container:
    image: adminer:4.7.6-standalone
    port: 8080
    env:
      - key: ADMINER_DESIGN
        value: pepa-linha
      - key: ADMINER_DEFAULT_SERVER
        value: postgres

فایل  kanban-app.yaml:

app:
  name: kanban-app
  group: backend
  container:
    image: wkrzywiec/kanban-app:k8s
    config:
      - name: postgres-config
    env: 
      - key: DB_SERVER
        value: postgres

فایل kanban-ui.yaml:

app:
  name: kanban-ui
  group: frontend
  container:
    image: wkrzywiec/kanban-ui:k8s
    port: 80

در آخر ساختار نهایی فایل‌ها به‌صورت زیر خواهد بود:

 ایجاد Helm Chart

اکنون، جهت ایجاد سه نسخه برای هر اپلیکیشن، از دستورات زیر استفاده کنید:

$ helm install -f adminer.yaml adminer ./app
NAME: adminer
LAST DEPLOYED: Mon Apr 13 16:57:17 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
$ helm install -f kanban-app.yaml kanban-app ./app
NAME: kanban-app
LAST DEPLOYED: Mon Apr 13 16:57:36 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
$ helm install -f kanban-ui.yaml kanban-ui ./app
NAME: kanban-ui
LAST DEPLOYED: Mon Apr 13 16:57:54 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
$ helm list 
NAME       NAMESPACE REVISION  STATUS    CHART           APP VERSION
adminer    default   1         deployed  app-0.1.0       1.16.0     
kanban-app default   1         deployed  app-0.1.0       1.16.0     
kanban-ui  default   1         deployed  app-0.1.0       1.16.0     
postgres   default   1         deployed  postgres-0.1.0  1.16.0
$ kubectl get deployments
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
adminer      1/1     1            1           112s
kanban-app   1/1     1            1           93s
kanban-ui    1/1     1            1           75s
postgres     1/1     1            1           45m

در این گام نشان دادیم که چگونه می‌توان از یک چارت برای استقرار چندین برنامه استفاده کرد، و در آخر یک چارت Ingress Controller ایجاد می‌کنیم که به کلاستر متصل شود.

برای این‌کار دستور زیر را وارد کنید:

$ helm create ingress
Creating ingress

پس از ایجاد یک چارت جدید، تمام فایل‌ها را از فولدر templates حذف کنید و محتوای فایل values.yaml را خالی کنید. این‌بار، قبل از اینکه مستقیم به تعریف تمپلیت‌ها بپردازیم، ابتدا باید به فایل Chart.yaml توجه کنیم.

apiVersion: v2
name: ingress
description: A Helm chart for Ingress Controller
type: application
version: 0.1.0
appVersion: 1.16.0
keywords:
  - ingress
  - nginx
  - api-gateway
home: https://github.com/wkrzywiec/k8s-helm-helmfile/tree/master/helm
maintainers:
  - name: Wojtek Krzywiec
    url: https://github.com/wkrzywiec
dependencies:
  - name: nginx-ingress
    version: 1.36.0
    repository: https://charts.helm.sh/stable

در اینجا یک بخش جدید به نام dependencies اضافه شده است. این بخش سرویس‌های پشتیبان پیش‌فرض را ایجاد می‌کند که قابلیت‌های Ingress Controller را فعال می‌کند.

اما تنها کاری که باید در اینجا انجام دهیم همین نیست. این بخش فقط وابستگی‌های این چارت را تعریف می‌کند و به‌طور خودکار آن‌ها را در زمان نصب دانلود نخواهد کرد. برای انجام این کار باید خودمان اقدام کنیم. برای این کار دستور زیر را اجرا کنید:

$ helm dependency update ./ingress/
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈Happy Helming!⎈
Saving 1 charts
Downloading nginx-ingress from repo https://kubernetes-charts.storage.googleapis.com/
Deleting outdated charts

داخل فولدر ingress/charts یک فایل جدید به نام nginx-ingress-1.36.0.tgz ظاهر خواهد شد.

حالا می‌توانیم یک قالب برای Ingress تعریف کنیم؛ این قالب در فولدر ./templates قرار خواهد گرفت و نام آن ingress.yaml خواهد بود:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: {{ .Values.ingress.name }}
  annotations:
    kubernetes.io/ingress.class: {{ .Values.ingress.annotations.class }}
spec:
  rules:
  {{- range .Values.ingress.hosts }}
    - host: {{ .host | quote }}
      http:
        paths:
        {{- range .paths }}
          - path: {{ .path }}
            backend:
              serviceName: {{ .backend.serviceName }}
              servicePort: {{ .backend.servicePort }}
        {{- end }}
  {{- end }}

بخش جالب در قسمت مشخصات (specification) است. در اینجا دو حلقه تو در تو وجود دارد که توسط آنها، می‌توانید چندین هاست و چندین مسیر برای هر هاست تعریف کنید.

همچنین، در اینجا یک فایل پیش‌فرض values.yaml داریم:

ingress:
  name: ingress-service
  replicaCount: 1
  annotations: 
    class: nginx
  hosts:
    - host: chart-example.local
      paths: 
        - path: /
          backend:
            serviceName: serviceName
            servicePort: 8080

ساختار نهایی فولدرها به صورت زیر خواهد بود:

 ایجاد Helm Chart

خارج از چارت Ingress، حالا می‌توانیم یک فایل ingress.yaml ایجاد کنیم که تمام قوانین مسیریابی برای کلاستر ما را در برداشته باشد.

ingress:
  hosts:
    - host: adminer.k8s.com
      paths:
        - path: /
          backend:  
            serviceName: adminer
            servicePort: 8080
    - host: kanban.k8s.com
      paths: 
        - path: /api/
          backend:
            serviceName: kanban-app
            servicePort: 8080
        - path: /
          backend:
            serviceName: kanban-ui
            servicePort: 80

حالا می‌توانیم یک نسخه Helm ایجاد کنیم:

$ helm install -f ingress.yaml ingress ./ingress
NAME: ingress
LAST DEPLOYED: Tue Apr 14 07:22:44 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
$ helm list
NAME       NAMESPACE  REVISION  STATUS    CHART          APP VERSION
adminer    default    1         deployed  app-0.1.0      1.16.0     
ingress    default    1         deployed  ingress-0.1.0  1.16.0     
kanban-app default    1         deployed  app-0.1.0      1.16.0     
kanban-ui  default    1         deployed  app-0.1.0      1.16.0     
postgres   default    1         deployed  postgres-0.1.0 1.16.0
$ kubectl get deployments
NAME                                    READY  UP-TO-DATE  AVAILABLE
adminer                                 1/1    1           1           
ingress-nginx-ingress-controller        1/1    1           1           
ingress-nginx-ingress-default-backend   1/1    1           1           
kanban-app                              1/1    1           1           
kanban-ui                               1/1    1           1           
postgres        

در آخر، هر سه اپلیکیشن روی کلاستر کوبرنتیز دیپلوی شده است.

نصب و راه‌اندازی Kubernetes روی سرور فیزیکی (بدون مجازی‌سازی) را در مقاله زیر مطالعه کنید.
نصب Kubernetes روی سرور مجازی

جمع‌بندی

در این مقاله، نحوه استفاده از Helm برای کاهش کارهای تکراری را آموزش داده و توضیح دادیم که چگونه می‌توان از یک قالب(template) واحد برای استقرار چندین اپلیکیشن در یک کلاستر Kubernetes استفاده کرد. امیدواریم این مقاله برای شما مفید بوده باشد.

سوالات متداول

Helm چیست و چرا باید از آن استفاده کنیم؟

Helm یک ابزار مدیریت پکیج برای Kubernetes است که فرایند نصب و مدیریت اپلیکیشن‌ها را ساده می‌کند. به کمک Helm، می‌توان اپلیکیشن‌ها را به‌راحتی از طریق چارت‌ها (Charts) نصب کرد، پیکربندی کرد و حتی به‌روزرسانی کرد بدون اینکه نیاز به نوشتن فایل‌های YAML پیچیده باشد.

چگونه یک Helm Chart بسازم؟

برای ساخت یک Helm Chart ابتدا باید دستور helm create <chart-name> را اجرا کنید.

آیا می‌توانم از چارت‌های آماده Helm استفاده کنم؟

بله، Helm مجموعه‌ای از چارت‌های آماده برای اپلیکیشن‌های مختلف مانند Prometheus، MySQL و بسیاری دیگر دارد که می‌توانید به راحتی آن‌ها را نصب کرده و پیکربندی کنید.

چگونه می‌توانم مقادیر پیش‌فرض در فایل values.yaml را تغییر دهم؟

مقادیر پیش‌فرض را در فایل values.yaml تغییر دهید.

چطور می‌توانم یک چارت را به‌روزرسانی کنم؟

برای به‌روزرسانی یک چارت، کافی است تغییرات لازم را در فایل‌های چارت یا values.yaml اعمال کنید و سپس از دستور helm upgrade استفاده کنید.

چه ابزارهایی برای استفاده از Helm نیاز است؟

  • Docker برای ساخت و اجرای کانتینرها
  • Minikube برای ساخت کلاستر Kubernetes محلی
  • kubectl برای ارتباط با Kubernetes
  • Helm برای مدیریت چارت‌ها

به اشتراک بگذارید