チャート@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
また、依存対象のサブチャートのリポジトリを helm repo add する必要がある。
$ helm repo add foo https://foo.com/foo-chart
$ helm repo add bar 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",
}