Kubernetes のマニフェストファイルを手軽に色々チェックできる ValidKube を使ってみる #Kubernetesリレー
2022-03-17
azblob://2022/11/11/eyecatch/2022-03-18-k8s-manifest-validate-tool-validkube-000.jpg

この記事はなむゆの個人ブログにもマルチポストしています。

はじめに

Kubernetes のマニフェストを書いているとき、書いている内容が正しいか、ベストプラクティスに沿っているか確認したくなることがあるかと思います。
そんな時に使えるツールはいくつかありますが、その中でもブラウザ上で手軽に利用できそうなサービスがあったので紹介してみる回です。

ValidKube とは

ValidKubeは、ブラウザ上で動作する Kubernetes のマニフェスト用のチェックを行える Web アプリです。
Kubernetes のマニフェストについて、構造が正しいかどうか検証したり、不要な記述を除いたり、セキュリティ上の問題点がないかを調べたりすることができます。

このツールの実体はこの後ろで動いている個別の検証ツールで、それぞれ以下のツールがバックエンドで動いています。

  • マニフェストの構造が正しいかチェックするコマンドラインツールKubeval
  • マニフェストから不要な記述を除去して見やすくするコマンドラインツールkubectl-neat
  • マニフェストからセキュリティ上の脆弱性を検知するコマンドラインツールtrivy

Web アプリケーション上でマニフェストを入力して実行するとマニフェストがバックエンドに送られ、上記ツールを使用して検証を行い、検証結果を Web アプリケーション上で表示する仕組みで動いているようです。

使い方

ページを開くと右と左に 2 つのフォームがあります。
この中の左のフォームに検証したいマニフェストファイルの中身を張り付け、右側のフォームの上部にあるタブで検証の内容を選び、「Run」ボタンをクリックするとマニフェストの検証が行われます。

今回は例としてサンプルのマニフェストを使用してみましょう。
左側のフォームの下の Example のボタンをクリックしてから Run ボタンをクリックすると以下のような結果が出力されています。

結果の中に

'spec.replicas: Invalid type. Expected: [integer,null], given: string'  

とあることから、spec.replicas のパラメータの型が integer でなければならないのに string が入力されているので不正であると言われていますね。

同様に、右側のフォームの上部のタブから「Secure」を選択してみましょう。
するとすぐに検証が実行され、以下のような結果が出力されるはずです。

出力結果には様々な脆弱性が yaml 形式で表示されていますが例えば以下のようなものが出力されています。

  - Description: A program inside the container can elevate its own privileges and  
      run as root, which might give the program control over the container and node.  
    ID: KSV001  
    IacMetadata: {}  
    Layer: {}  
    Message: Container 'nginx' of Deployment 'nginx-deployment' should set 'securityContext.allowPrivilegeEscalation'  
      to false  
    Namespace: appshield.kubernetes.KSV001  
    PrimaryURL: https://avd.aquasec.com/appshield/ksv001  
    Query: data.appshield.kubernetes.KSV001.deny  
    References:  
    - https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted  
    - https://avd.aquasec.com/appshield/ksv001  
    Resolution: Set 'set containers[].securityContext.allowPrivilegeEscalation' to  
      'false'.  
    Severity: MEDIUM  
    Status: FAIL  
    Title: Process can elevate its own privileges  
    Type: Kubernetes Security Check  

例えば上記の脆弱性だと、「コンテナ内のプログラムが権限昇格してコンテナやノードの中身を弄り回す危険があるので、マニフェストのコンテナの設定パラメータでsecurityContext.allowPrivilegeEscalationfalseに設定してください」といった内容になります。
ここで報告される脆弱性は、Aqua security という企業が公開している脆弱性データベースが元になっており、公開されている脆弱性の一覧はこちらで閲覧することができます。

このようにして、作成したマニフェストの検証をブラウザ上で簡単に行うことができます。

使い道

このアプリケーションの実体は 3 つの個別のコマンドラインツールです。
コマンドラインツールとして動くということで、CI パイプラインに組み込みやすいため、Git でのコミット毎、または PR 作成時にビルドパイプラインを実行するようにし、それらで個別のツールを使用し、マニフェストの検証を行うといった使い方ができます。
というか、これらのツールのユースケースはそういった場面が主に想定されています。
一方で、ビルドパイプラインを実行する前に開発を進める段階でマニフェストを検証するのにはマニフェストを簡単に検証できるため ValidKube を使用することになるのかなと思います。

また、ValidKube は Github でオープンソースとして公開されており、アプリケーションをビルドして自前の環境に展開する方法が Github リポジトリ上で紹介されています。
このアプリケーションはサイトで公開されているものなので、他人のサービスに自前のマニフェストを送信したくないという場合もあると思いますが、その場合は時前の環境に ValidKube を展開して身内にのみ公開することでマニフェストを外部に公開せずに ValidKube を利用することもできます。

マニフェストファイルの品質を上げたい場合や、Kubernetes に展開する前にマニフェストの整合性を検証しておきたい場合には検討できるツールかと思います。

おわりに

今回は kubernetes のマニフェストの検証ツールである validkube を触ってみました。
マニフェストファイルの中身が妥当か判断するのは人の目だけだと難しい部分もあり、そのような部分をカバーするのに自動化されたツールはとても有用だと思います。
作成したマニフェストの検証方法に悩んでいる方の参考になれば幸いです。

参考