рд╣реЗрд▓реНрдо рдХреЗ рд╕рд╛рде рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЬ рдмрдирд╛рдПрдВ: рдЪрд╛рд░реНрдЯ рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯрд┐рдВрдЧ



рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рд╣реЗрд▓реНрдо рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде "рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ" рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдереАред рдЕрдм рдЖрдЗрдП рджреВрд╕рд░реА рддрд░рдл рд╕реЗ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ - рдЪрд╛рд░реНрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ (рдпрд╛рдиреА рд╣реЗрд▓реНрдо рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЬ) рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗред рдФрд░ рдпрджреНрдпрдкрд┐ рдпрд╣ рд▓реЗрдЦ рд╢реЛрд╖рдг рдХреА рджреБрдирд┐рдпрд╛ рд╕реЗ рдЖрдпрд╛ рдерд╛, рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рдорд╛рди рдирд┐рдХрд▓рд╛ - рдпрд╣ рдЪрд╛рд░реНрдЯ рдХреЗ рд▓реЗрдЦрдХреЛрдВ рдХрд╛ рднрд╛рдЧреНрдп рд╣реИред рддреЛ, рдПрдХ рдЪрд╛рд░реНрдЯ рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИ ...

рдЪрд╛рд░реНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рджреЛ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

  1. рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рд╕рдВрд╕рд╛рдзрди рдореЗрдирд┐рдлреЗрд╕реНрдЯреЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдлрд╛рдЗрд▓реЗрдВред рдЗрдирдореЗрдВ templates рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рд╕реЗ templates рдФрд░ рд╡реИрд▓реНрдпреВ рдХреЗ рд╕рд╛рде рдлрд╛рдЗрд▓ (рдбрд┐рдлреЙрд▓реНрдЯ рд╡реИрд▓реНрдпреВрдЬ, рд╡реИрд▓реНрдпреВрдЬ рдореЗрдВ рд╕реНрдЯреЛрд░ values.yaml ) рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЗрд╕ рд╕рдореВрд╣ рдореЗрдВ requirements.yaml рд╣реИрдВ requirements.yaml рдлрд╝рд╛рдЗрд▓ рдФрд░ charts рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ - рдпрд╣ рд╕рдм рдиреЗрд╕реНрдЯреЗрдб рдЪрд╛рд░реНрдЯ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  2. рдЬрд╛рдирдХрд╛рд░реА рдпреБрдХреНрдд рдлрд╛рдЗрд▓реЗрдВ рдЬреЛ рдЪрд╛рд░реНрдЯ рдЦреЛрдЬрдиреЗ, рдЙрдиреНрд╣реЗрдВ рдЬрд╛рдирдиреЗ рдФрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдЗрд╕ рд╕рдореВрд╣ рдХреА рдЕрдзрд┐рдХрд╛рдВрд╢ рдлрд╛рдЗрд▓реЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИрдВред

рджреЛрдиреЛрдВ рд╕рдореВрд╣реЛрдВ рдХреА рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА:

  • Chart.yaml - рдЪрд╛рд░реНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓;
  • LICENSE - рдЪрд╛рд░реНрдЯ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкрд╛рда рдлрд╝рд╛рдЗрд▓;
  • README.md - рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд╕рд╛рде рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдлрд╝рд╛рдЗрд▓;
  • requirements.yaml - рдирд┐рд░реНрднрд░рддрд╛ рдЪрд╛рд░реНрдЯ рдХреА рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдлрд╝рд╛рдЗрд▓;
  • values.yaml - рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдлрд╛рдЗрд▓;
  • charts/ - рдиреЗрд╕реНрдЯреЗрдб рдЪрд╛рд░реНрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛;
  • templates/ - рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рд╕рдВрд╕рд╛рдзрди рдкреНрд░рдХрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде;
  • templates/NOTES.txt - рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдФрд░ рдЕрдкрдбреЗрдЯ рдХреЗ рджреМрд░рд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдиреЛрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓ред

рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЪрд╛рд░реНрдЯ рдбреЗрд╡рд▓рдкрд░ рдЧрд╛рдЗрдб рдХрд╛ рд╕рдВрджрд░реНрдн рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рднрдВрдбрд╛рд░ рдореЗрдВ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЪрд╛рд░реНрдЯ рдмрдирд╛рдирд╛ рдФрд░ рдмрдбрд╝реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдареАрдХ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╕реЗрдЯ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИред рдФрд░ рдЗрд╕ "рдбрд┐рдЬрд╝рд╛рдЗрди" рдореЗрдВ рдореБрдЦреНрдп рдХрдард┐рдирд╛рдИ рд╡рд╛рдВрдЫрд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рдлреА рдЙрдиреНрдирдд рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИред рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рд╕рдВрд╕рд╛рдзрди рдореИрдирд┐рдлреЗрд╕реНрдЯреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдорд╛рдирдХ рдЧреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЗрдВрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЬрд┐рд╕реЗ рд╣реЗрд▓рдо рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред

