The Art of Helm Chart: modèles des graphiques officiels de Kubernetes

L'installation et la gestion des graphiques Helm peuvent vous donner des complications que vous n'avez peut-être pas rencontrées auparavant.







Helm Charts met en package des applications pour l'installation dans des clusters Kubernetes. L'installation de Helm Chart est un peu comme le lancement



, donc les développeurs de Helm Chart sont confrontés à certains des mêmes problèmes que les développeurs qui font des installateurs:







  • Quelles hypothèses pouvez-vous faire sur l'environnement dans lequel vous installez?
  • L'application peut-elle interagir avec d'autres applications?
  • Quelles configurations devraient être disponibles pour l'utilisateur et comment devraient-elles être proposées?


Mais ces questions sont liées aux spécificités de Helm. Pour comprendre pourquoi, commençons par une image de ce qui se passe lorsque l'utilisateur se lance helm install



. Nous pouvons ensuite examiner comment certains des graphiques officiels de Kubernetes traitent ces problèmes.







Lancer l'imagehelm install





Je souhaite installer MySQL sur mon cluster. Mais je n'ai pas besoin de la version de MySQL qui stable/MySQL



s'installe dans le fichier values.yaml du référentiel officiel de graphiques . Donc, je crée mon propre fichier values.yaml



nommé mysql-values.yaml



avec une seule ligne:







imageTag: “5.7.10”
      
      





Puis je cours helm install stable/mysql --values=mysqlvalues.yaml



.







Helm (ignorant-camel



), MySQL . kubectl describe pod ignorant-camel-mysql-5dc6b947b-lf6p8



, imageTag



.







, , imageTag . helm install stabe/mysql --values=mysqlvalues.yaml --dry-run --debug



, Helm Kubernetes, .







Kubernetes , Helm Chart:







├── Chart.yaml
├── README.md
├── templates
│   ├── NOTES.txt
│   ├── _helpers.tpl
│   ├── deployment.yaml
│   ├── secrets.yaml
│   └── ...more yaml...
└── values.yaml
      
      





helm install stable/mysql



, values.yaml



Helm (, ) yaml , Kubernetes. helm install stable/mysql



, . , .







, values.yaml



— , , . , values.yaml



, , .







values.yaml



. , , . requirements.yaml



, , . , values.yaml



. , c Helm.







, ,



. , , — Helm Charts.







Helm



, Kubernetes . Helm Chart , , :

• , values.yaml



? , , , ?

• , , , ?

• , , (, )?

• , ?







, Helm Charts. , , , .







, , . Helm, . Helm , . .







, . , , , Helm 3 Lua. .







1.



, env, values.yaml



:







- name: ENV_VAR1
  value: {{ .Values.var1 }}
- name: ENV_VAR2
  value: {{ .Values.var2 }}
      
      





values.yaml



--set var1=foo



. , ? , , (, ENV_VAR1



var1



)? , . , , ?







Helm Charts, configmap



. / . configmap, unbound.conf. , . configmap



, :







{{- range .Values.localRecords }}
local-data: "{{ .name }} A {{ .ip }}"
local-data-ptr: "{{ .ip }} {{ .name }}"
{{- end }}
      
      





values.yaml localRecords



, :







localRecords:
- name: "fake3.host.net"
  ip: "10.12.10.10"
- name: "fake4.host.net"
  ip: "10.13.10.10"
      
      





Sonarqube chart , extraEnv



:







{{- range $key, $value := .Values.extraEnv }}
 — name: {{ $key }}
   value: {{ $value }}
{{- end }}
      
      





values.yaml



, :







extraEnv:
- ENV_VAR1: var1
- ENV_VAR2: var2
      
      





extraEnv



, . Buildkite , . values.yaml



:







{{- if .Values.extraEnv }}
{{ toYaml .Values.extraEnv | indent 12 }}
{{- end }}
      
      





, , , extraEnv



values.yaml



, (



) (



) , :







extraEnv:
 — name: ENV_VAR1
   value: "var1"
 — name: ENV_VAR2
   value: "var2"
      
      





Keycloak :







{{- with .Values.keycloak.extraEnv }}
{{ tpl . $ | indent 12 }}
{{- end }}
      
      





, extraEnv



, tpl



, , . , , :







extraEnv: |
 — name: KEYCLOAK_LOGLEVEL
   value: DEBUG
 — name: HOSTNAME
   value: {{ .Release.Name }}-keycloak
      
      





{{ .Release.Name }}



values.yaml



, , tpl



. , , , ( ). , values.yaml



, .







2.



, Helm, , ( ) . , , .







, , — . , Xray Postgres. , Postgres ( , , ):







