コンテンツにスキップ

pluto@バージョンテスト

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. plutoの仕組み

検出項目

指定したKubernetesのバージョンに基づいて、Kubernetesリソースやカスタムリソースのマニフェストの非推奨なバージョン (apiVersion) を検証する。

pluto以外では、ドキュメント、リリースノート、メトリクス (apiserver_requested_deprecated_apis) 、監査ログ、で非推奨なAPIを確認できる。


対応するKubernetesリソース

標準のKubernetesリソースだけでなく、CRDや一部のカスタムリソース (Istioも含む) もサポートしている。

ただ、全てのカスタムリソースをサポートしているわけではない。

deprecated-versions:

  # Deployment
  - version: extensions/v1beta1
    kind: Deployment
    deprecated-in: v1.9.0
    removed-in: v1.16.0
    replacement-api: apps/v1
    replacement-available-in: v1.9.0
    component: k8s

  ...

  # CRD
  - version: apiextensions.k8s.io/v1beta1
    kind: CustomResourceDefinition
    deprecated-in: v1.16.0
    removed-in: v1.22.0
    replacement-api: apiextensions.k8s.io/v1
    replacement-available-in: v1.16.0
    component: k8s

  ...

  # Istioリソース
  - version: rbac.istio.io
    kind: AuthorizationPolicies
    deprecated-in: v1.4.0
    removed-in: v1.4.0
    replacement-api: security.istio.io/v1beta1
    component: istio

  ...

もしplutoが対応していない項目に関しては、以下のコマンドで確認すると良い。

$ kubectl get crd \
    -o jsonpath='{range .items[*]}{.spec.group}{"\t"}{range .spec.versions[*]}{.name}{","}{end}{"\t"}{.metadata.name}{"\n"}{end}' \
    | grep <リソースの種類 (例:istio) >


02. セットアップ

インストール

▼ バイナリとして

$ brew install pluto


03. グローバルオプション

標準入力

標準入力からマニフェストを渡す。

$ helm template . -f foo-values.yaml \
    | pluto detect -o wide -t k8s=<Kubernetesのバージョン> -

NAME     NAMESPACE       KIND                      VERSION               REPLACEMENT      DEPRECATED   DEPRECATED IN   REMOVED   REMOVED IN
foo-cj   foo-namespace   CronJob                   batch/v1beta1         batch/v1         true         v1.21.0         false     v1.25.0
$ helm template . -f foo-values.yaml \
    | pluto detect-helm -o wide -t k8s=<Kubernetesのバージョン> -

NAME    NAMESPACE       KIND                      VERSION               REPLACEMENT      DEPRECATED   DEPRECATED IN   REMOVED   REMOVED IN
foo-cj  foo-namespace   CronJob                   batch/v1beta1         batch/v1         true         v1.21.0         false     v1.25.0

CI上でこれを実行する場合、リポジトリ内のマニフェストを渡しさえすれば良く、特にGitOpsでCI/CDを分離している場合は、必ずしもkube-apiserverと通信する必要はない。

$ helm template . -f foo-values.yaml -f foo-secrets.yaml \
    | pluto detect -o wide -t k8s=<Kubernetesのバージョン> -

NAME    NAMESPACE       KIND                      VERSION               REPLACEMENT      DEPRECATED   DEPRECATED IN   REMOVED   REMOVED IN
foo-cj  foo-namespace   CronJob                   batch/v1beta1         batch/v1         true         v1.21.0         false     v1.25.0


-f (--additional-versions)

▼ -fとは

plutoが検証可能なAPIグループを追加する。

plutoはデフォルトで全てのKubernetesリソースを検証できるが、一方でカスタムリソースは一部にしか検証していない。

$ pluto list-versions -f additional-versions.yaml

additional-versions.yamlファイル

追加で検証するAPIグループのルールを設定する。

# version: APIグループのバージョン
# kind: カスタムリソース名
# deprecated-in: APIグループの特定のバージョンが非推奨になる場合に、警告が出るようになるKubernetesバージョン
# removed-in: APIグループの特定のバージョンが機能廃止になる場合に、使用できなくなるKubernetesバージョン
# replacement-api: APIグループの特定のバージョンが機能廃止になる場合に、変更後のAPIグループのバージョン
# replacement-available-in: APIグループのバージョンが新規追加される場合に、使用できるようになるKubernetesバージョン
# component: APIグループを使用しているツール名

deprecated-versions:
  - version: networking.istio.io/v1beta1
    kind: DestinationRule
    deprecated-in: ""
    removed-in: ""
    replacement-api: ""
    replacement-available-in: ""
    component: istio
  - version: networking.istio.io/v1alpha3
    kind: Gateway
    deprecated-in: ""
    removed-in: ""
    replacement-api: ""
    replacement-available-in: ""
    component: istio
  - version: networking.istio.io/v1beta1
    kind: VirtualService
    deprecated-in: ""
    removed-in: ""
    replacement-api: ""
    replacement-available-in: ""
    component: istio

このファイルを-fオプションで渡すと、追加したAPIグループのルールを検証できるようになる。

$ pluto list-versions -f additional-versions.yaml

...

DestinationRule                  networking.istio.io/v1beta1            n/a             n/a          n/a                                    n/a             istio
Gateway                          networking.istio.io/v1alpha3           n/a             n/a          n/a                                    n/a             istio
VirtualService                   networking.istio.io/v1beta1            n/a             n/a          n/a                                    n/a             istio

