Helm (Kubernetes) vol.3
前回: Helm(Kubernetes) vol.2 - 成らぬは人の為さぬなりけり Helmのライフサイクルや思想を理解したので、今度は実際にChartの中身を見ていく
Chart
chartの構成
wordpress/ Chart.yaml # A YAML file containing information about the chart LICENSE # OPTIONAL: A plain text file containing the license for the chart README.md # OPTIONAL: A human-readable README file requirements.yaml # OPTIONAL: A YAML file listing dependencies for the chart values.yaml # The default configuration values for this chart charts/ # OPTIONAL: A directory containing any charts upon which this chart depends. templates/ # OPTIONAL: A directory of templates that, when combined with values, # will generate valid Kubernetes manifest files. templates/NOTES.txt # OPTIONAL: A plain text file containing short usage notes
こんな感じ
主要な所を説明
Chart.yaml
まぁ、メタデータだな。 名前とか、versionとか、authorとかそーいうの。
values.yaml
こいつが、設定だ。
Ansibleでいう、defaults/main.yml
この設定を、外から上書きできる感じになる。
templates
この中に、実際に使う、yamlを吐くテンプレートを書く。
deploymentとかserviceとかingressとか。。。
そのyamlを吐くtemplateにvaluesの変数を埋め込む感じ
ぶっちゃけ、yamlじゃなくても普通にERB的なテンプレートなので、なんでもできそう。
(ただ、k8sで使うので、YAML以外使わないけど…)
実際に見てみよう
Helm Create !!!!
新しいChartを作る
helm create test
すると、あら不思議、中にはサンプルが! どうやら、nginxをdeployするサンプルくさい
Chart.yaml
apiVersion: v1 description: A Helm chart for Kubernetes name: test version: 0.1.0
スィンプル
values.yaml
# Default values for test. # This is a YAML-formatted file. # Declare variables to be passed into your templates. replicaCount: 1 image: repository: nginx tag: stable pullPolicy: IfNotPresent service: name: nginx type: ClusterIP externalPort: 80 internalPort: 80 ingress: enabled: false # Used to create an Ingress record. hosts: - chart-example.local annotations: # kubernetes.io/ingress.class: nginx # kubernetes.io/tls-acme: "true" tls: # Secrets must be manually created in the namespace. # - secretName: chart-example-tls # hosts: # - chart-example.local resources: {} # We usually recommend not to specify default resources and to leave this as a conscious # choice for the user. This also increases chances charts run on environments with little # resources, such as Minikube. If you do want to specify resources, uncomment the following # lines, adjust them as necessary, and remove the curly braces after 'resources:'. # limits: # cpu: 100m # memory: 128Mi # requests: # cpu: 100m # memory: 128Mi
うんうん、やりたいことはよくわかる
templates/deployment.yaml
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: {{ template "fullname" . }} labels: app: {{ template "name" . }} chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} release: {{ .Release.Name }} heritage: {{ .Release.Service }} spec: replicas: {{ .Values.replicaCount }} template: metadata: labels: app: {{ template "name" . }} release: {{ .Release.Name }} spec: containers: - name: {{ .Chart.Name }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy }} ports: - containerPort: {{ .Values.service.internalPort }} livenessProbe: httpGet: path: / port: {{ .Values.service.internalPort }} readinessProbe: httpGet: path: / port: {{ .Values.service.internalPort }} resources: {{ toYaml .Values.resources | indent 12 }} {{- if .Values.nodeSelector }} nodeSelector: {{ toYaml .Values.nodeSelector | indent 8 }} {{- end }}
うん、k8sのDeploymentだ どうやら、Goの標準ライブラリに組み込まれてるtemplateの記法らしい https://golang.org/pkg/text/template/
templates/service.yaml
apiVersion: v1 kind: Service metadata: name: {{ template "fullname" . }} labels: app: {{ template "name" . }} chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} release: {{ .Release.Name }} heritage: {{ .Release.Service }} spec: type: {{ .Values.service.type }} ports: - port: {{ .Values.service.externalPort }} targetPort: {{ .Values.service.internalPort }} protocol: TCP name: {{ .Values.service.name }} selector: app: {{ template "name" . }} release: {{ .Release.Name }}
templates/ingress.yaml
{{- if .Values.ingress.enabled -}} {{- $serviceName := include "fullname" . -}} {{- $servicePort := .Values.service.externalPort -}} apiVersion: extensions/v1beta1 kind: Ingress metadata: name: {{ template "fullname" . }} labels: app: {{ template "name" . }} chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} release: {{ .Release.Name }} heritage: {{ .Release.Service }} annotations: {{- range $key, $value := .Values.ingress.annotations }} {{ $key }}: {{ $value | quote }} {{- end }} spec: rules: {{- range $host := .Values.ingress.hosts }} - host: {{ $host }} http: paths: - path: / backend: serviceName: {{ $serviceName }} servicePort: {{ $servicePort }} {{- end -}} {{- if .Values.ingress.tls }} tls: {{ toYaml .Values.ingress.tls | indent 4 }} {{- end -}} {{- end -}}
あー、ingress作るかとか、template側で制御してんのかぁ んー、この思想イケてないな 設定ファイルみたいなのつくって、どのtemplateを使うかとか、ansible的な思想の方がイケてる configurationとtemplateは分けたほうが設計的に綺麗
templates/_helper.tpl
{{/* vim: set filetype=mustache: */}} {{/* Expand the name of the chart. */}} {{- define "name" -}} {{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} {{- end -}} {{/* Create a default fully qualified app name. We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). */}} {{- define "fullname" -}} {{- $name := default .Chart.Name .Values.nameOverride -}} {{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} {{- end -}}
どうやら、railsでいうhelper的な物をtemplate内で定義してるくさい(service.yamlとかで template “fullname” .
とかしてる)
これもまた、イケてないなー
まず新しいDSLが登場するのがいけてない
せめて、YAMLかGoで書けるようになっていてほしい
次回
次回は、↑このchartをいじり倒してみよう valuesは外から上書きした時にどうなるか、、、 特にdeep mergeされるのかが、気になる (ansibleはここがイケてない)