ブログに戻るトラブルシューティング

KubernetesのYAML検証を確実に行う方法|デプロイ前のエラーをゼロに

YAMLforge Team
44 分で読める
yamljsondevops
Best Kubernetes YAML Validators for Error-Free Deploymentsのカバー画像

KubernetesのYAML検証を確実に行う方法|デプロイ前のエラーをゼロに

Kubernetesのデプロイがうまく起動しない原因を2時間もかけてデバッグしたら、YAMLのインデントが1箇所だけズレていただけだった——こんな経験、きっとありますよね。本当にイライラしますが、誰もが一度は通る道です。

フォージくんをご紹介 🤖 — YAMLforgeの公式ガイドキャラクターです!この記事では、フォージくんが要所要所でヒントや注意点、ちょっとした豆知識を教えてくれます。経験豊富な先輩エンジニアが横で見守ってくれているような気持ちで読み進めてください!

😅 フォージくん: あー、これね、みんな一回はハマるやつ。僕もそうだった。
😅 フォージくん: あー、これね。僕も昔、デプロイの問題を3時間追いかけて、結局YAMLの中でタブとスペースが混ざってただけってことがあった。Kubernetesの神様は、あの日めちゃくちゃ怒ってたと思う。

Kubernetes YAML検証ツールとは何か

Kubernetes YAML検証ツールは、マニフェストファイルをクラスタにデプロイする前に、エラーをチェックしてくれるツールです。主に3種類の問題を検出します。

構文エラー — インデントの誤り、コロンの欠落、リストの形式ミスなど、YAML構造として無効なもの。これらはYAMLパーサーが完全に処理できません。

スキーマ違反 — YAMLとしては正しいけれど、Kubernetes APIの仕様に合っていないもの。たとえば replicas: "3"(文字列)を replicas: 3(整数)の代わりに使ったり、containerscontianers とタイプミスするケースです。

論理エラー — 技術的には正しい設定なのに、実際には動作しないもの。存在しないConfigMapを参照したり、ノードが提供できる以上のリソースを要求するケースなどです。

検証はさまざまな段階で行えます。エディタでの開発中、CI/CDパイプラインでデプロイ前、あるいは kubectl でマニフェストを適用する直前などです。エラーを早期に発見するほど、デバッグに費やす時間は少なくなります。

🤔 フォージくん: ちなみにね、Kubernetes APIには50種類以上のリソースタイプがあって、それぞれ数百個のフィールドがあるんだ。だから自動検証が不可欠なわけ。誰もこれ全部は暗記できないからね!
YAML server: port: 8080 host: localhost 変換 JSON {"server": { "port": 8080, "host": "localhost"}}

Kubernetes YAML検証ツールの種類

kubectlの組み込み検証機能

Kubernetesには kubectl を通じて基本的な検証機能が組み込まれています。kubectl applykubectl create を実行すると、YAMLがAPIサーバーのスキーマに対してチェックされます。

# 変更を適用せずにドライラン検証
kubectl apply --dry-run=client -f deployment.yaml

# サーバー側での検証(実際のクラスタに対してチェック)
kubectl apply --dry-run=server -f deployment.yaml

--dry-run=client フラグは構文とスキーマをローカルで検証し、--dry-run=server はマニフェストをAPIサーバーに送信して検証しますが、実際にリソースは作成しません。

💡 フォージくん: ポイントはね、可能な限り --dry-run=server を使うこと。クライアント側の検証では見逃す問題——たとえばクラスタバージョン固有のAPI非推奨警告とか——をちゃんと検出してくれるからね!

静的解析ツール

静的解析ツールは、Kubernetesクラスタに接続せずにYAMLファイルをチェックします。人気のツールには以下があります。

kubeval — マニフェストをKubernetesのJSONスキーマに対して検証します。高速で軽量、CI/CDパイプラインに最適です。

kubeval deployment.yaml

kubeconform — kubevalのより高速でモダンな代替ツール。スキーマサポートが優れています。

kubeconform deployment.yaml

kube-score — 検証だけでなく、ベストプラクティスの推奨やセキュリティチェックも提供します。

kube-score score deployment.yaml

これらのツールはオフラインで動作し、自動化ワークフローに簡単に組み込めます。クラスタアクセスが不要なので、サーバー側検証より高速です。

⚠️ フォージくん: ここ注意ね!静的検証ツールは標準的なKubernetesリソースしか知らない。Custom Resource Definitions(CRD)を使っている場合は、カスタムスキーマに対応したツールを使うか、サーバー側検証にフォールバックする必要があるよ。
ステップ 1 Write YAML ステップ 2 Run Validator ステップ 3 Fix Errors:Deploy

