برنامه نویسی

نمودارهای فرمان آماده استقرار ساختمان – انجمن DEV

Helm ابزاری قدرتمند برای مدیریت برنامه های Kubernetes است که به شما امکان می دهد منابع را به طور موثر بسته بندی، پیکربندی و مستقر کنید. در این راهنما، با ساختن قالب‌های قابل استفاده مجدد برای اجزای رایج Kubernetes، شما را در ایجاد نمودارهای Helm آماده استقرار راهنمایی می‌کنیم.


خلاصه ای از وبلاگ های قبلی

  1. ساختن اولین نمودار هلم:

    • اصول اولیه Helm، از جمله نصب، ساختار نمودار، و استقرار اولین برنامه شما را توضیح داد.
  2. اجزای نمودار هلم پیشرفته:

    • پوشش تکنیک های الگوسازی پیشرفته، منطق شرطی، و استفاده از values.yaml تا نمودارها پویا و انعطاف پذیر باشند.

اجزای مشترک برای استقرار

برای استقرار یک برنامه با استفاده از Kubernetes، معمولاً به منابع زیر نیاز دارید:

  1. استقرار:

    • وضعیت مورد نظر پادهای برنامه را مدیریت می کند، مقیاس پذیری را تضمین می کند و به روز رسانی های چرخشی را فعال می کند.
  2. خدمات:

    • برنامه شما را در داخل خوشه یا خارجی نمایش می دهد.
  3. ورود:

    • مسیریابی ترافیک HTTP/S به خدمات را با استفاده از دامنه ها و مسیرهای سفارشی مدیریت می کند.
  4. ConfigMap:

    • داده های پیکربندی غیر حساس را در قالب کلید-مقدار ذخیره می کند.
  5. اسرار:

    • به طور ایمن اطلاعات حساس مانند اعتبار پایگاه داده یا کلیدهای API را ذخیره می کند.
  6. حساب خدمات:

    • هویتی برای پادهای برنامه برای تعامل با خوشه یا سیستم های خارجی فراهم می کند.

مراحل ساخت نمودار فرمان آماده استقرار

مرحله 1: یک نمودار هلم ایجاد کنید

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

helm create myapp
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

تمام فایل های موجود در myapp/templates/ پوشه برای شروع تازه


مرحله 2: قالب ها را تعریف کنید

از الگوهای زیر برای تعریف منابع قابل استفاده مجدد و قابل تنظیم استفاده کنید.

_helpers.tpl

{{- define "namespace" -}}
{{- printf "%s-%s-%s" .Values.productName .Values.clientName .Values.envName -}}
{{- end -}}

{{- define "serviceAccountName" -}}
{{- printf "%s-%s-%s-sa" .Values.productName .Values.clientName .Values.envName -}}
{{- end -}}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این کمک کننده ها الگوهای قابل استفاده مجدد را برای نامگذاری منابع به صورت پویا بر اساس تعریف می کنند values.yaml.

فضای نام: با ترکیب productName، clientName و envName یک شناسه فضای نام می سازد.
ServiceAccountName: یک نام منحصر به فرد برای حساب سرویس با استفاده از اجزای یکسان ایجاد می کند.

  • Purpose: این توابع به صورت پویا نام هایی را برای فضاهای نام و حساب های سرویس بر اساس مقادیر تعریف شده در values.yaml تولید می کنند.
  • استفاده: کلمه کلیدی الگو این توابع را در قالب های دیگر فراخوانی می کند.

Deployment Template

{{- range $key, $service := .Values.services }}
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ $key }}-deploy
  labels:
    app: {{ $key }}
spec:
  replicas: {{ $service.replicas | default 2 }}
  selector:
    matchLabels:
      app: {{ $key }}
  template:
    metadata:
      labels:
        app: {{ $key }}
    spec:
      serviceAccountName: {{ template "serviceAccountName" $ }}
      containers:
      - name: {{ $key }}
        image: {{ $.Values.ecr }}/{{ $key }}:{{ $service.version }}
        ports:
        - containerPort: {{ $service.port }}
        resources:
          requests:
            memory: {{ $service.requestMemory | default $.Values.defaultRequestMemory | default "1024Mi"}}
{{- end }}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • برای حلقه: تابع محدوده روی هر آیتم در شیء .Values.services از تکرار می شود values.yaml.
    • برای هر جفت کلید-مقدار سرویس، یک منبع Deployment ایجاد می شود.
  • مقادیر دینامیک:
    {{ $key }} نام سرویس است.
    {{ $service. }} خصوصیات (مانند کپی، پورت و غیره) را از ورودی مربوطه در بازیابی می کند values.yaml.

