kubeval を使ったら http エラーが出ました。
使用している kubeval のバージョンは以下の通りです。
❯ kubeval --version
Version: 0.16.0
Commit: 49140f2e8137cb98fc21c52c0f68d81fb4cd5d8e
Date: 2021-03-29T17:03:19Z
発生したエラーは以下のようになっておりました。
❯ kustomize build . | kubeval
ERR - stdin: Failed initializing schema https://kubernetesjsonschema.dev/master-standalone/customresourcedefinition-apiextensions-v1.json: Could not read schema from HTTP, response status is 404 Not Found
関連する Issue を発見しました。
コマンドの引数に --schema-location
を使用して、スキーマの場所を指定する必要があるようです。
CRD を使っていたのでエラーになっているかと思います。
発生したエラーでは、ERR - stdin
とありどこの箇所でエラーが出ているのかが特定できません。
代わりに sealed-seacrets の Helm Chart で生成される生マニフェストに対して、kubeval を実行します。sealed-secrets のリポジトリを追加していない場合は、以下を実行します。
helm repo add sealed-secrets https://bitnami-labs.github.io/sealed-secrets
helm template
コマンドの出力に対して、kubeval を実行します。
❯ helm template sealed-secrets/sealed-secrets | kubeval
PASS - sealed-secrets/templates/service-account.yaml contains a valid ServiceAccount (default.RELEASE-NAME-sealed-secrets)
PASS - sealed-secrets/templates/cluster-role.yaml contains a valid ClusterRole (secrets-unsealer)
PASS - sealed-secrets/templates/cluster-role-binding.yaml contains a valid ClusterRoleBinding (RELEASE-NAME-sealed-secrets)
PASS - sealed-secrets/templates/role.yaml contains a valid Role (default.RELEASE-NAME-sealed-secrets-key-admin)
PASS - sealed-secrets/templates/role.yaml contains a valid Role (default.RELEASE-NAME-sealed-secrets-service-proxier)
PASS - sealed-secrets/templates/role-binding.yaml contains a valid RoleBinding (default.RELEASE-NAME-sealed-secrets-key-admin)
PASS - sealed-secrets/templates/role-binding.yaml contains a valid RoleBinding (default.RELEASE-NAME-sealed-secrets-service-proxier)
PASS - sealed-secrets/templates/service.yaml contains a valid Service (default.RELEASE-NAME-sealed-secrets)
PASS - sealed-secrets/templates/deployment.yaml contains a valid Deployment (default.RELEASE-NAME-sealed-secrets)
ちなみに、以下のようなコメントアウトがあると、認識されるようです。
---
# Source: crds/sealedsecret-crd.yaml
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: sealedsecrets.bitnami.com
<snip...>
---
# Source: sealed-secrets/templates/service-account.yaml
apiVersion: v1
kind: ServiceAccount
試しにコメントアウトを削除したところ、stdin
となり読み込まれてませんでした。
❯ helm template sealed-secrets/sealed-secrets | grep --color=auto -v "^#" | kubeval
PASS - stdin contains a valid ServiceAccount (default.RELEASE-NAME-sealed-secrets)
PASS - stdin contains a valid ClusterRole (secrets-unsealer)
PASS - stdin contains a valid ClusterRoleBinding (RELEASE-NAME-sealed-secrets)
PASS - stdin contains a valid Role (default.RELEASE-NAME-sealed-secrets-key-admin)
PASS - stdin contains a valid Role (default.RELEASE-NAME-sealed-secrets-service-proxier)
PASS - stdin contains a valid RoleBinding (default.RELEASE-NAME-sealed-secrets-key-admin)
PASS - stdin contains a valid RoleBinding (default.RELEASE-NAME-sealed-secrets-service-proxier)
PASS - stdin contains a valid Service (default.RELEASE-NAME-sealed-secrets)
PASS - stdin contains a valid Deployment (default.RELEASE-NAME-sealed-secrets)
今回は、CRD をインストールする —include-crds
オプションをつけて実行します。
❯ helm template sealed-secrets/sealed-secrets --include-crds | kubeval
ERR - crds/sealedsecret-crd.yaml: Failed initializing schema https://kubernetesjsonschema.dev/master-standalone/customresourcedefinition-apiextensions-v1.json: Could not read schema from HTTP, response status is 404 Not Found
同じエラーが出ました。やはり CRD を定義したマニフェストが原因のようです。
コマンドの引数に --schema-location
を使用するために、スキーマを作成します。
通常は、上記においてあるスキーマが使用されるようです。ここにないスキーマは新たに追加する必要があります。
ただ、例に挙げた SealedSecrets もそうですが、公式の GitHub でスキーマが公開されているとは限りません。
そのため、CRD の yaml ファイルからスキーマを作成することをお勧めします。公開されているツールには以下があります。
--skip-kinds
オプションをつけて、CRD をスキップする方法もあるようです。
❯ kustomize build --enable-helm sealed-secrets/base/ | kubeval --skip-kinds CustomResourceDefinition
WARN - stdin containing a CustomResourceDefinition (sealedsecrets.bitnami.com) was not validated against a schema
PASS - stdin contains a valid ServiceAccount (kube-system.sealed-secrets)
PASS - stdin contains a valid Role (kube-system.sealed-secrets-key-admin)
PASS - stdin contains a valid Role (kube-system.sealed-secrets-service-proxier)
PASS - stdin contains a valid ClusterRole (secrets-unsealer)
PASS - stdin contains a valid RoleBinding (kube-system.sealed-secrets-key-admin)
PASS - stdin contains a valid RoleBinding (kube-system.sealed-secrets-service-proxier)
PASS - stdin contains a valid ClusterRoleBinding (sealed-secrets)
PASS - stdin contains a valid Service (kube-system.sealed-secrets)
PASS - stdin contains a valid Deployment (kube-system.sealed-secrets)