解決したかったこと
現在、社で運用している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を操作するようにしました。現在まだ本番での利用を始めたばかりなので、また何か変更があったらブログに書きます。