コンテンツにスキップ

チャート@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

また、依存対象のサブチャートのリポジトリを 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",
}