チャート@Helm¶
はじめに¶
本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。
01. セットアップ¶
インストール¶
▼ aptリポジトリから¶
$ curl https://helm.baltorepo.com/organization/signing.asc | sudo apt-key add -
$ sudo apt-get install apt-transport-https --yes
$ echo "deb https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
$ sudo apt-get update
$ sudo apt-get install helm
02. index.yaml
ファイル¶
index.yaml
ファイルとは¶
チャートリポジトリ内の各チャートアーカイブ (.tgz
形式ファイル) のメタデータを設定する。
helm repo index
コマンドによって、Chart.yaml
ファイルに基づいて自動作成されるため、ユーザーが設定する項目は少ない。
apiVersion¶
▼ apiVersionとは¶
entries¶
▼ entriesとは¶
generated¶
▼ generatedとは¶
コマンドによってindex.yaml
ファイルが作成された日付を設定する。
generated: "2022-01-01T12:00:00.197173+09:00"
03. Chart.yaml
ファイル¶
apiVersion¶
▼ apiVersionとは¶
Helmのバージョンを設定する。
.apiVersion
キーのv1
はHelmのv2
に対応しており、v2
はv3
をサポートしている。
apiVersion: v2
appVersion¶
▼ appVersionとは¶
Kubernetes上で稼働するアプリケーションのHelmリリースバージョンを設定する。
Helmリリースバージョンは、GitHubのHelmリリースタグで管理した方がよく、appVersion
キーの値は特に変更しなくても良い。
公式チャートでは、チャート内で使用しているコンテナのイメージタグがappVersion
キーに設定されている。
appVersion: <バージョンタグ>
description¶
▼ descriptionとは¶
チャートの説明を設定する。
description: The chart of foo
dependencies¶
▼ dependenciesとは¶
依存対象のサブチャートを設定する。
設定されたサブチャートは、charts
ディレクトリにダウンロードされる。
dependencies:
- name: foo
version: 1.0.0
repository: https://foo.com/foo-chart
- name: bar
version: 1.0.0
repository: https://bar.com/bar-chart
▼ サブチャート¶
サブチャートは、.<チャート名>.enabled
キーとdependencies[]condition
キーで制御するとよい。
サブチャートには、values
ファイルで変数を渡せる。
# 親チャートのvaluesファイル
foo:
enabled: "true"
# fooサブチャートのvaluesファイルにある.replicasキーに値を渡す。
replicas: 2
bar:
enabled: "true"
# barサブチャートのvaluesファイルにある.replicasキーに値を渡す。
replicas: 2
dependencies:
- name: foo
version: 1.0.0
repository: https://foo.com/foo-chart
# valuesファイルで foo.enabled を true にした場合
condition: foo.enabled
- name: bar
version: 1.0.0
repository: https://bar.com/bar-chart
# valuesファイルで bar.enabled を true にした場合
condition: bar.enabled
kubeVersion¶
チャート内のマニフェストが最低限対応可能なkube-apiserverのバージョンを設定する。
kubeVersion: ">=1.22.0-0"
maintainers¶
▼ maintainersとは¶
チャートの管理者を設定する。
maintainers:
- name: hiroki hasegawa
email: example@gmail.com
url: https://example.com
name¶
▼ nameとは¶
Helmで作成されるKubernetesリソースの接頭辞を設定する。
name: foo
type¶
▼ typeとは¶
チャートのタイプを設定する。
▼ application¶
Kubernetesリソースを含むチャートであることを表す。
type: application
▼ library¶
Kubernetesリソースを含まず、関数のみを含むチャートであることを表す。
type: library
version¶
▼ versionとは¶
チャートアーカイブ (.tgz
形式ファイル) のHelmリリースバージョンを設定する。
template
ディレクトリ配下のファイルを変更した場合に更新する。
version: <バージョンタグ>
04. _helpers.tpl
ファイル¶
_helpers.tpl
ファイルとは¶
あらゆる場所から使用できるテンプレートを設定する。
汎用的なテンプレート (.metadata.labels
キーなど) の出力で使用する。
.metadata.labels
キーの出力¶
_helpers.tpl
ファイルで.metadata.labels
キーのセットをテンプレートとして定義しておく。
マニフェストで、これらをまとめて出力する。
{{- define "global.template.labels" }}
# Helmリリース名
app.kubernetes.io/instance: {{ .Release.Name }}
# ツール名 (v2ならTiller、v3ならHelm)
app.kubernetes.io/managed-by: {{ .Release.Service }}
# チャートバージョン
app.kubernetes.io/version: {{ .Chart.AppVersion }}
# チャート名
helm.sh/chart: {{ .Chart.Name }}
{{- end }}
apiVersion: apps/v1
kind: Deployment
metadata:
labels: {{include "global.template.labels" . | indent 4}} # まとめて出力する。
05. values.yaml¶
共通オプション¶
▼ 共通オプションとは¶
多くの外部チャートで共通して用意されているvalues
ファイルのデフォルトオプションである。
共通オプションは、外部チャート内の_help.tpl
ファイルに出力される。
▼ affinity¶
チャート内のDeploymentの.spec.template.spec.affinity
キーに値を設定する。
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node.kubernetes.io/nodetype
operator: In
values:
- app
▼ crd.install¶
同じチャート内でCRDとカスタムリソースを含んでいる場合に、CRDの作成はスキップする。
この場合、CRDをkubectl apply
コマンドで作成することになる。
CRDはCluster内に1
個あれば十分であるが、Clusterに複数のHelmリリースをインストールする場合、meta.helm.sh
キーでお互いがコンフリクトを起こしてしまう。
そのため、CRDのみHelmの管理外に置くという必要がある。
crds:
install: "false"
▼ fullnameOverride¶
デフォルトでは、チャートのインストールによって作成されるKubernetesリソース名は、『<Helmリリース名>-<Chart名>
』になる。
fullnameOverride: foo
もし、fullnameOverride
オプションを設定していた場合、Kubernetesリソース名は『<fullnameOverrideオプションの値>
』になる。
補足としてチャートごとに、Kubernetesリソース名の前後に特定の文字列 (例:コンポーネント名、番号、インスタンスハッシュ値) がつくことがある。
nameOverride
オプションとは独立している。
そのため、nameOverride
オプションでチャートをインストールした後にfullnameOverride
オプションに移行したい場合、nameOverride
オプションによるチャートを一度アンインストールする必要がある。
しかし、そのままfullnameOverride
オプションに移行してしまうと、nameOverride
オプション時のKubernetesリソースが残骸として残ってしまう可能性がある。
▼ image.pullPolicy¶
チャート内のDeploymentの.spec.template.spec.containers[*].imagePullPolicy
キーに値を設定する。
image:
pullPolicy: IfNotPresent
▼ image.repository¶
チャート内のDeploymentの.spec.template.spec.containers[*].image
キーのリポジトリ名部分に値を設定する。
image:
repository: foo-repository
▼ image.tag¶
チャート内のDeploymentの.spec.template.spec.containers[*].image
キーのタグ値部分に値を設定する。
image:
tag: v1.0.0
チャートのバージョンとコンテナイメージのバージョンには対応関係があり、基本的にはチャートのvalues
ファイルで定義されているデフォルトのimage.tag
キー値を使用した方が良い。
ただ、コンテナイメージを自前のイメージリポジトリで管理している場合は、デフォルトのimage.tag
キー値を参照してバージョンを確認し、揃えるようにする。
▼ imagePullSecrets¶
チャート内のDeploymentの.spec.template.spec.imagePullSecrets
キーに値を設定する。
imagePullSecrets: foo-repository-credentials-secret
▼ ingress.annotations¶
チャート内のIngressの.metadata.annotations
オプションに値を設定する。
ingress:
annotations: kubernetes.io/ingress.class: foo-ingress-class
▼ ingress.enabled¶
ingress:
annotations: "true"
Ingressの作成を有効化する。
▼ ingress.hosts¶
チャート内のIngressの.spec.rules
キーに値を設定する。
ingress:
hosts:
- example.com
▼ ingress.tls¶
チャート内のIngressの.spec.tls
キーに値を設定する。
ingress:
tls:
- hosts:
- example.com
secretName: foo-certificate-secret
▼ nameOverride¶
nameOverride: foo
デフォルトでは、チャートによって作成されるKubernetesリソース名は、『<Helmリリース名>-<Chart名>
』になる。
もし、nameOverride
オプションを設定していた場合、Kubernetesリソース名は『<Helmリリース名>-<nameOverrideオプションの値>
』になる。
補足としてチャートごとに、Kubernetesリソース名の前後に特定の文字列 (例:コンポーネント名、番号、インスタンスハッシュ値) がつくことがある。
fullnameOverride
オプションとは独立しており、fullnameOverride
オプションでチャートをインストールした後にnameOverride
オプションに移行したい場合、fullnameOverride
オプションによるチャートを一度アンインストールする必要がある。
しかし、そのままnameOverride
オプションに移行してしまうと、fullnameOverride
オプション時のKubernetesリソースが残骸として残ってしまう可能性がある。
▼ nodeSelector¶
チャート内のDeploymentの.spec.template.spec.nodeSelector
キーに値を設定する。
nodeSelector:
node.kubernetes.io/nodetype: foo
▼ podSecurityContext¶
チャート内のDeploymentの.spec.template.spec.securityContext
キーに値を設定する。
securityContext:
allowPrivilegeEscalation: "false"
▼ replicaCount¶
チャート内のDeploymentの.spec.replicas
キーに値を設定する。
replicaCount: 3
▼ resources¶
チャート内のDeploymentの.spec.template.spec.containers[*].resources
オプションに値を設定する。
resources:
cpu: 50m
memory: 400Mi
▼ securityContext¶
チャート内のDeploymentの.spec.template.spec.containers[*].securityContext
オプションに値を設定する。
securityContext:
runAsUser: 1000
fsGroup: 2000
▼ serviceAccount.create¶
ServiceAccountの作成を有効化する。
serviceAccount:
create: "true"
▼ serviceAccount.annotations¶
チャート内のServiceAccountの.metadata.annotations
オプションに値を設定する。
serviceAccount:
annotations:
eks.amazonaws.com/role-arn: <IAMロールのARN>
▼ service.type¶
チャート内のServiceの.spec.type
キーに値を設定する。
service:
type: ClusterIP
▼ service.port¶
チャート内のServiceの.spec.ports.port
キーに値を設定する。
service:
port: 80
▼ tolerations¶
チャート内のDeploymentの.spec.template.spec.tolerations
キーに値を設定する。
tolerations:
- key: app
operator: Exists
effect: NoSchedule
スキーマ (values.schema.json
ファイル)¶
values.yaml
ファイルの各設定値で要求するデータ型を設定する。
{
"$schema": "https://json-schema.org/draft-07/schema#",
"properties":
{
"image":
{
"description": "Container Image",
"properties": {"repo": {"type": "string"}, "tag": {"type": "string"}},
"type": "object",
},
"name": {"description": "Service name", "type": "string"},
"port": {"description": "Port", "minimum": 0, "type": "integer"},
"protocol": {"type": "string"},
},
"required": ["protocol", "port"],
"title": "Values",
"type": "object",
}