pluto@バージョンテスト¶
はじめに¶
本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。
01. plutoの仕組み¶
検出項目¶
指定したKubernetesのバージョンに基づいて、Kubernetesリソースやカスタムリソースのマニフェストの非推奨なバージョン (apiVersion) を検証する。
pluto以外では、ドキュメント、リリースノート、メトリクス (apiserver_requested_deprecated_apis
) 、監査ログ、で非推奨なAPIを確認できる。
- https://kubernetes.io/docs/reference/using-api/deprecation-guide/
- https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.28.md#no-really-you-must-read-this-before-you-upgrade
- https://kubernetes.io/blog/2020/09/03/warnings/#metrics
- https://kubernetes.io/blog/2020/09/03/warnings/#audit-annotations
対応する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
...