ስለ helmfile እራሱ እና ስለ አጠቃቀሙ ምሳሌዎች ማንበብ ይችላሉ።
በhelmfile ውስጥ የተለቀቁትን ለመግለጽ ግልጽ ካልሆኑ መንገዶች ጋር እንተዋወቃለን።
የሄልም ገበታዎች ስብስብ አለን እንበል (ለምሳሌ፣ ፖስትግሬስ እና አንዳንድ የጀርባ አፕሊኬሽን እንበል) እና በርካታ አከባቢዎች (በርካታ kubernetes ዘለላዎች፣ በርካታ የስም ቦታዎች ወይም ከሁለቱም ብዙ)። የራስ ወረቀቱን ወስደን፣ ሰነዶቹን እናነባለን እና አካባቢያችንን እና የተለቀቁትን መግለጽ እንጀምራለን፡
.
├── envs
│ ├── devel
│ │ └── values
│ │ ├── backend.yaml
│ │ └── postgres.yaml
│ └── production
│ └── values
│ ├── backend.yaml
│ └── postgres.yaml
└── helmfile.yaml
helmfile.yaml
environments:
devel:
production:
releases:
- name: postgres
labels:
app: postgres
wait: true
chart: stable/postgresql
version: 8.4.0
values:
- envs/{{ .Environment.Name }}/values/postgres.yaml
- name: backend
labels:
app: backend
wait: true
chart: private-helm-repo/backend
version: 1.0.5
needs:
- postgres
values:
- envs/{{ .Environment.Name }}/values/backend.yaml
በ 2 አካባቢዎች ጨርሰናል፡- ዴቬል, ምርት - እያንዳንዱ ለዋና መልቀቂያ ገበታዎች የራሱ እሴቶች አሉት። እኛ እነሱን እንደሚከተለው እናሰማራቸዋለን-
helmfile -n <namespace> -e <env> apply
በተለያዩ አካባቢዎች ውስጥ የተለያዩ የሄልም ገበታዎች ስሪቶች
የጀርባውን የተለያዩ ስሪቶች ወደ ተለያዩ አካባቢዎች መልቀቅ ብንፈልግስ? የመልቀቂያ ሥሪት እንዴት እንደሚለካ? በኩል የሚገኙ የአካባቢ እሴቶች {{ .Values }}
helmfile.yaml
environments:
devel:
+ values:
+ - charts:
+ versions:
+ backend: 1.1.0
production:
+ values:
+ - charts:
+ versions:
+ backend: 1.0.5
...
- name: backend
labels:
app: backend
wait: true
chart: private-helm-repo/backend
- version: 1.0.5
+ version: {{ .Values.charts.versions.backend }}
...
በተለያዩ አካባቢዎች ውስጥ የተለያዩ የመተግበሪያዎች ስብስብ
በጣም ጥሩ፣ ግን ካላስፈልገን ምን ማድረግ አለብን production
ፖስትግሬስን መልቀቅ፣ ምክንያቱም ዳታቤዙን ወደ k8s መጫን እንደማያስፈልገን ስለምናውቅ እና ለሽያጭ የተለየ የፖስታ ክላስተር እንዳለን እናውቃለን? ይህንን ችግር ለመፍታት መለያዎች አሉን።
helmfile -n <namespace> -e devel apply
helmfile -n <namespace> -e production -l app=backend apply
ይህ በጣም ጥሩ ነው, ነገር ግን በግሌ የማስጀመሪያ ክርክሮችን ሳይጠቀሙ በአካባቢያቸው ውስጥ የትኞቹ መተግበሪያዎች እንደሚተገበሩ መግለጽ እመርጣለሁ, ነገር ግን በአከባቢው መግለጫ ውስጥ. ምን ለማድረግ? የመልቀቂያ መግለጫዎችን በተለየ አቃፊ ውስጥ ማስቀመጥ, በአካባቢው መግለጫ ውስጥ አስፈላጊ የሆኑትን የተለቀቁትን ዝርዝር መፍጠር እና አስፈላጊ የሆኑትን ልቀቶች ብቻ "ማንሳት" ይችላሉ, የተቀሩትን ችላ በማለት.
.
├── envs
│ ├── devel
│ │ └── values
│ │ ├── backend.yaml
│ │ └── postgres.yaml
│ └── production
│ └── values
│ ├── backend.yaml
│ └── postgres.yaml
+ ├── releases
+ │ ├── backend.yaml
+ │ └── postgres.yaml
└── helmfile.yaml
helmfile.yaml
environments:
devel:
values:
- charts:
versions:
backend: 1.1.0
- apps:
- postgres
- backend
production:
values:
- charts:
versions:
backend: 1.0.5
- apps:
- backend
- releases:
- - name: postgres
- labels:
- app: postgres
- wait: true
- chart: stable/postgresql
- version: 8.4.0
- values:
- - envs/{{ .Environment.Name }}/values/postgres.yaml
- - name: backend
- labels:
- app: backend
- wait: true
- chart: private-helm-repo/backend
- version: {{ .Values.charts.versions.backend }}
- needs:
- - postgres
- values:
- - envs/{{ .Environment.Name }}/values/backend.yaml
+ ---
+ bases:
+ {{- range .Values.apps }}
+ - releases/{{ . }}.yaml
+ {{- end }}
releases/postgres.yaml
releases:
- name: postgres
labels:
app: postgres
wait: true
chart: stable/postgresql
version: 8.4.0
values:
- envs/{{ .Environment.Name }}/values/postgres.yaml
releases/backend.yaml
releases:
- name: backend
labels:
app: backend
wait: true
chart: private-helm-repo/backend
version: {{ .Values.charts.versions.backend }}
needs:
- postgres
values:
- envs/{{ .Environment.Name }}/values/backend.yaml
ማስታወሻው
ሲጠቀሙ bases:
የያምል መለያየትን መጠቀም አስፈላጊ ነው ---
ልቀቶችን (እና ሌሎች ክፍሎችን፣ እንደ helmDefaults ያሉ) ከአካባቢው እሴቶች ጋር አብነት ማድረግ እንዲችሉ
በዚህ ሁኔታ, የድህረ-ገጽ መለቀቅ ለምርት መግለጫው እንኳን አይካተትም. በጣም ምቹ!
ለመልቀቂያዎች እጅግ በጣም አስደናቂ የሆኑ ዓለም አቀፍ እሴቶች
በእርግጥ ለእያንዳንዱ አካባቢ ለሄም ገበታዎች እሴቶችን ማዋሉ በጣም ጥሩ ነው ፣ ግን ብዙ አከባቢዎች ከተገለፁን እና እኛ ለምሳሌ ለሁሉም ተመሳሳይ ነገር ማዘጋጀት እንፈልጋለን። affinity
, ነገር ግን በመዞር ውስጥ በተቀመጡት ቻርቶች ውስጥ በነባሪነት ማዋቀር አንፈልግም.
በዚህ ሁኔታ ፣ ለእያንዳንዱ ልቀት 2 ፋይሎችን ከእሴቶች ጋር ልንገልጽ እንችላለን-የመጀመሪያው በነባሪ እሴቶች ፣ እሱም የገበታውን ዋጋዎች የሚወስነው እና ሁለተኛው ለአካባቢው እሴቶች ፣ ይህም በተራው ደግሞ ነባሪ የሆኑትን።
.
├── envs
+ │ ├── default
+ │ │ └── values
+ │ │ ├── backend.yaml
+ │ │ └── postgres.yaml
│ ├── devel
│ │ └── values
│ │ ├── backend.yaml
│ │ └── postgres.yaml
│ └── production
│ └── values
│ ├── backend.yaml
│ └── postgres.yaml
├── releases
│ ├── backend.yaml
│ └── postgres.yaml
└── helmfile.yaml
releases/backend.yaml
releases:
- name: backend
labels:
app: backend
wait: true
chart: private-helm-repo/backend
version: {{ .Values.charts.versions.backend }}
needs:
- postgres
values:
+ - envs/default/values/backend.yaml
- envs/{{ .Environment.Name }}/values/backend.yaml
envs/default/values/backend.yaml
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app.kubernetes.io/name
operator: In
values:
- backend
topologyKey: "kubernetes.io/hostname"
በአካባቢ ደረጃ ላሉ ሁሉም ልቀቶች ለዋና ገበታዎች ዓለም አቀፍ እሴቶችን መግለጽ
በበርካታ ልቀቶች ውስጥ ብዙ መግቢያዎችን እንፈጥራለን እንበል - ለእያንዳንዱ ገበታ በእጃችን መግለፅ እንችላለን hosts:
, ነገር ግን በእኛ ሁኔታ ጎራ ተመሳሳይ ነው, ስለዚህ ለምን በአንዳንድ አለምአቀፍ ተለዋዋጭ ውስጥ አታስቀምጠው እና በቀላሉ እሴቱን ወደ ገበታዎች አትተካውም? ይህንን ለማድረግ እነዚያ እሴቶች ያላቸው ፋይሎች መለካት የምንፈልጋቸው ቅጥያ ሊኖራቸው ይገባል። .gotmpl
, ስለዚህ helmfile በአብነት ሞተር ውስጥ መሮጥ እንዳለበት ያውቃል።
.
├── envs
│ ├── default
│ │ └── values
- │ │ ├── backend.yaml
- │ │ ├── postgres.yaml
+ │ │ ├── backend.yaml.gotmpl
+ │ │ └── postgres.yaml.gotmpl
│ ├── devel
│ │ └── values
│ │ ├── backend.yaml
│ │ └── postgres.yaml
│ └── production
│ └── values
│ ├── backend.yaml
│ └── postgres.yaml
├── releases
│ ├── backend.yaml
│ └── postgres.yaml
└── helmfile.yaml
helmfile.yaml
environments:
devel:
values:
- charts:
versions:
backend: 1.1.0
- apps:
- postgres
- backend
+ - global:
+ ingressDomain: k8s.devel.domain
production:
values:
- charts:
versions:
backend: 1.0.5
- apps:
- backend
+ - global:
+ ingressDomain: production.domain
---
bases:
{{- range .Values.apps }}
- releases/{{ . }}.yaml
{{- end }}
envs/default/values/backend.yaml.gotmpl
ingress:
enabled: true
paths:
- /api
hosts:
- {{ .Values.global.ingressDomain }}
envs/default/values/postgres.yaml.gotmpl
ingress:
enabled: true
paths:
- /
hosts:
- postgres.{{ .Values.global.ingressDomain }}
ማስታወሻው
በድህረ ገበታ ውስጥ መግባት በጣም አጠራጣሪ ነገር እንደሆነ ግልጽ ነው፣ ስለዚህ ይህ መጣጥፍ በቫኩም ውስጥ እንደ ሉላዊ ምሳሌ እና በጽሁፉ ውስጥ የተወሰነ አዲስ ልቀት ላለማስተዋወቅ ብቻ የተሰጠ ነው።
ሚስጥሮችን ከአካባቢያዊ እሴቶች መተካት
ከላይ ካለው ምሳሌ ጋር በማመሳሰል የተመሰጠሩትን በመጠቀም መተካት ይችላሉ።
.
├── envs
│ ├── default
│ │ └── values
│ │ ├── backend.yaml
│ │ └── postgres.yaml
│ ├── devel
│ │ ├── values
│ │ │ ├── backend.yaml
│ │ │ └── postgres.yaml
+ │ │ └── secrets.yaml
│ └── production
│ ├── values
│ │ ├── backend.yaml
│ │ └── postgres.yaml
+ │ └── secrets.yaml
├── releases
│ ├── backend.yaml
│ └── postgres.yaml
└── helmfile.yaml
helmfile.yaml
environments:
devel:
values:
- charts:
versions:
backend: 1.1.0
- apps:
- postgres
- backend
- global:
ingressDomain: k8s.devel.domain
+ secrets:
+ - envs/devel/secrets.yaml
production:
values:
- charts:
versions:
backend: 1.0.5
- apps:
- backend
- global:
ingressDomain: production.domain
+ secrets:
+ - envs/production/secrets.yaml
---
bases:
{{- range .Values.apps }}
- releases/{{ . }}.yaml
{{- end }}
envs/devel/secrets.yaml
secrets:
elastic:
password: ENC[AES256_GCM,data:hjCB,iv:Z1P6/6xBJgJoKLJ0UUVfqZ80o4L84jvZfM+uH9gBelc=,tag:dGqQlCZnLdRAGoJSj63rBQ==,type:int]
...
envs/production/secrets.yaml
secrets:
elastic:
password: ENC[AES256_GCM,data:ZB/VpTFk8f0=,iv:EA//oT1Cb5wNFigTDOz3nA80qD9UwTjK5cpUwLnEXjs=,tag:hMdIUaqLRA8zuFBd82bz6A==,type:str]
...
envs/default/values/backend.yaml.gotmpl
elasticsearch:
host: elasticsearch
port: 9200
password: {{ .Values | getOrNil "secrets.elastic.password" | default "password" }}
envs/devel/values/backend.yaml
elasticsearch:
host: elastic-0.devel.domain
envs/production/values/backend.yaml
elasticsearch:
host: elastic-0.production.domain
ማስታወሻው
በነገራችን ላይ, getOrNil
- በ helmfile ውስጥ ለሂድ አብነቶች ልዩ ተግባር ፣ ምንም እንኳን .Values.secrets
አይኖርም, ስህተት አይጥልም, ነገር ግን ተግባሩን በመጠቀም ውጤቱን ይፈቅዳል default
ተተኪ ነባሪ እሴት
መደምደሚያ
የተገለጹት ነገሮች በጣም ግልፅ ይመስላሉ፣ ነገር ግን helmfileን በመጠቀም ወደ ተለያዩ አካባቢዎች ለማሰማራት ምቹ መግለጫ ላይ ያለው መረጃ በጣም አናሳ ነው፣ እና IaC (Infrastructure-as-code) እወዳለሁ እና ስለ ማሰማራቱ ሁኔታ ግልፅ መግለጫ እንዲኖረኝ እፈልጋለሁ።
ለማጠቃለል ያህል ፣ ለነባሪው አካባቢ ተለዋዋጮች በተራው ፣ ማሰማራቱ የሚጀመርበት የአንድ የተወሰነ ሯጭ የስርዓተ ክወና የአካባቢ ተለዋዋጮች ጋር ሊጣጣሙ እና ተለዋዋጭ አካባቢዎችን ማግኘት እንደሚችሉ ማከል እፈልጋለሁ።
helmfile.yaml
environments:
default:
values:
- global:
clusterDomain: {{ env "CLUSTER_DOMAIN" | default "cluster.local" }}
ingressDomain: {{ env "INGRESS_DOMAIN" }}
ምንጭ: hab.com