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

Helm ابزاری قدرتمند برای مدیریت برنامه های Kubernetes است که به شما امکان می دهد منابع را به طور موثر بسته بندی، پیکربندی و مستقر کنید. در این راهنما، با ساختن قالبهای قابل استفاده مجدد برای اجزای رایج Kubernetes، شما را در ایجاد نمودارهای Helm آماده استقرار راهنمایی میکنیم.
خلاصه ای از وبلاگ های قبلی
-
ساختن اولین نمودار هلم:
- اصول اولیه Helm، از جمله نصب، ساختار نمودار، و استقرار اولین برنامه شما را توضیح داد.
-
اجزای نمودار هلم پیشرفته:
- پوشش تکنیک های الگوسازی پیشرفته، منطق شرطی، و استفاده از
values.yaml
تا نمودارها پویا و انعطاف پذیر باشند.
- پوشش تکنیک های الگوسازی پیشرفته، منطق شرطی، و استفاده از
اجزای مشترک برای استقرار
برای استقرار یک برنامه با استفاده از Kubernetes، معمولاً به منابع زیر نیاز دارید:
-
استقرار:
- وضعیت مورد نظر پادهای برنامه را مدیریت می کند، مقیاس پذیری را تضمین می کند و به روز رسانی های چرخشی را فعال می کند.
-
خدمات:
- برنامه شما را در داخل خوشه یا خارجی نمایش می دهد.
-
ورود:
- مسیریابی ترافیک HTTP/S به خدمات را با استفاده از دامنه ها و مسیرهای سفارشی مدیریت می کند.
-
ConfigMap:
- داده های پیکربندی غیر حساس را در قالب کلید-مقدار ذخیره می کند.
-
اسرار:
- به طور ایمن اطلاعات حساس مانند اعتبار پایگاه داده یا کلیدهای API را ذخیره می کند.
-
حساب خدمات:
- هویتی برای پادهای برنامه برای تعامل با خوشه یا سیستم های خارجی فراهم می کند.
مراحل ساخت نمودار فرمان آماده استقرار
مرحله 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 خود اطمینان حاصل کنید.