mcpField
H
helm-chart-scaffolding

helm-chart-scaffolding

github.com/hermeticormusクラウド・DevOps12376 回インストール4 週間前に更新
リポジトリ

helm-chart-scaffolding について

helm-chart-scaffolding は、Kubernetes アプリをパッケージ化したり、複数環境へのデプロイを管理したりする開発者向けの Helm Chart 作成ガイドです。テンプレート、依存関係、検証、配布の手順を扱います。

主な機能

  1. 01Chart 構成とメタデータの設計
  2. 02Go テンプレートと values の管理
  3. 03Chart 依存関係の管理
  4. 04Lint・レンダリング・インストール検証
  5. 05パッケージ化とリポジトリ配布

活用シーン

  1. 01アプリケーション Chart の新規作成
  2. 02複数環境向けデプロイ設定
  3. 03配布用 Kubernetes アプリのパッケージ化
  4. 04テンプレートや依存関係の問題確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/hermeticormus/libreuiux-claude-code --skill helm-chart-scaffolding

インストール後、Claude Code で/helm-chart-scaffoldingを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

assets/
Chart.yaml.template
values.yaml.template
references/
chart-structure.md
scripts/
validate-chart.sh

詳細

Helm チャートのスキャフォールディング

Kubernetes アプリケーションのパッケージ化とデプロイに使用する Helm チャートの作成、整理、管理に関する包括的なガイダンスです。

目的

このスキルでは、チャートの構造、テンプレートパターン、値の管理、検証方法など、本番環境で使用できる Helm チャートを構築するための手順を説明します。

このスキルを使用する場面

次のような場合に、このスキルを使用してください。

  • Helm チャートを新規に作成する
  • Kubernetes アプリケーションを配布用にパッケージ化する
  • Helm で複数環境へのデプロイを管理する
  • 再利用可能な Kubernetes マニフェストのテンプレートを実装する
  • Helm チャートリポジトリを設定する
  • Helm のベストプラクティスと規約に従う

Helm の概要

Helm は Kubernetes 用のパッケージマネージャーで、次の機能を提供します。

  • Kubernetes マニフェストをテンプレート化して再利用できるようにする
  • アプリケーションのリリースとロールバックを管理する
  • チャート間の依存関係を処理する
  • デプロイのバージョン管理を提供する
  • 環境間の構成管理を簡素化する

手順ごとのワークフロー

1. チャート構造を初期化する

新しいチャートを作成する:

helm create my-app

標準的なチャート構造:

my-app/
├── Chart.yaml           # Chart metadata
├── values.yaml          # Default configuration values
├── charts/              # Chart dependencies
├── templates/           # Kubernetes manifest templates
│   ├── NOTES.txt       # Post-install notes
│   ├── _helpers.tpl    # Template helpers
│   ├── deployment.yaml
│   ├── service.yaml
│   ├── ingress.yaml
│   ├── serviceaccount.yaml
│   ├── hpa.yaml
│   └── tests/
│       └── test-connection.yaml
└── .helmignore         # Files to ignore
2. Chart.yaml を設定する

チャートのメタデータでパッケージを定義します。

apiVersion: v2
name: my-app
description: A Helm chart for My Application
type: application
version: 1.0.0      # Chart version
appVersion: "2.1.0" # Application version

# Keywords for chart discovery
keywords:
  - web
  - api
  - backend

# Maintainer information
maintainers:
  - name: DevOps Team
    email: [email protected]
    url: https://github.com/example/my-app

# Source code repository
sources:
  - https://github.com/example/my-app

# Homepage
home: https://example.com

# Chart icon
icon: https://example.com/icon.png

# Dependencies
dependencies:
  - name: postgresql
    version: "12.0.0"
    repository: "https://charts.bitnami.com/bitnami"
    condition: postgresql.enabled
  - name: redis
    version: "17.0.0"
    repository: "https://charts.bitnami.com/bitnami"
    condition: redis.enabled

参照: 完全な例は assets/Chart.yaml.template を参照してください。

3. values.yaml の構造を設計する

値を階層的に整理します。

