Kubernetesクラスタをバージョンアップする際にマニフェストをdeprecation-guideを参照しており、適宜grepしながら確認していく作業を自動化したかったので、plutoで解決できないか試した。
以下はその備忘録。
plutoとは
このツールが生まれた背景はREADMEにも記載されているが、
- 新たにリリースされたKubernetesの非推奨/廃止APIの使用箇所を検出することは困難。
- api問い合わせ時にetcdに意図しない形で保持されてしまう危険性がある。(ちゃんと追えてないので間違ってたらごめんなさい)
今回やらないこと
ArgoCD + Helm Chartで管理しているため、detect-helm
によるチェックは行わない。
検証
公式のInstallationに従いインストール。
$ brew install FairwindsOps/tap/pluto
$ pluto version
Version:5.1.1 Commit:188501530c46948d0062d7a3a78c730edcb79cab
以下はdetect-files
の実行例。
再帰的にディレクトリ内のマニフェストをチェックしてくれる。
pluto detect-files
NAME KIND VERSION REPLACEMENT REMOVED DEPRECATED
xxxxxxxxxxxxx Ingress extensions/v1beta1 networking.k8s.io/v1 true true
xxxxxxxxxxxxx Ingress extensions/v1beta1 networking.k8s.io/v1 true true
``
自動化について
pluto | Github Action Usageを参考にして、
今回はCI時に変更を検知した場合にpr-commentで通知するようなケースを導入した。
以下は最小限のCI。
check-kubernetes-manifest:
runs-on: ubuntu-latest
name: check k8s manifest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Download Pluto
uses: FairwindsOps/pluto/github-action@master
- name: Use pluto
id: pluto
run: |
pluto detect-files
次に自分が良いと思ったケースを参考程度に。
pluto detect-files
実行時に検知した場合は、CI時にPRに対してコメントを行い、変更を促すようにした。
PRへのコメントはmshick/add-pr-commentを利用させていただいた。
# 略
- name: Use pluto
id: pluto
run: |
# 複数行にわたる出力の変数化はこのように書く
echo 'content<<EOF' >> $GITHUB_ENV
pluto detect-files -d kubernetes -o json | jq >> $GITHUB_ENV
echo 'EOF' >> $GITHUB_ENV
# exit statusを元に後続のstepを実行
pluto detect-files -d kubernetes
- uses: mshick/add-pr-comment@v1
if: failure()
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
message: |
## Pluto detect deprecation/removal
Fix from the documents below.
[Kubernetes | Deprecated API Migration Guide](https://kubernetes.io/docs/reference/using-api/deprecation-guide/)
```json
${{ env.content }}
```
repo-token: ${{ secrets.GITHUB_TOKEN }}
repo-token-user-login: 'github-actions[bot]'
allow-repeats: false
おわりに
Plutoいいよーって話と、それだけだとありふれているので、検知した場合の利用ケースについても紹介しました。
ArgoCD + Helm Chartの場合にうまく検知できる方法はないかと模索中だったが、やらないことに決めてます。
理由はRenovateでHelm Chartのバージョン更新を検知して、常に最新になるような運用にこれからしてく予定だからです。。。
その辺はまた今度まとめようと思います。