ArgoCDでSealed SecretsのSyncが完了しない事象の解決手順

4 min read読了の目安(約3700字

はじめに

ArgoCDをGitOpsツールとしてSealed Secretsでkubernatesの秘匿情報を管理したときに、正常にSecretを復号化できているにもかかわらず、Syncが完了しない事象が起きました。

今回の記事では、この事象の原因とその解決手順を記載します。

確認環境

  • Sealed Secret: v0.15.0
  • ArgoCD: v2.0.0+f5119c0

TR;DR

解決方法だけ知りたい方向けは、以下の2つのコマンドが解決手順です。

  1. SEALED_SECRETS_UPDATE_STATUSを設定
kubectl set env deployment.apps/sealed-secrets-controller SEALED_SECRETS_UPDATE_STATUS=1 -n kube-system
  1. CustomResourceDefinitionの設定を修正
kubectl patch CustomResourceDefinition sealedsecrets.bitnami.com --type='json' -p='[{"op":"add", "path":"/spec/versions/0/schema/openAPIV3Schema/properties/status","value":{"x-kubernetes-preserve-unknown-fields":true}}]'

原因

ArgoCDは、sealed secret controllerのStatus fieldと呼ばれる現在の実行ステータスを監視することでSealed SecretsのSync判断を行なっています。

ただ、v0.15.0時点において、デフォルトではsealed secret controllerはStatus fieldを更新しないため、ArgoCDをSyncがいつまで経っても完了しないという状況になっているようでした。

このStatus fieldの更新機能について、現状まだデフォルト機能ではないため、利用したい場合は手動で設定をONにする必要があります。

このように、Status fieldの更新機能を利用できるようにすれば良いことがわかります。

Status fieldの更新機能をONにする

次に、Sealed SecretのStatus fieldの更新機能をONにする手順を記載します。

1. SEALED_SECRETS_UPDATE_STATUSを設定

ドキュメントによると--update-statusを指定するか、環境変数SEALED_SECRETS_UPDATE_STATUSを指定するかの2種類やり方があるそうです。

In order to turn it back on you need to manually pass the --update-status flag to the controller (or pass the SEALED_SECRETS_UPDATE_STATUS=1 env var)

今回は環境変数を指定するやり方を行います。以下のkubectlコマンドを使って、指定を行います。

kubectl set env deployment.apps/sealed-secrets-controller SEALED_SECRETS_UPDATE_STATUS=1 -n kube-system

2. CustomResourceDefinitionの設定を修正

ドキュメントによると上述の環境変数を指定すれば動作するはずなのですが、実際はうまくいきませんでした。調べてみると、以下のIssueににたどり着きました。

https://github.com/bitnami-labs/sealed-secrets/issues/555

記事によると、CustomResourceDefinitionが関わる部分が正常に動作していないため、設定を変更する必要があるとのこと(あんまりよく分かっていません🙇‍♂️

実際の値を確認すると、status: { x-kubernetes-preserve-unknown-fields": true }がないことがわかりました。

  • 現状の設定項目の確認コマンド
kubectl edit CustomResourceDefinition sealedsecrets.bitnami.com 
  • 現状の設定内容
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition

# ~~省略~~
spec:
  # ~~省略~~
  versions:
  - name: v1alpha1
    schema:
      openAPIV3Schema:
        properties:
          spec:
            type: object
            x-kubernetes-preserve-unknown-fields: true
        type: object

以上を踏まえ、CustomResourceDefinitionの追加コマンドは、以下の通りです。

  • 設定追加コマンド
kubectl patch CustomResourceDefinition sealedsecrets.bitnami.com --type='json' -p='[{"op":"add", "path":"/spec/versions/0/schema/openAPIV3Schema/properties/status","value":{"x-kubernetes-preserve-unknown-fields":true}}]'
  • 更新後の設定内容
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition

# ~~省略~~
spec:
  # ~~省略~~
  versions:
  - name: v1alpha1
    schema:
      openAPIV3Schema:
        properties:
          spec:
            type: object
            x-kubernetes-preserve-unknown-fields: true
          status: # <- 追加内容
            x-kubernetes-preserve-unknown-fields: true
        type: object

対応結果

以上の対応の結果により、ArgoCDがSealed SecretのStatus Fieldを検知し、正常にSycnすることを確認できました。

参考文献