運用で手作業していた三つをボタンにする
目標
argocd-cmのresource.customizations.actions.<그룹>_<종류>にdiscovery.luaとアクションの定義を書いて、リソースアクションを作り、状況に応じてボタンをグレーアウトさせ、アクションが作った変更をkwokクラスターに実際に上げます(プレースホルダーは、順にグループと種類です)。
なぜ重要なのか
GitOpsを正しく行えば、本番で手で行う作業はなくなるはずですが、いくつかは最後まで残ります。少し止める、立ち上げ直す、1つ増やす。これを人がkubectlで行うと、リポジトリとクラスターが分かれ、まったくできないように塞ぐと、もっと危険な迂回路が生まれます。リソースアクションは、そのいくつかだけを画面のボタンにして、権限と監査記録の下に引き込む仕組みです。ここで設計の核心は2つです。1つ目は、アクションはリポジトリを変えないことです。そのため、自動同期が有効なら、次の調整のときに元に戻ります。2つ目は、何をボタンとして出すかがdiscovery.lua1か所に集まることです。状態を見て有効・無効にする判断を、画面ではなくこのコードが行うので、すでに止まっているものをまた止めるという事故を、設計で防げます。
ステップ
/root/ga-actions/deploy.yamlにga-actionsネームスペースのDeploymentwebを作ってください。spec.replicasは2、コンテナは1つ(web、イメージnginx:1.25)、セレクターとラベルはapp: webです。/root/ga-actions/argocd-cm.yamlは、data: {}の空のConfigMapです。argocd admin settings resource-overrides list-actions /root/ga-actions/deploy.yaml --argocd-cm-path /root/ga-actions/argocd-cm.yamlの出力を、/root/ga-actions/none.txtに保存してください。/root/ga-actions/w-running.yamlにexample.com/v1のWidgetを作ってください。名前はw-running、ネームスペースはga-actions、spec.sizeは3、status.phaseはRunningです。/root/ga-actions/argocd-cm-pause.yamlにキーresource.customizations.actions.example.com_Widgetを置いて、discovery.luaがpauseを1つ出すようにし、definitionsにそのアクションのaction.lua(spec.pausedを真に)を書いてください。list-actionsの出力を、/root/ga-actions/list-pause.txtに保存してください。argocd admin settings resource-overrides run-action /root/ga-actions/w-running.yaml pause --argocd-cm-path /root/ga-actions/argocd-cm-pause.yamlの出力を、/root/ga-actions/run-pause.txtに保存してください。出力に、paused: trueが加わったことが見える必要があります。/root/ga-actions/w-paused.yamlを作ってください。名前はw-paused、spec.sizeは3、spec.pausedは真、status.phaseはPausedです。/root/ga-actions/argocd-cm-toggle.yamlには、pauseとresumeの2つのアクションを置き、discovery.luaが、spec.pausedの値に応じて、2つのうち1つだけが使えるようにdisabledを付けるようにしてください。2つのサンプルに対するlist-actionsの出力を、それぞれ/root/ga-actions/list-running.txtと/root/ga-actions/list-paused.txtに保存してください。/root/ga-actions/argocd-cm-scale.yamlに、ステップ4の2つのアクションに加えてscale-upを置いてください。spec.sizeを1増やします。止まっているWidgetでは、このアクションもグレーアウトされる必要があります。w-running.yamlに対してscale-upを実行した出力を、/root/ga-actions/run-scale.txtに保存してください。3が4に変わることが見える必要があります。/root/ga-actions/argocd-cm-full.yamlに、ステップ5のWidgetのアクションをそのまま置き、キーresource.customizations.actions.apps_Deploymentをもう1つ作ってください。アクション名はpin-imageで、最初のコンテナのイメージをnginx:1.27-hardenedに変えます。deploy.yamlに対してこのアクションを実行した出力を、/root/ga-actions/run-pin.txtに保存してください。- kwokクラスターにネームスペース
ga-actionsを作って、deploy.yamlを適用してください。そのあと、ステップ6のアクションが教えてくれた変更を反映したマニフェスト/root/ga-actions/deploy-pinned.yamlを作って適用してください。クラスターのwebコンテナのイメージが、アクションが決めた値になっている必要があります。 /root/ga-actions/actions-matrix.tsvに、<샘플파일이름>\t<동작이름>\t<바뀐 필드에서 찾을 글자>を4行以上書いてください。アクション名が3種類以上出る必要があります。/root/ga-actions/check-actions.shは、この表を読んで/root/ga-actions/argocd-cm-full.yamlで各アクションを実行し、出力にその文字があればOK …、なければMISMATCH …を標準出力にだけ出力して、1行でも違えば0以外のコードで終了する必要があります。その出力を/root/ga-actions/actions-result.txtに保存してください(プレースホルダーは、順にサンプルファイル名、アクション名、変わったフィールドで探す文字です)。
参考
- キー名は
resource.customizations.actions.<그룹>_<종류>で、区切り文字はアンダースコアです(プレースホルダーは、順にグループと種類です)。 - 値の中に、
discovery.luaとdefinitionsの2つの項目が入ります。 - discovery.luaは、アクション名をキーにしたテーブルをreturnし、値に
{["disabled"] = true}を入れるとグレーアウトされます。 - Luaの配列の添字は、1から始まります。最初のコンテナは
containers[1]です。 - よくあるミスは、
list-actionsに組み込みのアクションが出てくると期待することです。このコマンドは、ConfigMapだけを読みます。 - 参考: https://argo-cd.readthedocs.io/en/stable/operator-manual/resource_actions/
このコマンドはConfigMapだけを見る
/root/ga-actions/deploy.yamlにga-actionsネームスペースのDeploymentwebを作ってください。spec.replicasは2、コンテナは1つ(web、イメージnginx:1.25)、セレクターとラベルはapp: webです。/root/ga-actions/argocd-cm.yamlは、data: {}の空のConfigMapです。argocd admin settings resource-overrides list-actions /root/ga-actions/deploy.yaml --argocd-cm-path /root/ga-actions/argocd-cm.yamlの出力を、/root/ga-actions/none.txtに保存してください。
Argo CDの画面では、Deploymentにrestartのようなボタンが見えます。ところが、このコマンドの出力は違います。このコマンドが何を読むかを考えてみれば、なぜそうなのかがわかります。あとのステップが、この2つのファイルをずっと材料に使います。
どのボタンを見せるかを決めるコード
/root/ga-actions/w-running.yamlにexample.com/v1のWidgetを作ってください。名前はw-running、ネームスペースはga-actions、spec.sizeは3、status.phaseはRunningです。/root/ga-actions/argocd-cm-pause.yamlにキーresource.customizations.actions.example.com_Widgetを置いて、discovery.luaがpauseを1つ出すようにし、definitionsにそのアクションのaction.lua(spec.pausedを真に)を書いてください。list-actionsの出力を、/root/ga-actions/list-pause.txtに保存してください。
1つのキーの値の中に、discovery.luaとdefinitionsの2つの項目が入ります。discoveryは、名前をキーにしたテーブルをreturnし、definitionsは、名前とaction.luaを持つリストです。specがないリソースも入ってくることがあるので、action.luaで確認してください。
アクションを実行すると、変わったフィールドが出る
argocd admin settings resource-overrides run-action /root/ga-actions/w-running.yaml pause --argocd-cm-path /root/ga-actions/argocd-cm-pause.yamlの出力を、/root/ga-actions/run-pause.txtに保存してください。出力に、paused: trueが加わったことが見える必要があります。
このコマンドは、変更されたリソースをまるごと返さず、何が変わったかだけを見せます。そのため、アクションが意図したもの以外に何を余計に触ったかが、一目で確認できます。アクションを書くときに最も注意すべき部分が、まさにそれです。
状況に応じてボタンをグレーアウトさせる
/root/ga-actions/w-paused.yamlを作ってください。名前はw-paused、spec.sizeは3、spec.pausedは真、status.phaseはPausedです。/root/ga-actions/argocd-cm-toggle.yamlには、pauseとresumeの2つのアクションを置き、discovery.luaが、spec.pausedの値に応じて、2つのうち1つだけが使えるようにdisabledを付けるようにしてください。2つのサンプルに対するlist-actionsの出力を、それぞれ/root/ga-actions/list-running.txtと/root/ga-actions/list-paused.txtに保存してください。
discovery.luaが返すテーブルの値に{["disabled"] = true}を入れると、そのアクションがグレーアウトされます。すでに止まっているものをまた止めるボタンは事故を呼ぶので、状態を見て有効・無効にすることを、画面ではなくこのコードが行います。
値を読んで計算するアクション
/root/ga-actions/argocd-cm-scale.yamlに、ステップ4の2つのアクションに加えてscale-upを置いてください。spec.sizeを1増やします。止まっているWidgetでは、このアクションもグレーアウトされる必要があります。w-running.yamlに対してscale-upを実行した出力を、/root/ga-actions/run-scale.txtに保存してください。3が4に変わることが見える必要があります。
action.luaは、リソースを読んで計算できます。ここで注意すべきなのは、値がないときです。nilに1を足すと、スクリプトが落ちます。このラボのサンプルにはsizeが常にありますが、実際に使うルールなら、確認を入れる必要があります。
組み込みの種類にも自分のアクションを付ける
/root/ga-actions/argocd-cm-full.yamlに、ステップ5のWidgetのアクションをそのまま置き、キーresource.customizations.actions.apps_Deploymentをもう1つ作ってください。アクション名はpin-imageで、最初のコンテナのイメージをnginx:1.27-hardenedに変えます。deploy.yamlに対してこのアクションを実行した出力を、/root/ga-actions/run-pin.txtに保存してください。
Luaの配列の添字は、0ではなく1から始まります。containers[1]が最初のコンテナです。組み込みの種類にユーザーのアクションを付けると、画面にボタンが1つ増え、組み込みのアクションはそのまま残ります。
アクションが作った結果を実際のクラスターに上げる
kwokクラスターにネームスペースga-actionsを作って、deploy.yamlを適用してください。そのあと、ステップ6のアクションが教えてくれた変更を反映したマニフェスト/root/ga-actions/deploy-pinned.yamlを作って適用してください。クラスターのwebコンテナのイメージが、アクションが決めた値になっている必要があります。
run-actionは、変更されたリソースを保存してはくれず、何が変わるかだけを知らせます。本物のArgo CDでは、その結果をコントローラーが適用しますが、ここでは人が同じ変更をマニフェストに反映して上げます。ネームスペースがないと、適用が失敗します。
アクションがすることを表にまとめて回帰チェックする
/root/ga-actions/actions-matrix.tsvに、<샘플파일이름>\t<동작이름>\t<바뀐 필드에서 찾을 글자>を4行以上書いてください。アクション名が3種類以上出る必要があります。/root/ga-actions/check-actions.shは、この表を読んで/root/ga-actions/argocd-cm-full.yamlで各アクションを実行し、出力にその文字があればOK …、なければMISMATCH …を標準出力にだけ出力して、1行でも違えば0以外のコードで終了する必要があります。その出力を/root/ga-actions/actions-result.txtに保存してください(プレースホルダーは、順にサンプルファイル名、アクション名、変わったフィールドで探す文字です)。
アクションは、一度書くと忘れられるコードなので、リソースのスキーマが変わった日に、静かに見当違いのフィールドを触り始めます。表があれば、その日にすぐ赤信号が点きます。スクリプトがファイルを直接書くと、採点ツールが再実行するときに、学習者の成果物を上書きするので、標準出力にだけ出してください。