kustomize について
テンプレートを使わず、宣言的に Kubernetes リソースをカスタマイズするスキルです。環境別設定の管理、既存マニフェストのパッチ適用、サードパーティーリソースの調整に向いています。
主な機能
- 01base と overlay による環境設定管理
- 02マージパッチと JSON パッチの適用
- 03ConfigMap と Secret の生成
- 04イメージ、名前空間、レプリカ数の変換
- 05コンポーネントとリモートリソースの構成
活用シーン
- 01開発環境と本番環境の設定管理
- 02base マニフェストを変えずにリソースを修正
- 03設定ファイルから ConfigMap や Secret を生成
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ bagelhole/ devops-security-agent-skills --skill kustomizeインストール後、Claude Code で/kustomizeを入力して読み込まれたか確認します。
詳細
Kustomize
テンプレートを使わず、Kubernetes リソースを宣言的にカスタマイズします。
このスキルを使う場面
次のような場合にこのスキルを使用します:
- 環境ごとに Kubernetes の設定を管理する
- 既存のマニフェストを変更せずにパッチを適用する
- ベースから設定のバリエーションを作成する
- サードパーティのマニフェストをカスタマイズする
- テンプレート方式よりも宣言的な方法を優先する
前提条件
- kubectl 1.14 以降(kustomize を含む)
- またはスタンドアロンの kustomize CLI
- Kubernetes マニフェストに関する基本的な知識
ディレクトリ構成
myapp/
├── base/
│ ├── kustomization.yaml
│ ├── deployment.yaml
│ ├── service.yaml
│ └── configmap.yaml
└── overlays/
├── development/
│ ├── kustomization.yaml
│ └── replica-patch.yaml
├── staging/
│ ├── kustomization.yaml
│ └── namespace.yaml
└── production/
├── kustomization.yaml
├── replica-patch.yaml
└── resource-patch.yaml
ベース設定
kustomization.yaml
# base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
- configmap.yaml
commonLabels:
app: myapp
commonAnnotations:
managed-by: kustomize
ベースリソース
# base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:latest
ports:
- containerPort: 8080
resources:
requests:
memory: "64Mi"
cpu: "100m"
limits:
memory: "128Mi"
cpu: "200m"
オーバーレイ
開発用オーバーレイ
# overlays/development/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
namespace: myapp-dev
namePrefix: dev-
commonLabels:
environment: development
images:
- name: myapp
newTag: dev-latest
本番用オーバーレイ
# overlays/production/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
namespace: myapp-prod
namePrefix: prod-
commonLabels:
environment: production
replicas:
- name: myapp
count: 5
images:
- name: myapp
newName: registry.example.com/myapp
newTag: v2.0.0
patches:
- path: resource-patch.yaml
パッチ
戦略的マージパッチ
# overlays/production/resource-patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
template:
spec:
containers:
- name: myapp
resources:
requests:
memory: "256Mi"
cpu: "500m"
limits:
memory: "512Mi"
cpu: "1000m"
JSON パッチ
# kustomization.yaml
patches:
- target:
kind: Deployment
name: myapp
patch: |-
- op: replace
path: /spec/replicas
value: 5
- op: add
path: /spec/template/spec/containers/0/env
value:
- name: LOG_LEVEL
value: info
インラインパッチ
# kustomization.yaml
patches:
- patch: |-
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
target:
kind: Deployment
name: myapp
設定の生成
ConfigMap ジェネレーター
# kustomization.yaml
configMapGenerator:
- name: myapp-config
literals:
- APP_ENV=production
- LOG_LEVEL=info
files:
- config.yaml
envs:
- config.env
options:
disableNameSuffixHash: false
Secret ジェネレーター
# kustomization.yaml
secretGenerator:
- name: myapp-secrets
literals:
- api-key=secret123
files:
- tls.crt
- tls.key
type: kubernetes.io/tls
イメージの変換
# kustomization.yaml
images:
# Change tag
- name: myapp
newTag: v2.0.0
# Change registry
- name: myapp
newName: registry.example.com/myapp
newTag: v2.0.0
# Use digest
- name: myapp
digest: sha256:abc123...
リソースの変換
名前のプレフィックス/サフィックス
# kustomization.yaml
namePrefix: prod-
nameSuffix: -v2
名前空間
# kustomization.yaml
namespace: production
ラベルとアノテーション
# kustomization.yaml
commonLabels:
app.kubernetes.io/name: myapp
app.kubernetes.io/environment: production
commonAnnotations:
example.com/owner: team-a
レプリカ数
# kustomization.yaml
replicas:
- name: myapp
count: 5
- name: worker
count: 3
コンポーネント
# components/monitoring/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1alpha1
kind: Component
resources:
- servicemonitor.yaml
patches:
- patch: |-
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
template:
metadata:
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "8080"
# overlays/production/kustomization.yaml
components:
- ../../components/monitoring
リモートリソース
# kustomization.yaml
resources:
# Remote Git repository
- https://github.com/org/manifests//base?ref=v1.0.0
# Remote URL
- https://raw.githubusercontent.com/org/repo/main/deployment.yaml
コマンド
# Build and view output
kubectl kustomize overlays/production
# Apply to cluster
kubectl apply -k overlays/production
# Delete resources
kubectl delete -k overlays/production
# View diff
kubectl diff -k overlays/production
# Build with standalone kustomize
kustomize build overlays/production
# Build and apply
kustomize build overlays/production | kubectl apply -f -
Helm チャートの統合
# kustomization.yaml
helmCharts:
- name: prometheus
repo: https://prometheus-community.github.io/helm-charts
version: 25.0.0
releaseName: prometheus
namespace: monitoring
valuesFile: values.yaml
includeCRDs: true
変数の置換
# kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
replacements:
- source:
kind: ConfigMap
name: myapp-config
fieldPath: data.APP_VERSION
targets:
- select:
kind: Deployment
name: myapp
fieldPaths:
- spec.template.spec.containers.[name=myapp].image
options:
delimiter: ':'
index: 1
よくある問題
問題:名前のハッシュが競合する
問題:ConfigMap を変更してもリソースが更新されない 解決策:名前のサフィックスハッシュを有効にする(デフォルト)。または置換を使用する
問題:パッチが適用されない
問題:戦略的マージパッチが機能しない 解決策:リソース名が一致していることを確認し、複雑な変更には JSON パッチを使用する
問題:リモートリソースの取得に失敗する
問題:リモートリソースを取得できない 解決策:URL を確認し、ref/tag が存在することとネットワークにアクセスできることを確認する
問題:ラベルセレクターが一致しない
問題:commonLabels によってセレクターが機能しなくなる 解決策:includeSelectors: false を使用するか、特定のリソースを除外する
commonLabels:
app: myapp
configurations:
- labelExclusions.yaml
ベストプラクティス
- ベースマニフェストは環境に依存しない状態に保つ
- 環境固有の設定にはオーバーレイを使用する
- 単純な変更には戦略的マージパッチを優先する
- オプション機能にはコンポーネントを使用する
- リモートリソースのバージョンを固定する
- ConfigMap/Secret のハッシュサフィックスを有効にする
- README にオーバーレイ構造を記載する
- 適用前にビルドをテストする
関連スキル
- kubernetes-ops - K8s の基礎
- helm-charts - Helm の代替手段
- argocd-gitops - GitOps によるデプロイ
コメント
Markdown 対応