{{- if .Values.postgresql.enabled }}
 — name: POSTGRES_USER
   value: {{ .Values.postgresql.postgresUser }}
 — name: POSTGRESS_PASSWORD
   valueFrom:
     secretKeyRef:
       name: {{ .Release.Name }}-postgresql
       key: postgres-password
 — name: POSTGRESS_DB
   value: {{ .Values.postgresql.postgresDatabase }}
 {{- else }}
...
      
      





Xray



, , Postgres. , , ? . ?







extraEnv



, Keycloak. extraEnv



, Postgres, . values.yaml



:







extraEnv: |
 — name: POSTGRES_USER
   value: {{ .Values.postgresql.postgresUser }}
 — name: POSTGRESS_PASSWORD
   valueFrom:
     secretKeyRef:
       name: {{ .Release.Name }}-postgresql
       key: postgres-password
 — name: POSTGRESS_DB
   value: {{ .Values.postgresql.postgresDatabase }}
      
      





|



, , tpl



.







, , configmap. — .Files.Get



. , values.yaml, , . , .Files.Get tpl. configmap , :







conf_file1: {{ tpl (.Files.Get "files/conf_file1") . | quote }}
      
      





Secret base64:







conf_file1: {{ tpl (.Files.Get "files/conf_file1") . | b64enc | quote }}
      
      





ConfigMap



, .Files.Glob



:







{{ (tpl (.Files.Glob "files/*").AsConfig . ) | indent 2 }}
      
      





AsSecret



, tpl



. , Glob Get :







{{ range $path, $bytes := .Files.Glob "files/*" }}
{{ base $path }}: '{{ tpl ($root.Files.Get $path) . | b64enc }}'
{{ end }}
      
      





3. -



extraEnv



Keycloak



, , , . , Keycloak Keycloak



, JSON



, Keycloak



. , extraVolumes



:







{{- with .Values.keycloak.extraVolumes }}
{{ tpl . $ | indent 8 }}
{{- end }}
      
      





extraVolumeMounts



:







          volumeMounts:
            - name: scripts
              mountPath: /scripts
{{- with .Values.keycloak.extraVolumeMounts }}
{{ tpl . $ | indent 12 }}
{{- end }}
      
      





( JSON) values.yaml:







extraVolumes: |
 — name: custom-secret
   secret:
     secretName: custom-secret
extraVolumeMounts: |
 - name: custom-secret
   mountPath: "/realm/"
   readOnly: true
      
      





(volumes) volumeMounts



values.yaml



. , , initContainers



( sidecars



). , , .







Keycloak , preStartScript, :







{{- with .Values.keycloak.preStartScript }}                           
echo 'Running custom pre-start script...'                       
{{ . | indent 4 }}                         
{{- end }}
      
      





, , .Values.keycloak.preStartScript



values.yaml



. , , .







4.



Helm, helm create



, (Service), Ingress. Ingress. , . , RabbitMQ, , Ingress :







{{- if .Values.ingress.enabled }}
...
{{-end}
      
      





, .







, RabbitMQ , (host-based):







rules:
  {{- if .Values.ingress.hostName }}
  - host: {{ .Values.ingress.hostName }}
    http:
  {{- else }}
  - http:
  {{- end }}
      
      





( , , , . RabbitMQ .)







RabbitMQ ( else ). , (, RabbitMQ , ):







- path: {{ default "/" .path }}
  backend:
    serviceName: {{ template "rabbitmq.fullname" . }}
    servicePort: {{ .Values.rabbitmq.managerPort }}
      
      





, , .







toYaml:







{{- with .Values.ingress.annotations }}
 annotations:
{{ toYaml . | indent 4 }}
{{- end }}
      
      





values.yaml



, :







annotations:
  kubernetes.io/ingress.class: nginx
  nginx.ingress.kubernetes.io/rewrite-target: /
      
      





, .yaml , , . , , , . , NGINX :







annotations:
  kubernetes.io/ingress.class: nginx
  nginx.ingress.kubernetes.io/rewrite-target: /
  nginx.ingress.kubernetes.io/configuration-snippet: |
     more_set_headers 'Access-Control-Allow-Origin: $http_origin';    
      
      





Art of the Helm Chart



Helm Chart , . , , . . , , , .







Il y a d'autres problèmes que nous n'avons pas couverts, tels que les tests et la sécurité. C'était juste un regard sur un morceau spécifique des graphiques officiels. J'ai essayé de me concentrer sur les modèles que je trouve particulièrement utiles pour amener les utilisateurs à faire ce qu'ils veulent avec vos graphiques. Les graphiques officiels de Kubernetes m'ont été extrêmement utiles lorsque je travaillais sur les graphiques Helm pour le projet Activity . Espérons que l'explication contenue dans cet article aidera à encourager les autres à se plonger dans le repo officiel et à s'inspirer de ses graphiques.








All Articles