ConfigMap Template

{{- range $key, $cm := .Values.configmaps }}
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ $key }}
  annotations:
    ssm-loader:  "true"
    ssm-parameter-name: {{ $cm | default "null" }}
    region: {{ $.Values.region | default "us-west-2" }}
{{- end -}}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • این الگو از طریق حلقه باز می شود .Values.configmaps برای ایجاد منابع Configmap برای هر برنامه.
  • می توانید استفاده کنید annotations.ssm-parameter-name برای واکشی پیکربندی از فروشگاه پارامتر aws یا هر سیستم مدیریت پیکربندی دیگر.
  • و حاشیه نویسی های دیگری را برای پاسخگویی به نیازهای برنامه خود اضافه کنید

Service Template

{{- range $key, $service := .Values.services }}
---
apiVersion: v1
kind: Service
metadata:
  name: {{ $key }}-service
spec:
  selector:
    app: {{ $key }}
  ports:
  - protocol: TCP
    port: {{ $service.port }}
    targetPort: {{ $service.port }}
{{- end }}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • این الگو از طریق حلقه باز می شود .Values.services برای ایجاد یک منبع سرویس برای هر برنامه
  • انتخابگر اطمینان می‌دهد که سرویس ترافیک را به پادهای صحیح هدایت می‌کند (مطابق با برنامه: {{ $key }}).

Ingress Template

{{ $c := 1 | int }}
{{- range $key, $service := .Values.services }}
{{- $albdomain := printf "%s-%s-%s.%s" $key $.Values.clientName $.Values.envName $.Values.topLevelDomain -}}

{{- if $service.alb }}
---
# ALB Ingress Configuration
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: {{ $key }}-alb-ingress
  annotations:
    kubernetes.io/ingress.class: "alb"
    alb.ingress.kubernetes.io/group.name: {{ template "namespace" $}}-ingress-group
    alb.ingress.kubernetes.io/group.order: '{{ $c }}'
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}]'
    alb.ingress.kubernetes.io/certificate-arn: {{ $.Values.certArn }}
    alb.ingress.kubernetes.io/healthcheck-protocol: HTTP
    alb.ingress.kubernetes.io/healthcheck-port: '{{ $service.port }}'
    alb.ingress.kubernetes.io/healthcheck-path: {{ $service.healthCheck | default "/util/health" }}
    alb.ingress.kubernetes.io/healthcheck-interval-seconds: {{ $service.healthCheckInterval | default "'30'" }}
    alb.ingress.kubernetes.io/healthcheck-timeout-seconds: {{ $service.healthCheckTimeout | default "'5'" }}
    alb.ingress.kubernetes.io/success-codes: {{ $service.healthCheckSuccessCode | default "'200'" }}
    alb.ingress.kubernetes.io/healthy-threshold-count: '2'
    alb.ingress.kubernetes.io/unhealthy-threshold-count: '2'
    alb.ingress.kubernetes.io/load-balancer-attributes: 'routing.http2.enabled=true,idle_timeout.timeout_seconds=600'
    alb.ingress.kubernetes.io/target-group-attributes: 'deregistration_delay.timeout_seconds=30, slow_start.duration_seconds=0'
    alb.ingress.kubernetes.io/ssl-policy: ELBSecurityPolicy-TLS-1-2-Ext-2018-06
spec:
  # ALB Ingress specification
  rules:
  - host: {{ default $albdomain $service.domain }}
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: {{ $key }}-service
            port:
              number: {{ $service.port }}
    # ALB spec continues...
{{ $c = add1 $c }}
{{- end }}

{{- if $service.nlb }}
---
# NLB Ingress Configuration
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: {{ $key }}-nlb-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/use-forwarded-headers: "true"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  # NLB Ingress specification
  rules:
  - host: {{ $service.nlbdomain }} 
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: {{ $key }}-service
            port:
              number: {{ $service.port }}
    # NLB spec continues...
{{ $c = add1 $c }}
{{- end }}
{{- end }}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • برای هر سرویس یک ورودی ایجاد می کند.
  • ترافیک HTTP را به سرویس صحیح هدایت می کند.

