コンテンツにスキップ

pluto@バージョンテスト

はじめに

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


01. plutoの仕組み

検出項目

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

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


対応する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 と通信する必要はない。

ちなみに、ここでは foo-secrets.yaml を渡している。

クラウドの暗号化キーを使用する場合、復号でクラウドとの通信が発生してしまうが、CI 上でクラウドとの通信は不要であるため、暗号化されたまま helm template コマンドに渡している。

$ 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 からの返信、または標準入力で入力されたマニフェストから、リソース名単位で非推奨 apiVersion を検出する。

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 からの返信、または標準入力で入力されたマニフェストから、リソース名単位で非推奨 apiVersion を検出する。

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

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

$ pluto detect-files - -o wide


detect-helm

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

$ 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
...