Helm Package Manager クイズ
関連ドキュメント: Helm Package Manager
多肢選択問題
1. Helm v3 で Tiller が削除された主な理由は何ですか?
- A) パフォーマンスを向上させるため
- B) セキュリティを強化し、アーキテクチャを簡素化するため
- C) chart サイズを削減するため
- D) Kubernetes バージョン互換性のため
答えを表示
答え: B) セキュリティを強化し、アーキテクチャを簡素化するため
解説: Helm v2 の Tiller は cluster 内で昇格された権限を持って実行され、セキュリティリスクを生じさせていました。Helm v3 では Tiller が削除され、client が Kubernetes API と直接通信するようになったため、セキュリティが強化され、アーキテクチャが簡素化されました。
2. Helm Chart における values.yaml ファイルの主な目的は何ですか?
- A) chart metadata を保存すること
- B) template で使用されるデフォルト設定値を定義すること
- C) Kubernetes manifest を直接保存すること
- D) chart dependencies を定義すること
答えを表示
答え: B) template で使用されるデフォルト設定値を定義すること
解説: values.yaml ファイルは、chart template で使用されるデフォルト設定値を定義します。ユーザーは --set flag または -f flag を使用してこれらの値を上書きし、異なる環境向けに deployment をカスタマイズできます。
3. helm upgrade --install コマンドの挙動は何ですか?
- A) 常に新しい release をインストールする
- B) 常に既存の release を upgrade する
- C) release が存在しない場合はインストールし、存在する場合は upgrade する
- D) release を削除して再インストールする
答えを表示
答え: C) release が存在しない場合はインストールし、存在する場合は upgrade する
解説:helm upgrade --install は冪等な挙動を提供します。指定された release が存在しない場合は新しい release をインストールし、存在する場合は upgrade します。これは CI/CD pipeline で特に有用です。
4. Helm template 内の {{ .Release.Name }} は何を参照しますか?
- A) Chart 名
- B) Kubernetes cluster 名
- C) インストールされた release の名前
- D) Namespace 名
答えを表示
答え: C) インストールされた release の名前
解説:.Release.Name は、helm install コマンドで指定された release 名を参照する Helm built-in object です。たとえば helm install my-app chart/ では、.Release.Name は "my-app" になります。
5. Chart.yaml の dependencies field における condition attribute の目的は何ですか?
- A) dependency chart のバージョンを指定すること
- B) dependency chart を有効化/無効化する values path を指定すること
- C) dependency chart repository URL を指定すること
- D) dependency chart の優先度を指定すること
答えを表示
答え: B) dependency chart を有効化/無効化する values path を指定すること
解説:condition attribute は、dependency chart を有効にするかどうかを決定する values.yaml 内の path を指定します。たとえば condition: postgresql.enabled は、postgresql.enabled の値が true の場合にのみ PostgreSQL subchart が含まれることを意味します。
6. pre-upgrade Helm Hook はいつ実行されますか?
- A) release deletion の前
- B) upgrade request の後、resource が更新される前
- C) すべての resource が作成された後
- D) rollback completion の後
答えを表示
答え: B) upgrade request の後、resource が更新される前
解説:pre-upgrade Hook は、upgrade request を受信した後、実際の resource 更新が開始される前に実行されます。database migration や backup operation によく使用されます。
7. helm template コマンドの主な用途は何ですか?
- A) chart を cluster にデプロイすること
- B) 検証のために chart template をローカルでレンダリングすること
- C) chart dependencies を更新すること
- D) release を rollback すること
答えを表示
答え: B) 検証のために chart template をローカルでレンダリングすること
解説:helm template は chart template をローカルでレンダリングし、生成される Kubernetes manifest を事前に確認できるようにします。これにより、cluster に接続せずに template を検証できます。
8. Helm における _helpers.tpl ファイルの目的は何ですか?
- A) chart metadata を保存すること
- B) 再利用可能な template helper function を定義すること
- C) デフォルト値を保存すること
- D) post-installation message を表示すること
答えを表示
答え: B) 再利用可能な template helper function を定義すること
解説:_helpers.tpl ファイルは、複数の template で共通して使用される helper function (named template) を定義します。chart 名、label、selector などの反復的な logic をカプセル化します。
9. helm get values my-release --all コマンドは何を出力しますか?
- A) ユーザーが指定した値のみ
- B) デフォルトを含むすべての値
- C) release manifest
- D) release history
答えを表示
答え: B) デフォルトを含むすべての値
解説:--all flag を使用すると、ユーザーが上書きした値と values.yaml にある chart のデフォルト値の両方を含む、すべての計算済み値が出力されます。
10. Helm chart で toYaml と nindent function が一緒によく使用される理由は何ですか?
- A) YAML を JSON に変換するため
- B) 複雑な値を適切な indentation で YAML に挿入するため
- C) 値を Base64 encode するため
- D) 文字列を引用符で囲むため
答えを表示
答え: B) 複雑な値を適切な indentation で YAML に挿入するため
解説:toYaml は Go object を YAML 文字列に変換し、nindent は指定された数の space による indentation を適用します。この組み合わせは、resources や annotations のような複雑な構造を template に正しく挿入するために不可欠です。
短答問題
1. Helm v3 で release 情報を保存するために使用される Kubernetes resource type は何ですか?
答えを表示
答え: Secret
解説: Helm v3 は、release 情報を release がデプロイされている namespace 内の Secrets として保存します。Secret 名の形式は sh.helm.release.v1.<release-name>.v<version> です。
2. helm dependency update コマンドによって生成される lock file の名前は何ですか?
答えを表示
答え: Chart.lock
解説:helm dependency update は Chart.yaml 内の dependencies を解析し、正確なバージョンを含む Chart.lock ファイルを生成します。このファイルにより、再現可能な build が保証されます。
3. Helm template で値が空の場合にデフォルト値を提供する function は何ですか?
答えを表示
答え: default
解説:default function は、値が空または未定義の場合にデフォルト値を提供します。使用例: {{ .Values.image.tag | default .Chart.AppVersion }}
4. Helm Hooks の実行順序を制御する annotation は何ですか?
答えを表示
答え: helm.sh/hook-weight
解説:helm.sh/hook-weight annotation は、同じ Hook type 内での実行順序を決定します。小さい数値ほど先に実行され、負の値も許可されています。
5. Helm chart の NOTES.txt ファイルはいつユーザーに表示されますか?
答えを表示
答え: helm install または helm upgrade が正常に完了した後
解説: NOTES.txt は、インストールまたは upgrade が成功した後にユーザーに表示されます。通常、application access 手順と initial setup guidance が含まれます。
ハンズオン問題
1. 次の要件を満たす Helm コマンドを書いてください:
- bitnami/nginx chart を "web-server" release としてインストールする
- "frontend" namespace にデプロイする (存在しない場合は作成する)
- replicaCount を 3 に設定する
答えを表示
helm install web-server bitnami/nginx \
-n frontend --create-namespace \
--set replicaCount=3解説:
helm install web-server bitnami/nginx: nginx chart を "web-server" release としてインストールする-n frontend: frontend namespace を指定する--create-namespace: namespace が存在しない場合に作成する--set: 値を inline で上書きする
2. 次の Helm template snippet の出力を予測してください:
# values.yaml
env:
LOG_LEVEL: debug
MAX_CONNECTIONS: "100"
# template
env:
{{- range $key, $value := .Values.env }}
- name: {{ $key }}
value: {{ $value | quote }}
{{- end }}答えを表示
env:
- name: LOG_LEVEL
value: "debug"
- name: MAX_CONNECTIONS
value: "100"解説:
rangefunction は.Values.envmap を反復処理します$keyは map key、$valueは map value ですquotefunction は値を引用符で囲みます- map はアルファベット順にソートされます
3. 次の要件を満たす _helpers.tpl template を書いてください:
- Name: mychart.labels
- app.kubernetes.io/name: chart name
- app.kubernetes.io/instance: release name
- app.kubernetes.io/version: app version
答えを表示
{{- define "mychart.labels" -}}
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}解説:
defineは再利用可能な named template を作成します.Chart.Nameは chart 名を参照します.Release.Nameは release 名を参照します.Chart.AppVersionは app version を参照します (quote により string type が保証されます)
高度な問題
1. Helm chart を使用して Blue-Green deployment と Canary deployment を実装する方法を説明してください。
答えを表示
Blue-Green Deployment:
# values.yaml
deployment:
activeColor: blue
blue:
enabled: true
image:
tag: "v1.0.0"
green:
enabled: true
image:
tag: "v2.0.0"
service:
selector:
color: "{{ .Values.deployment.activeColor }}"実装戦略:
- Blue と Green 用に 2 つの Deployment template を作成する
- activeColor value を使用して Service selector を切り替える
- deployment 中に green.image.tag を新しいバージョンに設定する
- 検証後、deployment.activeColor を green に変更する
- 問題が発生した場合はすぐに blue に rollback する
Canary Deployment (with Istio):
# VirtualService for traffic distribution
http:
- route:
- destination:
host: myapp
subset: stable
weight: 90
- destination:
host: myapp
subset: canary
weight: 10実装戦略:
- Stable と Canary 用に 2 つの Deployments を作成する
- Istio VirtualService を使用して traffic ratio を制御する
- Canary ratio を段階的に増やす (10% -> 25% -> 50% -> 100%)
- metric monitoring に基づく自動 rollback を実装する
2. Helm chart のセキュリティのベストプラクティスを説明し、secret management strategy を設計してください。
答えを表示
セキュリティのベストプラクティス:
- Value Validation (values.schema.json)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"required": ["image"],
"properties": {
"image": {
"type": "object",
"required": ["repository"],
"properties": {
"repository": {
"type": "string",
"pattern": "^[a-z0-9.-/]+$"
}
}
}
}
}- RBAC Least Privilege Principle
rules:
- apiGroups: [""]
resources: ["configmaps"]
verbs: ["get", "list"] # Grant only necessary permissions- Pod Security Standards の適用
securityContext:
runAsNonRoot: true
readOnlyRootFilesystem: true
capabilities:
drop: ["ALL"]Secret Management Strategy:
- External Secrets Manager 連携 (AWS Secrets Manager)
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: {{ include "mychart.fullname" . }}
spec:
refreshInterval: 1h
secretStoreRef:
name: aws-secrets-manager
kind: ClusterSecretStore
target:
name: {{ include "mychart.fullname" . }}-secrets
data:
- secretKey: database-password
remoteRef:
key: myapp/database
property: password- Sealed Secrets の使用
# Encrypt secret
kubeseal --format=yaml < secret.yaml > sealed-secret.yaml- Helm Secrets Plugin
# Use encrypted values file
helm secrets install myapp ./mychart -f secrets.yaml