IDEとエディタの統合機能

最近のコードエディタは、入力中にリアルタイムでYAML検証を提供します。

VS Code のKubernetes拡張機能は、インラインエラー表示とKubernetesフィールドのオートコンプリートを提供します。スキーマに対して検証し、問題を即座にハイライトしてくれます。

IntelliJ IDEAGoLand には、スキーマ検証とインテリジェントなコード補完を備えた組み込みKubernetesサポートがあります。

VimNeovim のユーザーは、Language Server Protocol(LSP)サポート付きの vim-kubernetes などのプラグインをインストールできます。

リアルタイム検証により、ファイルを保存する前にエラーを発見できるため、デバッグサイクルが劇的に短縮されます。

🚀 フォージくん: 慣れてきたらさ、保存時に kube-score を実行するようにエディタを設定してみて。検証エラーとベストプラクティス違反の両方を、IDEを離れずに検出できるようになるよ!

Kubernetes検証ツールが検出する一般的なYAMLミス

インデントのエラー

YAMLはインデントに非常に厳しい言語です。Kubernetesマニフェストは一貫したスペーシングを使用する必要があり、タブとスペースを混在させると解析に失敗します。

# ❌ 間違い - インデントが一貫していない
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
   replicas: 3  # 3スペース
  selector:     # 2スペース
    matchLabels:
      app: myapp
# ✅ 正しい - 2スペースで一貫したインデント
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
⚠️ フォージくん: ここ注意ね!エディタを設定して、空白文字を表示させて、タブを自動的にスペースに変換するようにしておこう。マジで、何時間ものフラストレーションを回避できるから!

Kubernetesにおけるノルウェー問題

経験豊富な開発者でさえ引っかかる、ちょっと厄介なバグがあります。YAML 1.1は特定の国コードをブール値として扱います。

apiVersion: v1
kind: ConfigMap
metadata:
  name: countries
data:
  norway: NO     # falseになってしまう!
  yes_option: YES  # trueになってしまう!
  canada: CA     # 文字列のまま

ほとんどのYAMLパーサーは NOYESONOFF をブール値に変換します。Kubernetes ConfigMapでは、これによってデータが破損します。

{
  "data": {
    "norway": false,
    "yes_option": true,
    "canada": "CA"
  }
}
⚠️ フォージくん: ここ注意ね!これが悪名高い「ノルウェー問題」ってやつ。ブール値として解釈される可能性のある値は必ず引用符で囲もう:norway: "NO" みたいに。YAMLforgeなら、YAMLを変換したり検証する際に、こういう値を自動的に検出して文字列として保持してくれるよ!
問題点 country: NO 解析結果: false (boolean) 解決策 country: "NO" 保持: "NO" (string)

型の不一致

Kubernetesは各フィールドに対して特定のデータ型を期待します。よくあるミスは、整数が必要な場所で文字列を使うことです。

# ❌ 間違い - replicasは整数であるべきで、文字列ではない
apiVersion: apps/v1
kind: Deployment
spec:
  replicas: "3"  # 文字列型
  template:
    spec:
      containers:
      - name: app
        resources:
          requests:
            memory: "128Mi"
            cpu: "500m"  # これは正しい - CPU値は文字列
# ✅ 正しい - 適切な型
apiVersion: apps/v1
kind: Deployment
spec:
  replicas: 3  # 整数型
  template:
    spec:
      containers:
      - name: app
        resources:
          requests:
            memory: "128Mi"
            cpu: "500m"

検証ツールは、デプロイ前にこれらの型の不一致を検出してくれます。cpumemory のような一部のフィールドは、単位(500m128Mi)を含むため文字列である必要があります。

💡 フォージくん: ポイントはね、YAMLとJSONを頻繁に変換する場合は、型を正しく保持するツールを使うこと。YAMLforgeなら、変換中に整数、文字列、ブール値の型をちゃんと維持してくれるよ!

必須フィールドの欠落

すべてのKubernetesリソースには必須フィールドがあります。検証ツールはこれらを即座に検出します。

# ❌ 間違い - 必須フィールドが欠けている
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  template:
    spec:
      containers:
      - name: app
        image: nginx:latest
# 欠けている: spec.selector と spec.template.metadata.labels
# ✅ 正しい - すべての必須フィールドが存在
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: app
        image: nginx:latest

selector.matchLabelstemplate.metadata.labels と完全に一致する必要があります。そうしないと、DeploymentがどのPodも管理できなくなります。

CI/CDパイプラインでのYAML検証

