コンテンツにスキップ

チャート@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に対応しており、v2v3をサポートしている。

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",
}