ArgoCDの状態を一気に変更するArgoSwitchを書いた

解決したかったこと

現在、社で運用しているKubernetesクラスタはいくつかあって、それぞれマニフェストのデプロイにはArgoCDを利用しており、それぞれのクラスタにArgoCDのサーバが起動している。ようはArgoCDサーバが起動しているクラスタにArgoCDサーバが自分でマニフェストをデプロイするような形式です。またArgoCDのアプリケーション設定なども、ArgoCDが自分でマニフェストをアプライします。

またクラスタについてはKubernetesのバージョンアップに際してのダウンタイムを避けるために、マルチクラスタで運用されており、それぞれの2つのクラスタを2個1で運用しています。その場合に問題になるのが、Slackボットや冪等性のないCronJobリソースのように両系で動作すると不都合があるリソースをどうするかということです。

従来は、待機系のクラスタにおいてはオペレーターがArgoCDの自動同期を止めた上で、各リソースを削除するような運用が行われていましたが、いわゆる画面をポチポチ業で、オペミスの可能性や、操作の煩雑さを含んでいました。

作ったもの

上記のようなUIを有しており、それぞれのボタンを押下すると、事前にArgoCDのマニフェストに定義されたアノテーションの内容に基づき、API実行するようなものを作りました。

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: example
  annotations:
    argoswitch.github.io/primary: auto-sync
    argoswitch.github.io/secondry: delete-resource
    argoswitch.github.io/service-out: delete
    argoswitch.github.io/maint: disable

上記の定義だと下記のような動作になります。

プライマリボタンを押下

自動同期が有効になる

セカンダリボタンを謳歌

配下のリソースが削除される

サービスアウトボタンを押下

アプリケーションの定義が削除される

メンテボタンを押下

自動同期が無効になる

またそれぞれのボタンを押下すると、具体的にどのようなことが起きるか表示されます。

我々の運用だと、ArgoCDの同期を停止しないと、ArgoCDでコントロールしている配下のマニフェストが再同期されて、活性化されてしまうのでそれを阻止するために、ArgoCD自体の自動同期を止めた上で、配下のリソースをコントロールするような運用をしています。

今後について

当初、コントローラーにして、設定されたステータスの動作に収束させるような動きも考えたのですが、現状の我々の要件がそこまで必要ではなかったので、あくまで画面を操作した場合のみAPIを利用して、ArgoCDを操作するようにしました。現在まだ本番での利用を始めたばかりなので、また何か変更があったらブログに書きます。