- үшін қаптама , бұл көптеген рульдік шығарылымдарды бір жерде сипаттауға, олардың диаграммаларын бірнеше орталар үшін параметрлеуге, сондай-ақ оларды орналастыру тәртібін орнатуға мүмкіндік береді.
Сіз helmfile өзі және оны пайдалану мысалдары туралы оқи аласыз и .
Біз helmfile ішіндегі шығарылымдарды сипаттаудың айқын емес тәсілдерімен танысамыз
Бізде рульдік диаграммалар пакеті (мысалы, postgres және кейбір серверлік қолданбаларды айталық) және бірнеше орталар (бірнеше кубернет кластерлері, бірнеше аттар кеңістігі немесе екеуінің бірнешеуі) бар делік. Біз руль файлын алып, құжаттаманы оқып, орталарымыз бен шығарылымдарымызды сипаттай бастаймыз:
.
├── envs
│ ├── devel
│ │ └── values
│ │ ├── backend.yaml
│ │ └── postgres.yaml
│ └── production
│ └── values
│ ├── backend.yaml
│ └── postgres.yaml
└── helmfile.yamlhelmfile.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 postgres-ті шығарыңыз, өйткені біз дерекқорды k8-ге көшірудің қажеті жоқ екенін білеміз және сату үшін бізде тамаша бөлек postgres кластері бар ма? Бұл мәселені шешу үшін бізде белгілер бар
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.yamlreleases/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 сияқты басқа бөліктерді) шаблон жасай аласыз.
Бұл жағдайда postgres шығарылымы тіпті өндіріс сипаттамасына қосылмайды. Өте ыңғайлы!
Шығарылымдар үшін қайта анықталатын жаһандық мәндер
Әрине, әр орта үшін руль диаграммалары үшін мәндерді орнатуға болатыны өте жақсы, бірақ бізде сипатталған бірнеше орта болса және біз, мысалы, барлығына бірдей орнатуды қалаймыз. 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.yamlreleases/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.yamlenvs/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.yamlhelmfile.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 }}Жазба
Постгрес диаграммасына кіру өте күмәнді нәрсе екені анық, сондықтан бұл мақала вакуумдағы сфералық мысал ретінде және мақалаға кіруді сипаттау үшін жаңа шығарылымды енгізбеу үшін берілген.
Қоршаған орта құндылықтарынан құпияларды ауыстыру
Жоғарыдағы мысалға ұқсас, сіз шифрланғандарды пайдалана отырып алмастыра аласыз мағыналары. Диаграмма үшін шифрланған мәндерді анықтай алатын әрбір шығарылым үшін жеке құпия файлды жасаудың орнына, біз default.yaml.gotmpl шығарылымында анықталған айнымалылардан алынатын мәндерді анықтай аламыз. орта деңгейі. Біз ешкімнен жасырудың қажеті жоқ құндылықтарды белгілі бір ортадағы шығарылым мәндерінде оңай анықтауға болады.
.
├── 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.yamlhelmfile.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.domainenvs/production/values/backend.yaml
elasticsearch:
host: elastic-0.production.domainЖазба
Айтпақшы, getOrNil - helmfile ішіндегі go шаблондары үшін арнайы функция, ол тіпті егер .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" }}Ақпарат көзі: www.habr.com
