మీరు హెల్మ్ఫైల్ గురించి మరియు దాని ఉపయోగం యొక్క ఉదాహరణల గురించి చదువుకోవచ్చు
హెల్మ్ఫైల్లో విడుదలలను వివరించడానికి స్పష్టమైన మార్గాలతో మేము పరిచయం చేస్తాము
మేము హెల్మ్ చార్ట్ల ప్యాక్ని కలిగి ఉన్నామని అనుకుందాం (ఉదాహరణకు, పోస్ట్గ్రెస్ మరియు కొన్ని బ్యాకెండ్ అప్లికేషన్ అనుకుందాం) మరియు అనేక వాతావరణాలు (అనేక కుబెర్నెట్స్ క్లస్టర్లు, అనేక నేమ్స్పేస్లు లేదా రెండింటిలో అనేకం). మేము హెల్మ్ఫైల్ని తీసుకుంటాము, డాక్యుమెంటేషన్ను చదివి, మా పరిసరాలను మరియు విడుదలలను వివరించడం ప్రారంభిస్తాము:
.
├── 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 పరిసరాలతో ముగించాము: devel, ఉత్పత్తి - ప్రతి ఒక్కటి హెల్మ్ విడుదల చార్ట్ల కోసం దాని స్వంత విలువలను కలిగి ఉంటుంది. మేము వాటిని ఇలా అమలు చేస్తాము:
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:
యామల్ సెపరేటర్ను ఉపయోగించడం అవసరం ---
, తద్వారా మీరు పర్యావరణాల నుండి విలువలతో విడుదలలను (మరియు హెల్మ్డిఫాల్ట్ల వంటి ఇతర భాగాలు) టెంప్లేట్ చేయవచ్చు
ఈ సందర్భంలో, పోస్ట్గ్రెస్ విడుదల ఉత్పత్తి కోసం వివరణలో కూడా చేర్చబడదు. చాలా సౌకర్యవంతంగా!
విడుదలల కోసం ఓవర్రైడబుల్ గ్లోబల్ విలువలు
వాస్తవానికి, మీరు ప్రతి పర్యావరణం కోసం హెల్మ్ చార్ట్ల కోసం విలువలను సెట్ చేయడం చాలా బాగుంది, అయితే మనకు అనేక వాతావరణాలు వివరించబడి ఉంటే మరియు ఉదాహరణకు, అందరికీ ఒకే విధంగా సెట్ చేయాలనుకుంటున్నాము 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
, కాబట్టి అది టెంప్లేట్ ఇంజిన్ ద్వారా అమలు చేయబడాలని హెల్మ్ఫైల్కు తెలుసు.
.
├── 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
- హెల్మ్ఫైల్లోని గో టెంప్లేట్ల కోసం ఒక ప్రత్యేక ఫంక్షన్, ఇది కూడా .Values.secrets
ఉనికిలో ఉండదు, లోపాన్ని త్రో చేయదు, కానీ ఫంక్షన్ ఉపయోగించి ఫలితాన్ని అనుమతిస్తుంది default
ప్రత్యామ్నాయ డిఫాల్ట్ విలువ
తీర్మానం
వివరించిన విషయాలు చాలా స్పష్టంగా కనిపిస్తున్నాయి, కానీ హెల్మ్ఫైల్ని ఉపయోగించి అనేక వాతావరణాలకు విస్తరణ యొక్క అనుకూలమైన వివరణపై సమాచారం చాలా తక్కువగా ఉంది మరియు నేను IaC (ఇన్ఫ్రాస్ట్రక్చర్-కోడ్-కోడ్)ను ప్రేమిస్తున్నాను మరియు విస్తరణ స్థితి గురించి స్పష్టమైన వివరణను కలిగి ఉండాలనుకుంటున్నాను.
ముగింపులో, డిఫాల్ట్ ఎన్విరాన్మెంట్ కోసం వేరియబుల్స్, ఒక నిర్దిష్ట రన్నర్ యొక్క OS యొక్క ఎన్విరాన్మెంట్ వేరియబుల్స్తో పారామితి చేయబడవచ్చని నేను జోడించాలనుకుంటున్నాను, దాని నుండి డిప్లాయ్మెంట్ ప్రారంభించబడుతుంది మరియు తద్వారా డైనమిక్ ఎన్విరాన్మెంట్లను పొందవచ్చు.
helmfile.yaml
environments:
default:
values:
- global:
clusterDomain: {{ env "CLUSTER_DOMAIN" | default "cluster.local" }}
ingressDomain: {{ env "INGRESS_DOMAIN" }}
మూలం: www.habr.com