継続的インテグレーションパイプラインに検証を組み込むことで、エラーが本番環境に到達する前に検出できます。

GitHub Actionsの例

name: Validate Kubernetes Manifests

on:
  pull_request:
    paths:
      - 'k8s/**/*.yaml'

jobs:
  validate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Install kubeconform
        run: |
          wget https://github.com/yannh/kubeconform/releases/latest/download/kubeconform-linux-amd64.tar.gz
          tar xf kubeconform-linux-amd64.tar.gz
          sudo mv kubeconform /usr/local/bin/
      
      - name: Validate manifests
        run: |
          kubeconform -summary k8s/**/*.yaml

このワークフローは、すべてのプルリクエストで実行され、k8s/ ディレクトリ内のすべてのYAMLファイルをマージ前に検証します。

🚀 フォージくん: 慣れてきたらさ、パイプラインに kube-score も追加してみて。リソース制限、セキュリティコンテキスト、プローブ設定などのベストプラクティスを自動的に強制してくれるよ!

GitLab CIの例

validate-k8s:
  stage: test
  image: alpine:latest
  before_script:
    - apk add --no-cache curl
    - curl -L https://github.com/yannh/kubeconform/releases/latest/download/kubeconform-linux-amd64.tar.gz | tar xz
    - mv kubeconform /usr/local/bin/
  script:
    - kubeconform -summary manifests/**/*.yaml
  only:
    changes:
      - manifests/**/*.yaml

Pre-commitフック

さらに迅速なフィードバックを得るために、コミット前にローカルでYAMLを検証できます。

# .pre-commit-config.yaml
repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v4.4.0
    hooks:
      - id: check-yaml
        args: ['--unsafe']  # カスタムタグを許可
  
  - repo: local
    hooks:
      - id: kubeconform
        name: Validate Kubernetes manifests
        entry: kubeconform
        language: system
        files: \.yaml$

pre-commit install でインストールすると、git commit 時に自動的に検証が実行されます。

高度な検証テクニック

OPAによるポリシー適用

Open Policy Agent(OPA)を使うと、標準的なKubernetesスキーマを超えたカスタム検証ルールを定義できます。たとえば、すべてのコンテナにリソース制限を必須とする場合:

package kubernetes.admission

deny[msg] {
  input.request.kind.kind == "Deployment"
  container := input.request.object.spec.template.spec.containers[_]
  not container.resources.limits
  msg := sprintf("Container '%s' must have resource limits", [container.name])
}

OPAはアドミッションコントローラーと統合して、デプロイ時にポリシーを強制できます。

🎯 フォージくん: ここ大事!OPA検証は、標準的な検証ツールでは見逃すセキュリティ問題やポリシー違反を検出してくれる。コンプライアンス要件がある本番クラスタには必須だよ!

カスタムリソースの検証

Custom Resource Definitions(CRD)を使っている場合、標準的な検証ツールはカスタムスキーマを認識しません。解決策:

  1. サーバー側検証kubectl --dry-run=server を使って、クラスタにインストールされたCRDに対して検証
  2. kubeconformとCRDスキーマ — CRDスキーマを抽出してkubeconformに提供
  3. Operatorの検証 — 多くのOperatorには、カスタムリソースをチェックする検証Webhookが含まれています
# オフライン検証用のCRDスキーマを抽出
kubectl get crds -o json | \
  jq '.items[] | .spec.versions[].schema.openAPIV3Schema' \
  > custom-schemas/

# カスタムスキーマで検証
kubeconform -schema-location default \
  -schema-location 'custom-schemas/{{ .ResourceKind }}.json' \
  my-custom-resource.yaml

セキュリティ上の考慮事項

検証は構文だけの問題ではありません。セキュリティも重要です。以下をチェックするツールを探しましょう。

  • 特権コンテナ — rootとして実行されているか、昇格した権限を持っているか
  • ホストパスマウント — ノードのファイルシステムへの直接アクセス
  • セキュリティコンテキストの欠落 — Podセキュリティポリシーやコンテキストが定義されていない
  • 平文のシークレット — マニフェスト内で機密データが露出している
  • 非推奨API — 削除される予定のAPIバージョンを使用している

kube-scorekubesecPolaris などのツールは、セキュリティ検証に特化しています。

⚠️ フォージくん: ここ注意ね!プライベートリポジトリであっても、実際のシークレットをYAMLファイルにコミットしちゃダメ。Kubernetes Secrets、外部シークレットマネージャー、Sealed Secretsみたいなツールを使おう!

プライバシーとローカル処理