рдЕрдиреБрд╕реНрдорд╛рд░рдХ : рд╣реЗрд▓рдо рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдШреЛрд╖рдгрд╛ рдХреА рдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдЧрд▓реЗ рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг - рд╣реЗрд▓реНрдо 3 рдореЗрдВ - рд▓реБрдЖ-рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧреЛ-рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдЦреВрдВрдЧрд╛ - рдпрд╣ (рдФрд░ рд╣реЗрд▓реНрдо 3 рдореЗрдВ рдЕрдиреНрдп рдкрд░рд┐рд╡рд░реНрддрди) рдпрд╣рд╛рдВ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╣реЗрд▓реНрдо 2 рдкрд┐рдЫрд▓реЗ рдмреНрд▓реЙрдЧ рд╕реЗ рд╡рд░реНрдбрдкреНрд░реЗрд╕ рдмреНрд▓реЙрдЧ рдХреЗ рд▓рд┐рдП рдбрд┐рдкреНрд▓реЙрдпрд╕ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

deployment.yaml
 apiVersion: extensions/v1beta1 kind: Deployment metadata: name: {{ template "fullname" . }} labels: app: {{ template "fullname" . }} chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" release: "{{ .Release.Name }}" heritage: "{{ .Release.Service }}" spec: replicas: {{ .Values.replicaCount }} template: metadata: labels: app: {{ template "fullname" . }} chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" release: "{{ .Release.Name }}" spec: {{- if .Values.image.pullSecrets }} imagePullSecrets: {{- range .Values.image.pullSecrets }} - name: {{ . }} {{- end}} {{- end }} containers: - name: {{ template "fullname" . }} image: "{{ .Values.image.registry }}/{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy | quote }} env: - name: ALLOW_EMPTY_PASSWORD {{- if .Values.allowEmptyPassword }} value: "yes" {{- else }} value: "no" {{- end }} - name: MARIADB_HOST {{- if .Values.mariadb.enabled }} value: {{ template "mariadb.fullname" . }} {{- else }} value: {{ .Values.externalDatabase.host | quote }} {{- end }} - name: MARIADB_PORT_NUMBER {{- if .Values.mariadb.enabled }} value: "3306" {{- else }} value: {{ .Values.externalDatabase.port | quote }} {{- end }} - name: WORDPRESS_DATABASE_NAME {{- if .Values.mariadb.enabled }} value: {{ .Values.mariadb.db.name | quote }} {{- else }} value: {{ .Values.externalDatabase.database | quote }} {{- end }} - name: WORDPRESS_DATABASE_USER {{- if .Values.mariadb.enabled }} value: {{ .Values.mariadb.db.user | quote }} {{- else }} value: {{ .Values.externalDatabase.user | quote }} {{- end }} - name: WORDPRESS_DATABASE_PASSWORD valueFrom: secretKeyRef: {{- if .Values.mariadb.enabled }} name: {{ template "mariadb.fullname" . }} key: mariadb-password {{- else }} name: {{ printf "%s-%s" .Release.Name "externaldb" }} key: db-password {{- end }} - name: WORDPRESS_USERNAME value: {{ .Values.wordpressUsername | quote }} - name: WORDPRESS_PASSWORD valueFrom: secretKeyRef: name: {{ template "fullname" . }} key: wordpress-password - name: WORDPRESS_EMAIL value: {{ .Values.wordpressEmail | quote }} - name: WORDPRESS_FIRST_NAME value: {{ .Values.wordpressFirstName | quote }} - name: WORDPRESS_LAST_NAME value: {{ .Values.wordpressLastName | quote }} - name: WORDPRESS_BLOG_NAME value: {{ .Values.wordpressBlogName | quote }} - name: WORDPRESS_TABLE_PREFIX value: {{ .Values.wordpressTablePrefix | quote }} - name: SMTP_HOST value: {{ .Values.smtpHost | quote }} - name: SMTP_PORT value: {{ .Values.smtpPort | quote }} - name: SMTP_USER value: {{ .Values.smtpUser | quote }} - name: SMTP_PASSWORD valueFrom: secretKeyRef: name: {{ template "fullname" . }} key: smtp-password - name: SMTP_USERNAME value: {{ .Values.smtpUsername | quote }} - name: SMTP_PROTOCOL value: {{ .Values.smtpProtocol | quote }} ports: - name: http containerPort: 80 - name: https containerPort: 443 livenessProbe: httpGet: path: /wp-login.php {{- if not .Values.healthcheckHttps }} port: http {{- else }} port: https scheme: HTTPS {{- end }} {{ toYaml .Values.livenessProbe | indent 10 }} readinessProbe: httpGet: path: /wp-login.php {{- if not .Values.healthcheckHttps }} port: http {{- else }} port: https scheme: HTTPS {{- end }} {{ toYaml .Values.readinessProbe | indent 10 }} volumeMounts: - mountPath: /bitnami/apache name: wordpress-data subPath: apache - mountPath: /bitnami/wordpress name: wordpress-data subPath: wordpress - mountPath: /bitnami/php name: wordpress-data subPath: php resources: {{ toYaml .Values.resources | indent 10 }} volumes: - name: wordpress-data {{- if .Values.persistence.enabled }} persistentVolumeClaim: claimName: {{ .Values.persistence.existingClaim | default (include "fullname" .) }} {{- else }} emptyDir: {} {{ end }} {{- if .Values.nodeSelector }} nodeSelector: {{ toYaml .Values.nodeSelector | indent 8 }} {{- end -}} {{- with .Values.affinity }} affinity: {{ toYaml . | indent 8 }} {{- end }} {{- with .Values.tolerations }} tolerations: {{ toYaml . | indent 8 }} {{- end }} 