Secrets Template

{{- range $key, $secret := .Values.secrets }}
---
apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: {{ $key }}
  annotations:
    secret-loader: "true"
    secret-name: {{ $secret | default "null" }}
    region: {{ $.Values.region | default "us-west-2" }}
{{- end }}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • این الگو از طریق حلقه باز می شود .Values.secrets برای ایجاد منابع مخفی برای هر برنامه.
  • می توانید استفاده کنید annotations.secret-name برای واکشی اسرار از aws secrets manager یا هر سیستم مدیریت اسرار دیگری.
  • و حاشیه نویسی های دیگری را برای پاسخگویی به نیازهای برنامه خود اضافه کنید

ServiceAccount Template

{{- if .Values.createServiceAccount }}
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: {{ template "serviceAccountName" . }}
  annotations:
    eks.amazonaws.com/role-arn: {{ .Values.serviceAccountRole }}
{{- end }}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


مرحله 3: سفارشی کردن values.yaml

در اینجا یک مثال values.yaml برای مرجع آورده شده است:

productName: myapp
clientName: generic
envName: dev
ecr: mydockerhub.io
certArn: arn:aws:acm:::certificate/
region: us-west-2
defaultRequestMemory: 512Mi
services:
  app-service:
    replicas: 3
    port: 8080
    healthCheck : /actuator/health
    version: latest
    configList:
      - app-config
    secretList:
      - db-secret
    nlb: true
    nlbdomain: app-service.example.com
  frontend-service:
    replicas: 3
    port: 8080
    healthCheck : /actuator/health
    version: latest
    configList:
      - app-config
    secretList:
      - db-secret
    alb:true
configmaps:
  app-config: myapp-config
secrets:
  db-secret: myapp-db-credentials
createServiceAccount: true
serviceAccountRole: arn:aws:iam::123456789012:role/myapp-role
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

قالب ها چگونه کار می کنند

  • حلقه های پویا: range تابع حلقه می شود .Values. برای تولید منابع برای هر سرویس تعریف شده در values.yaml.
  • متغیرهای: متغیرهایی مانند {{ $key }} به صورت پویا مقادیر را تزریق کنید.
  • پیش فرض ها: | default اگر ویژگی های خاصی تنظیم نشده باشند، مقادیر بازگشتی را تضمین می کند values.yaml.

مرحله 4: تست الگوها بدون استقرار

می‌توانید بدون استفاده از الگوها اعتبارسنجی و رندر کنید helm template یا helm install --dry-run:

  helm template myapp/
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این مانیفست کاملاً رندر شده Kubernetes را برای بازرسی خروجی می دهد.

  helm install myapp ./myapp --values external_values.yaml --dry-run --debug
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

استقرار را شبیه سازی می کند و مانیفست های رندر شده و مسائل بالقوه را ارائه می دهد.

توجه: اینجا external_values.yaml می تواند برای لغو پیش فرض شما استفاده شود values.yaml

مرحله 5: استقرار نمودار

پس از تأیید، نمودار را در خوشه Kubernetes خود مستقر کنید:

helm install myapp ./myapp --values values.yaml
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این خواهد شد:

الگوها را با استفاده از مقادیر از values.yaml.
مانیفست های Kubernetes حاصل را روی خوشه اعمال کنید.

برای ارتقاء استقرار موجود:

helm upgrade myapp ./myapp --values values.yaml
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نتیجه گیری

این راهنما نحوه ساخت نمودار هلم قابل استفاده مجدد را نشان می دهد و الگوها و رفتار پویا آنها را توضیح می دهد. با استفاده از حلقه‌ها و مکان‌نماها، می‌توانید یک نمودار منعطف و منعطف را تعریف کنید که متناسب با نیازهای برنامه شما باشد. از قالب فرمان و –dry-run برای اعتبارسنجی قبل از استقرار استفاده کنید و از عرضه روان به محیط Kubernetes خود اطمینان حاصل کنید.

نوشته های مشابه

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

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

دکمه بازگشت به بالا