Kubernetesマニフェストを扱う際、多くの場合、機密性の高い設定データ——データベース接続文字列、APIエンドポイント、インフラ容量を明らかにするリソース制限——を含んでいます。

機密データを含むYAMLファイルを変換または検証する必要がある場合:

  • クライアント側ツールを使う — kubevalやkubeconformのような検証ツールはローカルで実行されます
  • オンラインコンバーターを避ける — 多くのウェブベースのYAMLツールはデータをサーバーにアップロードします
  • ブラウザ内で処理 — YAMLforgeのようなツールはすべてクライアント側で処理——データがデバイスから離れることはありません
🎯 フォージくん: ここ大事!Kubernetesの設定を処理や検証のためにJSONに変換する場合は、完全にブラウザ内で動作するツールを使おう。YAMLforgeはすべてクライアント側で処理して、インデントとコメントを保持し、ノルウェー問題も自動的に処理——しかも何もアップロードしないよ!
🎉 フォージくん: よし、これでOK!try it out at YAMLforge.dev!
YAMLforgeを選ぶ理由 100%クライアント側 ノルウェー問題解決 アンカー保持 コメント保持 無料: 10回/日 Pro: $9/月

よくある質問

クライアント側検証とサーバー側検証の違いは何ですか?

クライアント側検証(kubectl --dry-run=client)は、ローカルで汎用的なKubernetesスキーマに対してYAMLをチェックします。サーバー側検証(kubectl --dry-run=server)は、マニフェストを実際のクラスタに送信し、特定のKubernetesバージョン、インストールされたCRD、アドミッションWebhookに対してチェックします。サーバー側の方が正確ですが、クラスタアクセスが必要です。

Helmチャートを検証できますか?

はい、ただし最初にレンダリングする必要があります。helm template を使って実際のKubernetesマニフェストを生成し、それを検証します:

helm template my-chart ./chart/ | kubeconform -summary

Kustomizeで検証ツールは動作しますか?

もちろんです。まずKustomizeオーバーレイをビルドしてから検証します:

kustomize build overlays/production | kubeconform -summary

検証に合格したYAMLがデプロイに失敗するのはなぜですか?

検証は構文とスキーマをチェックしますが、すべての論理エラーは検出できません。よくある問題は、存在しないリソース(ConfigMap、Secret)の参照、利用可能なリソース以上の要求、ポートの競合などです。サーバー側検証の方が多くを検出しますが、一部は実際のデプロイ時にのみ現れます。

エディタ、CI/CD、それとも両方で検証すべきですか?

両方です!エディタの検証は開発中に即座にフィードバックを提供します。CI/CDの検証は、壊れたものがマージされないことを保証します。エディタの検証を「入力中のスペルチェック」、CI/CDの検証を「公開前の最終校正」と考えてください。

Kubernetes ConfigMapでノルウェー問題に対処するにはどうすればよいですか?

ブール値のように見える値は必ず引用符で囲みましょう:country: NO ではなく country: "NO" とします。YAMLを他の形式に変換する際は、文字列型を正しく保持するツールを使いましょう。YAMLforgeはこれらのケースを自動的に検出し、文字列として維持します。

さっそくKubernetes検証を始めましょう

ダウンタイムを引き起こす前にデプロイエラーを検出する準備はできましたか?この記事で学んだこと:

  • ✅ Kubernetes YAML検証ツールが何をチェックし、なぜ不可欠なのか
  • ✅ kubectl、kubeval、kubeconformなどの検証ツールの使い方
  • ✅ ノルウェー問題、インデントエラー、型の不一致などの一般的な落とし穴
  • ✅ CI/CDパイプラインやpre-commitフックに検証を統合する方法
  • ✅ OPAポリシーやCRD検証などの高度なテクニック
  • ✅ セキュリティ上の考慮事項とプライバシーのベストプラクティス
🎉 フォージくん: よし、これでバッチリ!まずは kubectl --dry-run=server でクイックチェックから始めて、それからCI/CDパイプラインにkubeconformを追加してみよう。機密性の高いYAML設定を変換したり処理する必要があるときは、YAMLforge.devにアクセスしてね——完全にクライアント側で処理、1日10回まで無料、サインアップ不要だよ。さあ、素晴らしいものを作ろう!
Y

YAMLforge Team

テクニカルコンテンツチーム

YAMLforgeチームは、開発者がより良いソフトウェアを構築するのを支援することに情熱を注いでいます。

YAMLforgeを無料で試す

無料のオンラインツールでYAMLをJSONに即座に変換。登録不要。

YAMLforgeを無料で試す