рдЕрдм - рд╣реЗрд▓реНрдо рдореЗрдВ рдорд╛рдирдХреАрдХрд░рдг рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрджрд╛рд╣рд░рдг рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рднрдВрдбрд╛рд░ рдХреЗ рдЪрд╛рд░реНрдЯ рд╕реЗ рд▓рд┐рдП рдЧрдП рд╣реИрдВред

рдорд╛рдирдХреАрдХрд░рдг


рдЯреЗрдореНрдкреНрд▓реЗрдЯ: {{ }}


рдЯреЗрдВрдкрд▓реЗрдЯрд┐рдВрдЧ рд╕реЗ рдЬреБрдбрд╝реА рд╣рд░ рдЪреАрдЬ рдбрдмрд▓ рдХрд░реНрд▓реА рдмреНрд░реЗрд╕реЗрд╕ рдореЗрдВ рд▓рд┐рдкрдЯреА рд╣реИред рдШреБрдВрдШрд░рд╛рд▓реЗ рдХреЛрд╖реНрдардХ рдХреЗ рдмрд╛рд╣рд░ рдкрд╛рда рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рддрд╛ рд╣реИред

рдкреНрд░рд╕рдВрдЧ рдореВрд▓реНрдп:ред


рдЬрдм рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдЖрдВрд╢рд┐рдХ (рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рд▓реЗрдЦ рдХреЗ рдЕрдЧрд▓реЗ рдЦрдВрдб рджреЗрдЦреЗрдВ) рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддреЗ рд╣реБрдП, рд╡рд╣ рдорд╛рди рдЬреЛ рд╕рдВрджрд░реНрдн рдЪрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕реБрд▓рдн рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ - рдмрд┐рдВрджреБ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдмрд┐рдВрджреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЬрд┐рд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдХрд╛ рдорд╛рди рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рдмреНрд▓реЙрдХ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореБрдЦреНрдп рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рд╕рдВрджрд░реНрдн рдЪрд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реИрдВред рдореВрд▓ рд╣реЗрд▓реНрдо рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдореБрдЦреНрдп рдСрдкрд░реЗрдЯрд░реЛрдВ рдФрд░ рдЙрдирдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдиреАрдЪреЗ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред

рд╣реЗрд▓реНрдо рдХреА рдореВрд▓ рд╕рдВрд░рдЪрдирд╛