Istioの主要カスタムリソースでv1がリリース (2024/05/14) されたので、v1beta1が非推奨になる日も近い...。


-t

▼ -tとは

plutoで検証するターゲットコンポーネントのバージョン (versions.yamlファイルのtarget-versionsキー) を指定する。

マイナーバージョン (例:1.24.0) まで指定する必要がある。

$ pluto detect - -o wide -t k8s=<Kubernetesのバージョン>
$ pluto detect - -o wide -t istio=<Istioのバージョン>

現在と次のバージョンを指定した処理を自動化で実行すれば、アップグレードに備えられる。

継続的に検出できるように、CI上で自動化すると良い。

$ pluto detect - -o wide -t k8s=<Kubernetesの現在のバージョン>

$ pluto detect - -o wide -t k8s=<Kubernetesの次のバージョン>
$ pluto detect - -o wide -t istio=<Istioの現在のバージョン>

$ pluto detect - -o wide -t istio=<Istioの次のバージョン>


-o

出力形式を指定する。

$ pluto detect - -o wide

マークダウン形式が一番見やすい。

$ pluto detect - -o markdown


03. サブコマンド

detect

kube-apiserverからの返信、または標準入力で入力されたマニフェストから、リソース名単位で非推奨なAPIを検出する。

pluto detect-api-resourcesコマンドとの違いは記入中...

$ pluto detect - -o wide

NAME     NAMESPACE       KIND                      VERSION               REPLACEMENT      DEPRECATED   DEPRECATED IN   REMOVED   REMOVED IN
foo-cj   foo-namespace   CronJob                   batch/v1beta1         batch/v1         true         v1.21.0         false     v1.25.0
bar-pdb  bar-namespace   PodDisruptionBudget       policy/v1beta1        policy/v1        true         v1.21.0         false     v1.25.0
baz-hpa  baz-namespace   HorizontalPodAutoscaler   autoscaling/v2beta1   autoscaling/v2   true         v1.22.0         false     v1.25.0
...


detect-api-resources

kube-apiserverからの返信、または標準入力で入力されたマニフェストから、リソース名単位で非推奨なAPIを検出する。

pluto detectコマンドとの違いは記入中...

$ pluto detect-api-resources - -o wide

NAME     NAMESPACE       KIND                      VERSION               REPLACEMENT      DEPRECATED   DEPRECATED IN   REMOVED   REMOVED IN
foo-cj   foo-namespace   CronJob                   batch/v1beta1         batch/v1         true         v1.21.0         false     v1.25.0
bar-pdb  bar-namespace   PodDisruptionBudget       policy/v1beta1        policy/v1        true         v1.21.0         false     v1.25.0
baz-hpa  baz-namespace   HorizontalPodAutoscaler   autoscaling/v2beta1   autoscaling/v2   true         v1.22.0         false     v1.25.0
...


detect-files

ディレクトリ内のファイルを再帰的に検証し、リソース名単位で非推奨なAPIを検出する。

$ pluto detect-files - -o wide


detect-helm

kube-apiserverからの返信、または標準入力で入力されたマニフェストから、チャート単位で非推奨なAPIを検出する。

$ pluto detect-helm - -o wide

NAME       NAMESPACE       KIND                      VERSION               REPLACEMENT      DEPRECATED   DEPRECATED IN   REMOVED   REMOVED IN
foo-chart  foo-namespace   CronJob                   batch/v1beta1         batch/v1         true         v1.21.0         false     v1.25.0
bar-chart  bar-namespace   PodDisruptionBudget       policy/v1beta1        policy/v1        true         v1.21.0         false     v1.25.0
baz-chart  baz-namespace   HorizontalPodAutoscaler   autoscaling/v2beta1   autoscaling/v2   true         v1.22.0         false     v1.25.0
...


list-versions

plutoで検証できるAPIグループの一覧を取得する。

$ pluto list-versions

KIND                             NAME                                   DEPRECATED IN   REMOVED IN   REPLACEMENT                            COMPONENT
Deployment                       extensions/v1beta1                     v1.9.0          v1.16.0      apps/v1                                k8s
Deployment                       apps/v1beta2                           v1.9.0          v1.16.0      apps/v1                                k8s
Deployment                       apps/v1beta1                           v1.9.0          v1.16.0      apps/v1                                k8s
StatefulSet                      apps/v1beta1                           v1.9.0          v1.16.0      apps/v1                                k8s
StatefulSet                      apps/v1beta2                           v1.9.0          v1.16.0      apps/v1                                k8s
NetworkPolicy                    extensions/v1beta1                     v1.9.0          v1.16.0      networking.k8s.io/v1                   k8s
Ingress                          extensions/v1beta1                     v1.14.0         v1.22.0      networking.k8s.io/v1                   k8s
Ingress                          networking.k8s.io/v1beta1              v1.19.0         v1.22.0      networking.k8s.io/v1                   k8s
IngressClass                     networking.k8s.io/v1beta1              v1.19.0         v1.22.0      networking.k8s.io/v1                   k8s
DaemonSet                        apps/v1beta2                           v1.9.0          v1.16.0      apps/v1                                k8s
DaemonSet                        extensions/v1beta1                     v1.9.0          v1.16.0      apps/v1                                k8s
PodSecurityPolicy                extensions/v1beta1                     v1.10.0         v1.16.0      policy/v1beta1                         k8s
PodSecurityPolicy                policy/v1beta1                         v1.21.0         v1.25.0      n/a                                    k8s
...