mcpField
K
kustomize

kustomize

github.com/bagelholeクラウド・DevOps1.2k372 回インストール23 週間前に更新
リポジトリ

kustomize について

テンプレートを使わず、宣言的に Kubernetes リソースをカスタマイズするスキルです。環境別設定の管理、既存マニフェストのパッチ適用、サードパーティーリソースの調整に向いています。

主な機能

  1. 01base と overlay による環境設定管理
  2. 02マージパッチと JSON パッチの適用
  3. 03ConfigMap と Secret の生成
  4. 04イメージ、名前空間、レプリカ数の変換
  5. 05コンポーネントとリモートリソースの構成

活用シーン

  1. 01開発環境と本番環境の設定管理
  2. 02base マニフェストを変えずにリソースを修正
  3. 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 にオーバーレイ構造を記載する
  • 適用前にビルドをテストする

関連スキル

コメント