рдЬрдм рдореИрдирд┐рдлреЗрд╕реНрдЯреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирд┐рдореНрди рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

  • рдлрд╝реАрд▓реНрдб .Values - рд░рд┐рд▓реАрдЬрд╝ рдФрд░ рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рдЕрджреНрдпрддрди рдХреЗ рджреМрд░рд╛рди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рдорд╛рдкрджрдВрдбреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдПред рдЗрдирдореЗрдВ рд╡рд┐рдХрд▓реНрдк рдХреЗ рдорд╛рди рд╢рд╛рдорд┐рд▓ рд╣реИрдВ --set , --set-string рдФрд░ --set-file , рд╕рд╛рде рд╣реА рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░, рдорд╛рдиред рдорд╛рди рдлрд╝рд╛рдЗрд▓ рдФрд░ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рдлрд╝рд╛рдЗрд▓реЗрдВ: -

     containers: - name: main image: "{{ .Values.image }}:{{ .Values.imageTag }}" imagePullPolicy: {{ .Values.imagePullPolicy }} 
  • .Release - рд░реЛрд▓рдЖрдЙрдЯ, рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдпрд╛ рдЕрдкрдбреЗрдЯ, рд░рд┐рд▓реАрдЬрд╝ рдирд╛рдо, рдирд╛рдорд╕реНрдерд╛рди рдФрд░ рдХрдИ рдФрд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд░рд┐рд▓реАрдЬрд╝ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

     metadata: labels: heritage: "{{ .Release.Service }}" release: "{{ .Release.Name }}" subjects: - namespace: {{ .Release.Namespace }} 
  • .Chart - рдЪрд╛рд░реНрдЯ рдЬрд╛рдирдХрд╛рд░реА рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдПред рдлрд╝реАрд▓реНрдбреНрд╕ Chart.yaml рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВред рдлрд╛рдЗрд▓ рдлрд╝рд╛рдЗрд▓:

     labels: chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" 
  • рд╕рдВрд░рдЪрдирд╛ред .Files - рдЪрд╛рд░реНрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП; рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдЙрдкрд▓рдмреНрдз рддрд░реАрдХреЗ рдпрд╣рд╛рдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ ред рдЙрджрд╛рд╣рд░рдг:

     data: openssl.conf: | {{ .Files.Get "config/openssl.conf" | indent 4 }} 

     data: {{ (.Files.Glob "files/docker-entrypoint-initdb.d/*").AsConfig | indent 2 }} 
  • .Capabilities - рдЙрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдореЗрдВ .Capabilities рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

     {{- if .Capabilities.APIVersions.Has "apps/v1beta2" }} apiVersion: apps/v1beta2 {{- else }} apiVersion: extensions/v1beta1 {{- end }} 

     {{- if semverCompare "^1.9-0" .Capabilities.KubeVersion.GitVersion }} apiVersion: apps/v1 {{- else }} 

рдСрдкрд░реЗрдЯрд░реЛрдВ


рд╣рдо, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, if , else if рдФрд░ else :

 {{- if .Values.agent.image.tag }} image: "{{ .Values.agent.image.repository }}:{{ .Values.agent.image.tag }}" {{- else }} image: "{{ .Values.agent.image.repository }}:v{{ .Chart.AppVersion }}" {{- end }} 

range рдСрдкрд░реЗрдЯрд░ рдХреЛ рд╕рд░рдгрд┐рдпреЛрдВ рдФрд░ рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдПрдХ рд╕рд░рдгреА рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рддрддреНрд╡ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреНрд▓реЙрдХ рдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рдХрд╛ рдореВрд▓реНрдп рд╕рдВрджрд░реНрдн рдЪрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ):

 {{- range .Values.ports }} - name: {{ .name }} port: {{ .containerPort }} targetPort: {{ .containerPort}} {{- else }} ... {{- end}} 

 {{ range .Values.tolerations -}} - {{ toYaml . | indent 8 | trim }} {{ end }} 

рдирдХреНрд╢реЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЪрд░ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 {{- range $key, $value := .Values.credentials.secretContents }} {{ $key }}: {{ $value | b64enc | quote }} {{- end }} 

рдПрдХ рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдЗрд╕рдХреЗ with : рдСрдкрд░реЗрдЯрд░: рдпрджрд┐ рдкрд╛рд░рд┐рдд рддрд░реНрдХ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдмреНрд▓реЙрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдмреНрд▓реЙрдХ рдореЗрдВ рд╕рдВрджрд░реНрдн рдЪрд░ рддрд░реНрдХ рдХреЗ рдореВрд▓реНрдп рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 {{- with .config }} config: {{- with .region }} region: {{ . }} {{- end }} {{- with .s3ForcePathStyle }} s3ForcePathStyle: {{ . }} {{- end }} {{- with .s3Url }} s3Url: {{ . }} {{- end }} {{- with .kmsKeyId }} kmsKeyId: {{ . }} {{- end }} {{- end }} 

рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, define [name] рдФрд░ template [name] [variable] рд╕реЗ рдПрдХ рдмрдВрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдкрд╛рд░рд┐рдд рдореВрд▓реНрдп рдХреЛ define рдмреНрд▓реЙрдХ рдореЗрдВ рд╕рдВрджрд░реНрдн рдЪрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 apiVersion: v1 kind: ServiceAccount metadata: name: {{ template "kiam.serviceAccountName.agent" . }} ... {{- define "kiam.serviceAccountName.agent" -}} {{- if .Values.serviceAccounts.agent.create -}} {{ default (include "kiam.agent.fullname" .) .Values.serviceAccounts.agent.name }} {{- else -}} {{ default "default" .Values.serviceAccounts.agent.name }} {{- end -}} {{- end -}} 

рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдХреЛ define рдХрд░рддреЗ рд╕рдордп рд╡рд┐рдЪрд╛рд░ define , рдпрд╛, рдФрд░ рдЕрдзрд┐рдХ, рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ:

  • рдШреЛрд╖рд┐рдд рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╡реИрд╢реНрд╡рд┐рдХ рд╣реИрдВ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ templates рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреА рд╕рднреА рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  • рдореБрдЦреНрдп рдЪрд╛рд░реНрдЯ рдЖрд╢реНрд░рд┐рдд рдЪрд╛рд░реНрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рджреЛ рдЖрдВрд╢рд┐рдХ рдирд╛рдо рд╣реИрдВ, рддреЛ рдЕрдВрддрд┐рдо рд▓реЛрдб рдХрд┐рдП рдЧрдП рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдВрд╢рд┐рдХ рдирд╛рдордХрд░рдг рдХрд░рддреЗ рд╕рдордп, рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдВрдШрд░реНрд╖реЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд╛рд░реНрдЯ рдирд╛рдо рдЬреЛрдбрд╝рдиреЗ рдХреА рдкреНрд░рдерд╛ рд╣реИ: define "chart_name.partial_name" ред

рдЪрд░: $


рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдЯреЛрд░, рд╕рдВрд╢реЛрдзрд┐рдд рдФрд░ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 {{ $provider := .Values.configuration.backupStorageProvider.name }} ... {{ if eq $provider "azure" }} envFrom: - secretRef: name: {{ template "ark.secretName" . }} {{ end }} 

рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдЖрдВрд╢рд┐рдХ рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд░рддреЗ рд╕рдордп, $ рдХрд╛ рдбреЙрдЯ рдХреЗ рд╕рдорд╛рди рдЕрд░реНрде рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕рдВрджрд░реНрдн рдЪрд░ (рдмрд┐рдВрджреБ) рдХреЗ рд╡рд┐рдкрд░реАрдд, рдмреНрд▓реЙрдХ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ $ рдХрд╛ рдореВрд▓реНрдп рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ , рдЬреЛ рдЖрдкрдХреЛ рдмреНрд▓реЙрдХ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдореВрд▓реНрдп рдФрд░ рдореВрд▓ рд╣реЗрд▓реНрдо рд╕рдВрд░рдЪрдирд╛ (рдпрд╛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдореВрд▓реНрдп, рдЕрдЧрд░ рд╣рдо рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ 'рдЗрдирд╕рд╛рдЗрдб' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред ред рдЕрдВрддрд░ рдЪрд┐рддреНрд░рдг:

 context: {{ . }} dollar: {{ $ }} with: {{- with .Chart }} context: {{ . }} dollar: {{ $ }} {{- end }} template: {{- template "flant" .Chart -}} {{ define "flant" }} context: {{ . }} dollar: {{ $ }} with: {{- with .Name }} context: {{ . }} dollar: {{ $ }} {{- end }} {{- end -}} 

рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рдХрд▓ рдЬрд╛рдПрдЧрд╛ (рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдЫрджреНрдо рдирд╛рдореЛрдВ рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ):

 context: #  helm dollar: #  helm with: context: #.Chart dollar: #  helm template: context: #.Chart dollar: #.Chart with: context: habr dollar: #.Chart 

рдФрд░ рдпрд╣рд╛рдБ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

 {{- if .Values.ingress.enabled -}} {{- range .Values.ingress.hosts }} apiVersion: extensions/v1beta1 kind: Ingress metadata: name: {{ template "nats.fullname" $ }}-monitoring labels: app: "{{ template "nats.name" $ }}" chart: "{{ template "nats.chart" $ }}" release: {{ $.Release.Name | quote }} heritage: {{ $.Release.Service | quote }} annotations: {{- if .tls }} ingress.kubernetes.io/secure-backends: "true" {{- end }} {{- range $key, $value := .annotations }} {{ $key }}: {{ $value | quote }} {{- end }} spec: rules: - host: {{ .name }} http: paths: - path: {{ default "/" .path }} backend: serviceName: {{ template "nats.fullname" $ }}-monitoring servicePort: monitoring {{- if .tls }} tls: - hosts: - {{ .name }} secretName: {{ .tlsSecret }} {{- end }} --- {{- end }} {{- end }} 

рдЗрдВрдбреЗрдВрдЯ


рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЕрддрд┐рд░рд┐рдХреНрдд рдорд╛рд░реНрдЬрд┐рди рд░рд╣ рд╕рдХрддреЗ рд╣реИрдВ: рд░рд┐рдХреНрдд рд╕реНрдерд╛рди, рдЯреИрдм, рд▓рд╛рдЗрди рдлрд╝реАрдбред рдЙрдирдХреЗ рд╕рд╛рде, рдлрд╝рд╛рдЗрд▓ рдмрд╕ рдЕрдзрд┐рдХ рдкрдардиреАрдп рд▓рдЧрддреА рд╣реИред рдЖрдк рдпрд╛ рддреЛ рдЙрдирдХрд╛ рдкрд░рд┐рддреНрдпрд╛рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдкреИрдЯрд░реНрди рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

  • {{- variable }} рдкрд┐рдЫрд▓реЗ рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рдХрд╛рдЯ рджреЗрддрд╛ рд╣реИ;
  • {{ variable -}} рдмрд╛рдж рдХреЗ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреЛ рдХрд╛рдЯ рджреЗрддрд╛ рд╣реИ;
  • {{- variable -}} рджреЛрдиреЛрдВ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред

рдПрдХ рдлрд╛рдЗрд▓ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг, рдЬрд┐рд╕рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд▓рд╛рдЗрди habr flant helm :

 habr {{- " flant " -}} helm 

рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдп


рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рд╕рднреА рдлрд╝рдВрдХреНрд╢рди рдирд┐рдореНрди рд▓рд┐рдВрдХ рдкрд░ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдореИрдВ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛ред

index рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рд╕рд░рдгреА рдпрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 definitions.json: | { "users": [ { "name": "{{ index .Values "rabbitmq-ha" "rabbitmqUsername" }}", "password": "{{ index .Values "rabbitmq-ha" "rabbitmqPassword" }}", "tags": "administrator" } ] } 

рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛ рд▓реЗрддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдиреЗрд╕реНрдЯреЗрдб рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:

$map["key1"]["key2"]["key3"] => index $map "key1" "key2" "key3"

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 httpGet: {{- if (index .Values "pushgateway" "extraArgs" "web.route-prefix") }} path: /{{ index .Values "pushgateway" "extraArgs" "web.route-prefix" }}/#/status {{- end }} 

рдмреВрд▓рд┐рдпрди рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдХрд╛рд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдФрд░ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ )ред рдЧреБрдЬрд░рддреЗ рд╕рдордп рдЙрдирдХреЗ рд▓рд┐рдП рд╕рднреА рддрд░реНрдХреЛрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 {{ if and (index .Values field) (eq (len .Values.field) 10) }} ... {{ end }} 

рдпрджрд┐ рдХреЛрдИ рдлрд╝реАрд▓реНрдб field рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧреА ( error calling len: len of untyped nil ): рджреВрд╕рд░реА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдкрд╣рд▓реА рдкреВрд░реА рдирд╣реАрдВ рд╣реБрдИ рд╣реИред рдпрд╣ рдиреЛрдЯ рд▓реЗрдиреЗ рд▓рд╛рдпрдХ рд╣реИ, рдФрд░ рдХрдИ рдЬрд╛рдВрдЪреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдХреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ:

 {{ if index . field }} {{ if eq (len .field) 10 }} ... {{ end }} {{ end }} 

рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЧреЛ-рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреА рдПрдХ рдЕрдиреВрдареА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рд╢реЗрд▓ рдореЗрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреА рддрд░рд╣ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рднрд╛рд╡реЛрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ, рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдкреНрд░рддреАрдХ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП рдЖрджреЗрд╢реЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИ | ред рдПрдХ рдХрдорд╛рдВрдб рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдореВрд▓реНрдп рдпрд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ред рдкреНрд░рддреНрдпреЗрдХ рдХрдорд╛рдВрдб рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЕрдЧрд▓реЗ рдХрдорд╛рдВрдб рдХреЗ рдЕрдВрддрд┐рдо рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдЕрдВрддрд┐рдо рдХрдорд╛рдВрдб рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкреВрд░реЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╛ рдореВрд▓реНрдп рд╣реИред рдЙрджрд╛рд╣рд░рдг:

 data: openssl.conf: | {{ .Files.Get "config/openssl.conf" | indent 4 }} 

 data: db-password: {{ .Values.externalDatabase.password | b64enc | quote }} 

рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдп


рд╕реНрдкреНрд░реАрдЬ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 70 рдЙрдкрдпреЛрдЧреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИред рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рд╣реЗрд▓реНрдо рдиреЗ expandenv рдФрд░ expandenv рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдЯрд┐рд▓рд░ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред

include рдлрд╝рдВрдХреНрд╢рди, рдорд╛рдирдХ template рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд░рд╣, template рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред template рд╡рд┐рдкрд░реАрдд, рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред рдПрдХ рдЕрдиреНрдп рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рдкрд╛рд░рд┐рдд:

 metadata: labels: {{ include "labels.standard" . | indent 4 }} {{- define "labels.standard" -}} app: {{ include "hlf-couchdb.name" . }} heritage: {{ .Release.Service | quote }} release: {{ .Release.Name | quote }} chart: {{ include "hlf-couchdb.chart" . }} {{- end -}} 

required рдлрд╝рдВрдХреНрд╢рди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЖрд╡рд╢реНрдпрдХ рдорд╛рдиреЛрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджреЗрддрд╛ рд╣реИ: рдпрджрд┐ рдорд╛рди рдореМрдЬреВрдж рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рддреЗ рд╕рдордп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рд░реЗрдВрдбрд░ рдбреЗрд╡рд▓рдкрд░ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ:

 sftp-user: {{ required "Please specify the SFTP user name at .Values.sftp.user" .Values.sftp.user | b64enc | quote }} sftp-password: {{ required "Please specify the SFTP user password at .Values.sftp.password" .Values.sftp.password | b64enc | quote }} {{- end }} {{- if .Values.svn.enabled }} svn-user: {{ required "Please specify the SVN user name at .Values.svn.user" .Values.svn.user | b64enc | quote }} svn-password: {{ required "Please specify the SVN user password at .Values.svn.password" .Values.svn.password | b64enc | quote }} {{- end }} {{- if .Values.webdav.enabled }} webdav-user: {{ required "Please specify the WebDAV user name at .Values.webdav.user" .Values.webdav.user | b64enc | quote }} webdav-password: {{ required "Please specify the WebDAV user password at .Values.webdav.password" .Values.webdav.password | b64enc | quote }} {{- end }} 

tpl рдлрд╝рдВрдХреНрд╢рди рдЖрдкрдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред template рдФрд░ include рд╡рд┐рдкрд░реАрдд, рдлрд╝рдВрдХреНрд╢рди рдЖрдкрдХреЛ рдЙрди рдЯреЗрдореНрдкреНрд▓реЗрдЯреНрд╕ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЪрд░ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдЙрди рдЯреЗрдореНрдкреНрд▓реЗрдЯреЛрдВ рдХреЛ рднреА рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рди рдХреЗрд╡рд▓ templates рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ?

рд╡реИрд░рд┐рдПрдмрд▓ рд╕реЗ рдЪрд▓ рд░рд╣реЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ:

 containers: {{- with .Values.keycloak.extraContainers }} {{ tpl . $ | indent 2 }} {{- end }} 

... рдФрд░ values.yaml рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореВрд▓реНрдп рд╣реИрдВ:

 keycloak: extraContainers: | - name: cloudsql-proxy image: gcr.io/cloudsql-docker/gce-proxy:1.11 command: - /cloud_sql_proxy args: - -instances={{ .Values.cloudsql.project }}:{{ .Values.cloudsql.region }}:{{ .Values.cloudsql.instance }}=tcp:5432 - -credential_file=/secrets/cloudsql/credentials.json volumeMounts: - name: cloudsql-creds mountPath: /secrets/cloudsql readOnly: true 