# Image configuration
image:
  repository: myapp
  tag: "1.0.0"
  pullPolicy: IfNotPresent

# Number of replicas
replicaCount: 3

# Service configuration
service:
  type: ClusterIP
  port: 80
  targetPort: 8080

# Ingress configuration
ingress:
  enabled: false
  className: nginx
  hosts:
    - host: app.example.com
      paths:
        - path: /
          pathType: Prefix

# Resources
resources:
  requests:
    memory: "256Mi"
    cpu: "250m"
  limits:
    memory: "512Mi"
    cpu: "500m"

# Autoscaling
autoscaling:
  enabled: false
  minReplicas: 2
  maxReplicas: 10
  targetCPUUtilizationPercentage: 80

# Environment variables
env:
  - name: LOG_LEVEL
    value: "info"

# ConfigMap data
configMap:
  data:
    APP_MODE: production

# Dependencies
postgresql:
  enabled: true
  auth:
    database: myapp
    username: myapp

redis:
  enabled: false

参照: 完全な構造は assets/values.yaml.template を参照してください。

4. テンプレートファイルを作成する

Helm 関数を使った Go テンプレートを使用します。

templates/deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "my-app.fullname" . }}
  labels:
    {{- include "my-app.labels" . | nindent 4 }}
spec:
  {{- if not .Values.autoscaling.enabled }}
  replicas: {{ .Values.replicaCount }}
  {{- end }}
  selector:
    matchLabels:
      {{- include "my-app.selectorLabels" . | nindent 6 }}
  template:
    metadata:
      labels:
        {{- include "my-app.selectorLabels" . | nindent 8 }}
    spec:
      containers:
      - name: {{ .Chart.Name }}
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
        imagePullPolicy: {{ .Values.image.pullPolicy }}
        ports:
        - name: http
          containerPort: {{ .Values.service.targetPort }}
        resources:
          {{- toYaml .Values.resources | nindent 12 }}
        env:
          {{- toYaml .Values.env | nindent 12 }}
5. テンプレートヘルパーを作成する

templates/_helpers.tpl:

{{/*
Expand the name of the chart.
*/}}
{{- define "my-app.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}

{{/*
Create a default fully qualified app name.
*/}}
{{- define "my-app.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- if contains $name .Release.Name }}
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
{{- end }}

{{/*
Common labels
*/}}
{{- define "my-app.labels" -}}
helm.sh/chart: {{ include "my-app.chart" . }}
{{ include "my-app.selectorLabels" . }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}

{{/*
Selector labels
*/}}
{{- define "my-app.selectorLabels" -}}
app.kubernetes.io/name: {{ include "my-app.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
6. 依存関係を管理する

Chart.yaml に依存関係を追加します。

dependencies:
  - name: postgresql
    version: "12.0.0"
    repository: "https://charts.bitnami.com/bitnami"
    condition: postgresql.enabled

依存関係を更新します。

helm dependency update
helm dependency build

依存関係の値をオーバーライドします。

# values.yaml
postgresql:
  enabled: true
  auth:
    database: myapp
    username: myapp
    password: changeme
  primary:
    persistence:
      enabled: true
      size: 10Gi
7. テストと検証を行う

検証コマンド:

# Lint the chart
helm lint my-app/

# Dry-run installation
helm install my-app ./my-app --dry-run --debug

# Template rendering
helm template my-app ./my-app

# Template with values
helm template my-app ./my-app -f values-prod.yaml

# Show computed values
helm show values ./my-app

検証スクリプト:

#!/bin/bash
set -e

echo "Linting chart..."
helm lint .

echo "Testing template rendering..."
helm template test-release . --dry-run

echo "Checking for required values..."
helm template test-release . --validate

echo "All validations passed!"

参照: scripts/validate-chart.sh を参照してください。

8. パッケージ化して配布する

チャートをパッケージ化します。

helm package my-app/
# Creates: my-app-1.0.0.tgz

チャートリポジトリを作成します。

# Create index
helm repo index .

# Upload to repository
# AWS S3 example
aws s3 sync . s3://my-helm-charts/ --exclude "*" --include "*.tgz" --include "index.yaml"

チャートを使用します。

helm repo add my-repo https://charts.example.com
helm repo update
helm install my-app my-repo/my-app
9. 複数環境の構成

環境固有の値ファイル:

my-app/
├── values.yaml          # Defaults
├── values-dev.yaml      # Development
├── values-staging.yaml  # Staging
└── values-prod.yaml     # Production

values-prod.yaml:

replicaCount: 5

image:
  tag: "2.1.0"

resources:
  requests:
    memory: "512Mi"
    cpu: "500m"
  limits:
    memory: "1Gi"
    cpu: "1000m"

autoscaling:
  enabled: true
  minReplicas: 3
  maxReplicas: 20

ingress:
  enabled: true
  hosts:
    - host: app.example.com
      paths:
        - path: /
          pathType: Prefix

postgresql:
  enabled: true
  primary:
    persistence:
      size: 100Gi

環境を指定してインストールします。

helm install my-app ./my-app -f values-prod.yaml --namespace production
10. フックとテストを実装する

インストール前フック:

# templates/pre-install-job.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: {{ include "my-app.fullname" . }}-db-setup
  annotations:
    "helm.sh/hook": pre-install
    "helm.sh/hook-weight": "-5"
    "helm.sh/hook-delete-policy": hook-succeeded
spec:
  template:
    spec:
      containers:
      - name: db-setup
        image: postgres:15
        command: ["psql", "-c", "CREATE DATABASE myapp"]
      restartPolicy: Never

接続をテストします。

# templates/tests/test-connection.yaml
apiVersion: v1
kind: Pod
metadata:
  name: "{{ include "my-app.fullname" . }}-test-connection"
  annotations:
    "helm.sh/hook": test
spec:
  containers:
  - name: wget
    image: busybox
    command: ['wget']
    args: ['{{ include "my-app.fullname" . }}:{{ .Values.service.port }}']
  restartPolicy: Never

テストを実行します。

helm test my-app

よく使われるパターン

パターン 1:条件付きリソース
{{- if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: {{ include "my-app.fullname" . }}
spec:
  # ...
{{- end }}
パターン 2:リストの反復処理
env:
{{- range .Values.env }}
- name: {{ .name }}
  value: {{ .value | quote }}
{{- end }}
パターン 3:ファイルのインクルード
data:
  config.yaml: |
    {{- .Files.Get "config/application.yaml" | nindent 4 }}
パターン 4:グローバル値
global:
  imageRegistry: docker.io
  imagePullSecrets:
    - name: regcred

# Use in templates:
image: {{ .Values.global.imageRegistry }}/{{ .Values.image.repository }}

ベストプラクティス

  1. チャートとアプリのバージョンには、セマンティックバージョニングを使用する
  2. values.yaml のすべての値をコメントで説明する
  3. 繰り返し使用するロジックには、テンプレートヘルパーを使用する
  4. パッケージ化する前に、チャートを検証する
  5. 依存関係のバージョンを明示的に固定する
  6. オプションのリソースには、条件を使用する
  7. 命名規則(小文字、ハイフン)に従う
  8. 使用方法を説明する NOTES.txt を含める
  9. ヘルパーを使用して、ラベルを一貫して追加する
  10. すべての環境でインストールをテストする

トラブルシューティング

テンプレートのレンダリングエラー:

helm template my-app ./my-app --debug

依存関係の問題:

helm dependency update
helm dependency list

インストールの失敗:

helm install my-app ./my-app --dry-run --debug
kubectl get events --sort-by='.lastTimestamp'

参照ファイル

  • assets/Chart.yaml.template - チャートメタデータのテンプレート
  • assets/values.yaml.template - 値の構造のテンプレート
  • scripts/validate-chart.sh - 検証スクリプト
  • references/chart-structure.md - チャート構成の詳細

関連スキル

  • k8s-manifest-generator - Kubernetes の基本マニフェストを作成するためのスキル
  • gitops-workflow - Helm チャートのデプロイを自動化するためのスキル

コメント