kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Pluto : Kubernetes apiVersion の「非推奨と削除」を検出する

Pluto を使うと Kubernetes マニフェストの apiVersion に対して deprecated(非推奨)removed(削除)を検出できる.警告自体は Deprecated API Migration Guide | Kubernetes を見れば確認できるし,kubectl apply コマンドを実行したときにも表示されるけど,Pluto は実行前に確認できて便利!パイプラインに組み込むのも良し!

github.com

セットアップ

Pluto CLI は macOS なら Homebrew を使えば簡単にセットアップできる.今回は現時点で最新となる Pluto v5.10.2 を前提とする.

$ brew install FairwindsOps/tap/pluto

$ pluto version
Version:5.10.2 Commit:0070fa703641a58ec339a9675aa214ba080ad5d3

$ pluto help
A tool to detect Kubernetes apiVersions

Usage:
  pluto [flags]
  pluto [command]

Available Commands:
  completion    Generate the autocompletion script for the specified shell
  detect        Checks a single file or stdin for deprecated apiVersions.
  detect-files  detect-files
  detect-helm   detect-helm
  help          Help about any command
  list-versions Outputs a JSON object of the versions that Pluto knows about.
  version       Prints the current version of the tool.

Flags:
  -f, --additional-versions string       Additional deprecated versions file to add to the list. Cannot contain any existing versions
      --columns strings                  A list of columns to print. Mandatory when using --output custom, optional with --output markdown
      --components strings               A list of components to run checks for. If nil, will check for all found in versions.
  -h, --help                             help for pluto
      --ignore-deprecations              Ignore the default behavior to exit 2 if deprecated apiVersions are found.
      --ignore-removals                  Ignore the default behavior to exit 3 if removed apiVersions are found.
  -r, --only-show-removed                Only display the apiVersions that have been removed in the target version.
  -o, --output string                    The output format to use. (normal|wide|custom|json|yaml|markdown|csv) (default "normal")
  -t, --target-versions stringToString   A map of targetVersions to use. This flag supersedes all defaults in version files. (default [])
  -v, --v Level                          number for the log level verbosity

Use "pluto [command] --help" for more information about a command.

pluto.docs.fairwinds.com

Pluto を実行する

さっそく Pluto CLI を試す.個人的によく使っている Kubernetes マニフェストの一部を抜粋して pluto detect-files コマンドを実行してみた.すると CronJobPodDisruptionBudgetdeprecated(非推奨)が検出された.なお,Pluto はデフォルトで「Kubernetes v1.22」を検出対象にしている.

$ pluto detect-files -d .
NAME         KIND                  VERSION          REPLACEMENT   REMOVED   DEPRECATED
my-cronjob   CronJob               batch/v1beta1    batch/v1      false     true
my-pdb       PodDisruptionBudget   policy/v1beta1   policy/v1     false     true

kubectl コマンドのように -o オプションも使える.-o wide オプションだと該当するバージョンも表示できて便利!他にも -o json-o yaml も使える.

$ pluto detect-files -d . -o wide
NAME         NAMESPACE   KIND                  VERSION          REPLACEMENT   DEPRECATED   DEPRECATED IN   REMOVED   REMOVED IN
my-cronjob   <UNKNOWN>   CronJob               batch/v1beta1    batch/v1      true         v1.21.0         false     v1.25.0
my-pdb       <UNKNOWN>   PodDisruptionBudget   policy/v1beta1   policy/v1     true         v1.21.0         false     v1.25.0

さらに --target-versions オプションを使うと検出対象にする Kubernetes バージョンを変更できる.--target-versions k8s=v1.23.0 オプションを使うと HorizontalPodAutoscaler でも deprecated(非推奨)が検出された.明示的に指定しておくのが良さそう.

$ pluto detect-files -d . -o wide --target-versions k8s=v1.23.0
NAME         NAMESPACE   KIND                      VERSION               REPLACEMENT      DEPRECATED   DEPRECATED IN   REMOVED   REMOVED IN
my-cronjob   <UNKNOWN>   CronJob                   batch/v1beta1         batch/v1         true         v1.21.0         false     v1.25.0
my-hpa       <UNKNOWN>   HorizontalPodAutoscaler   autoscaling/v2beta2   autoscaling/v2   true         v1.23.0         false     v1.26.0
my-pdb       <UNKNOWN>   PodDisruptionBudget       policy/v1beta1        policy/v1        true         v1.21.0         false     v1.25.0

Pluto を GitHub Actions に組み込む

次は Pluto を GitHub Actions に組み込む.ドキュメントに載っている YAML を使えば簡単に実行できる!

pluto.docs.fairwinds.com

name: CI

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  pluto:
    name: pluto
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Download Pluto
        uses: FairwindsOps/pluto/github-action@master
      - name: Run Pluto
        run: pluto detect-files -d . -o wide --target-versions k8s=v1.23.0

しかし Pluto は実行時に以下のリターンコードを返す.よって,deprecated(非推奨)removed(削除)が検出されると落ちてしまう.もし「検出はするけど CI は継続する」場合は --ignore-deprecations オプションと --ignore-removals オプションを併用する.そうすれば「リターンコード 0」を返せるようになる.

  • リターンコード 1 : エラー
  • リターンコード 2 : deprecated(非推奨)あり
  • リターンコード 3 : removed(削除)あり
name: CI

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  pluto:
    name: pluto
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Download Pluto
        uses: FairwindsOps/pluto/github-action@master
      - name: Run Pluto
        run: pluto detect-files -d . -o wide --target-versions k8s=v1.23.0 --ignore-deprecations --ignore-removals

まとめ

Kubernetes マニフェストの apiVersion に対して deprecated(非推奨)removed(削除)を検出できる Pluto を試した.日常的に使っているマニフェストリポジトリの GitHub Actions に Pluto を設定したので,継続的に使ってみようと思う.