templates рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рдмрд╛рд╣рд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд░реЗрдВрдбрд░:

 apiVersion: batch/v1 kind: Job metadata: name: {{ template "mysqldump.fullname" . }} labels: app: {{ template "mysqldump.name" . }} chart: {{ template "mysqldump.chart" . }} release: "{{ .Release.Name }}" heritage: "{{ .Release.Service }}" spec: backoffLimit: 1 template: {{ $file := .Files.Get "files/job.tpl" }} {{ tpl $file . | indent 4 }} 

... рдЪрд╛рд░реНрдЯ рдкрд░, рдкрде files/job.tpl , рдирд┐рдореНрди рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИ:

 spec: containers: - name: xtrabackup image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy | quote }} command: ["/bin/bash", "/scripts/backup.sh"] envFrom: - configMapRef: name: "{{ template "mysqldump.fullname" . }}" - secretRef: name: "{{ template "mysqldump.fullname" . }}" volumeMounts: - name: backups mountPath: /backup - name: xtrabackup-script mountPath: /scripts restartPolicy: Never volumes: - name: backups {{- if .Values.persistentVolumeClaim }} persistentVolumeClaim: claimName: {{ .Values.persistentVolumeClaim }} {{- else -}} {{- if .Values.persistence.enabled }} persistentVolumeClaim: claimName: {{ template "mysqldump.fullname" . }} {{- else }} emptyDir: {} {{- end }} {{- end }} - name: xtrabackup-script configMap: name: {{ template "mysqldump.fullname" . }}-script 

рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рд╣реЗрд▓реНрдо рдореЗрдВ рдорд╛рдирдХреАрдХрд░рдг рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рд╢реБрд░реВ рд╣реБрдИрдВ ...

рдирд┐рд╖реНрдХрд░реНрд╖


рд▓реЗрдЦ рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдирдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдореБрдЦреНрдп рдХрдард┐рдирд╛рдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ - рдЯреЗрдореНрдкрд▓реЗрдЯ: рдмреБрдирд┐рдпрд╛рджреА рд╕рд┐рджреНрдзрд╛рдВрдд, рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕, рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдЧреЛ-рдЯреЗрдореНрдкрд▓реЗрдЯ рдСрдкрд░реЗрдЯрд░, рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝рдВрдХреНрд╢рдиред

рдЗрд╕ рд╕рдм рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдХреИрд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ? рдЪреВрдВрдХрд┐ рд╣реЗрд▓рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕рдВрдкреВрд░реНрдг рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рд╣реИ, рдЖрдк рд╣рдореЗрд╢рд╛ рд╕рдорд╛рди рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП рдЪрд╛рд░реНрдЯ рдХреЗ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдПрдХ рдирдИ рд╕рдВрджреЗрд╢ рдХрддрд╛рд░ рдХреЛ рдкреИрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ RabbitMQ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЪрд╛рд░реНрдЯ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред рдмреЗрд╢рдХ, рдХреЛрдИ рднреА рдЖрдкрдХреЛ рдореМрдЬреВрджрд╛ рдкреИрдХреЗрдЬреЛрдВ рдореЗрдВ рдЖрджрд░реНрд╢ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╡рд╛рджрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рдкреВрд░реНрдг рд╣реИрдВред рдмрд╛рдХреА рдЕрднреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ helm template рдФрд░ helm lint рдбреАрдмрдЧрд┐рдВрдЧ рдХрдорд╛рдВрдб рдЖрдкрдХреА рдорджрдж рдХрд░реЗрдВрдЧреЗ, рд╕рд╛рде рд╣реА --dry-run рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред

рд╣реЗрд▓рдо рдЪрд╛рд░реНрдЯ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреА рд╡реНрдпрд╛рдкрдХ рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ рдФрд░ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рддрдХрдиреАрдХреЛрдВ рдХрд╛, рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд┐рдВрдХ рдкрд░ рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рд╕реЗ рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░реЗрдВ (рд╕рднреА рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ):


рдФрд░ рдЕрдЧрд▓реЗ рд╣реЗрд▓реНрдо рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдПрдХ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рд╕рдВрд▓рдЧреНрди рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдХрд┐ рд╣реЗрд▓реНрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдиреНрдп рд▓реЗрдЦ рдЬреЛ рд╣реЗрдмрд░ рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдпрд╛ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?)ред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдкреБрдирд╢реНрдЪ


рд╣рдорд╛рд░реЗ рдмреНрд▓реЙрдЧ рдореЗрдВ рднреА рдкрдврд╝реЗрдВ:

Source: https://habr.com/ru/post/hi423239/


All Articles