Kubernetesの非推奨(deprecated api)を自動検出する
あけましておめでとうございます。
普段、インフラエンジニアをしていてKubernetesやCI/CD周りを主に触っています。
私の環境では、Kubernetesの環境はPRD/STG/DEVで3環境あり、Clusterのバージョンが異なっていることが多々あります。
また、最近はアプリケーションをHelm
からArgo CD
に移管したため
deprecated apiの検出がChange logを見る以外では、なかなか把握しきれていなかったり、気づきにくい状態となっています。
以前は、helm install/upgrade
の際、deprecated apiがterminalに表示されていたため、気づけていましたが、Argo CDによるGitOpsに移行したため
気づくタイミングがとても少なくなってしまいました。
そのため、CIに組み込み、自動で検知することにしました。
実装する前に調査した際、あまりこういった記事がなかったため
少しでも、Kubernetes deprecated apiを自動で検知する方法を探している方の参考になれば、幸いです。
何をどうするか?
とっても簡単です。
PlutoというOSSを使い、CIで1つのjobを作成するのみ。
今回は、静的なHelm chart内で特定のKubernetes versionのdeprecated apiが使われていないか検出します。
Plutoとは?
Infrastructure-as-Code repos: Pluto can check both static manifests and Helm charts for deprecated apiVersions
Live Helm releases: Pluto can check both Helm 2 and Helm 3 releases running in your cluster for deprecated apiVersions
静的manifestやHelm chart、Cluster内で動作しているHelm application内のdeprecated apiを検知することができるOSSです。
実際にPlutoをローカルで試します
Plutoのインストール方法
こちらを参考に実施します。
Quickstart
公式のQuickStartを参考に適当なmanifestを用意し、検証してみる
- helm chartを用意
$ helm create pluto-sample
$ cd pluto-sample
$ vi values.yaml
# ingress.enabledを `false` -> `true`に変更
- deprecated apiを使っていないhelm chartを検証
# template/ingress.yamlを変更
$ vi template/ingress.yaml
--- 9 ~ 15行目
{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1
{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1beta1
{{- else -}}
apiVersion: extensions/v1beta1
{{- end }}
---
を
---
apiVersion: networking.k8s.io/v1
---
に変更
# Cluster version 1.22.0を想定し、pluto コマンドでHelm chartを検証
$ helm template . | pluto detect --target-versions version=v1.22.0 -
There were no resources found with known deprecated apiVersions.
上記の結果から、対象のhelm chartでdeprecated apiを使っていないことがわかります。
- deprecated apiを使っているhelm chartを検証
# template/ingress.yamlを変更
$ vi template/ingress.yaml
---
apiVersion: networking.k8s.io/v1
---
を
---
apiVersion: networking.k8s.io/v1beta1
---
に変更
$ helm template . | pluto detect --target-versions version=v1.22.0 -
NAME KIND VERSION REPLACEMENT REMOVED DEPRECATED
RELEASE-NAME-pluto-sample Ingress networking.k8s.io/v1beta1 networking.k8s.io/v1 true true
上記の結果から、対象のhelm chartでdeprecated apiが使われていることがわかります。
実装方法
Gitlab CIの場合
QuickStartで実行したコマンドをCIで実行するだけです。とても簡単です。
Github Actionの場合
専用のActionsが用意されているのでこちらもとても簡単ですね。
こちらに用意されています。
番外編
outputを変更する方法
- markdown形式でoutputする
$ helm template . | pluto detect --target-versions version=v1.22.0 --output markdown -
| NAME | NAMESPACE | KIND | VERSION | REPLACEMENT | DEPRECATED | DEPRECATED IN | REMOVED | REMOVED IN |
|---------------------------|-----------|---------|---------------------------|----------------------|------------|---------------|---------|------------|
| RELEASE-NAME-pluto-sample | <UNKNOWN> | Ingress | networking.k8s.io/v1beta1 | networking.k8s.io/v1 | true | v1.19.0 | true | v1.22.0 |
manifestやdeployされているhelmに対して実行する方法を紹介する
Quickstartにも書かれていますが、実行するフラグによって何を検証するか変えられます
-
manifestを検証する場合
pluto detect-files
-
Clusterにデプロイされているhelmを検証する場合
pluto detect-helm
-
静的helm chartを検証する場合
pluto detect
Discussion