リソースのバックアップとリストア
cert-manager をアンインストールする必要がある場合、またはインストールを新しいクラスターに転送する場合は、後で再インストールするために cert-manager のすべての構成をバックアップできます。
cert-manager リソース構成のバックアップ
以下のコマンドは、cert-manager
リソースの設定をバックアップします。これは、cert-manager
をアップグレードする前に役立つ場合があります。このバックアップには、X.509証明書を含むSecrets
は含まれていないため、これらのSecret
オブジェクトがまだないクラスターに復元すると、証明書が再発行されることになります。
バックアップ
cert-managerの設定リソースをすべてバックアップするには、以下を実行します。
kubectl get --all-namespaces -oyaml issuer,clusterissuer,cert > backup.yaml
新しいクラスターにデータを転送する場合、設定されたIssuerによって参照される追加のSecret
リソース(例:)もコピーする必要がある場合があります。
CA Issuer
issuer.spec.ca.secretName
によって参照されるルートCAのSecret
Vault Issuer
issuer.spec.vault.auth.tokenSecretRef
によって参照されるトークン認証Secret
issuer.spec.vault.auth.appRole.secretRef
によって参照されるAppRole構成Secret
ACME Issuer
issuer.acme.privateKeySecretRef
によって参照されるACMEアカウントの秘密鍵Secret
issuer.acme.dns01.providers
およびissuer.acme.solvers.dns01
フィールドで構成されたDNSプロバイダーによって参照される任意のSecret
復元
設定を復元するには、cert-managerのインストール後、上記で作成したファイルに対してkubectl apply
を実行できます。uid
フィールドとresourceVersion
フィールドは復元する必要はありません。
kubectl apply -f <(awk '!/^ *(resourceVersion|uid): [^ ]+$/' backup.yaml)
クラスター全体のバックアップと復元
このセクションでは、障害復旧、クラスター移行などのシナリオのために、クラスター内の「すべて」の Kubernetes リソース(一部のcert-manager
リソースを含む)のバックアップと復元について説明します。
注:このプロセスは、限られた Kubernetes リリースのシンプルな Kubernetes テストクラスターでテストされています。データ損失を避けるため、本番環境で使用する前に、ご自身のクラスターでバックアップと復元の両方の戦略をテストしてください。エラーが発生した場合は、GitHub issue または PR を開いて、さまざまな Kubernetes 環境でのこのプロセスのバリエーションを文書化してください。
不要な証明書の再発行を避ける
復元の順序
cert-manager
がCertificate
のX.509証明書を含むKubernetes Secret
を見つけられない場合、再発行がトリガーされます。復元後の不要な再発行を避けるために、Secret
がCertificate
の前に復元されていることを確認してください。同様に、ingress-shim
を使用している場合は、Secret
をIngress
の前に復元する必要があります。
バックアップから一部のcert-managerリソースを除外する
cert-manager
には、特定の時点での操作を表すように設計された多くのカスタムリソースがあります。例としては、X.509証明書に対する1回限りのリクエストを表すCertificateRequest
があります。これらのリソースのステータスは、一時的な秘密鍵を保持するSecret
など、他の一時的なリソースに依存する可能性があるため、cert-manager
は後でこれらのリソースの状態を正しく再作成できない場合があります。
ほとんどの場合、バックアップおよび復元ツールはカスタムリソースのステータスを復元しないため、このような1回限りのリソースをバックアップに含めると、復元後に不要な再発行が発生する可能性があります。ステータスフィールドがないと、cert-manager
は、たとえば、Order
がすでに完了していることを判別できないためです。不要な再発行を避けるために、Order
とChallenge
をバックアップから除外することをお勧めします。また、CertificateRequest
のバックアップも推奨しません。「CertificateRequestsのバックアップ」を参照してください。
Ingress証明書の復元
ingress-shim
経由でIngress
用に作成されたCertificate
には、オーナー参照がIngress
リソースを指しています。cert-manager
はオーナー参照を使用して、Certificate
がそのIngress
に「属して」いることを確認し、既存のCertificate
に対して作成/修正を試行しません。クラスター全体の再作成後、復元されたオーナー参照は(Ingress
のUUIDが変更されているため)おそらく正しくありません。正しくないオーナー参照は、Ingress
(つまり新しいDNS名)に対する更新がCertificate
に適用されない状況につながる可能性があります。
この問題を回避するために、ほとんどの場合、ingress-shim
経由で作成されたCertificate
をバックアップから除外する必要があります。復元が正しい順序で行われる場合(X.509証明書を含むSecret
がIngress
の前に復元される)、cert-manager
はIngress
用の新しいCertificate
を作成し、既存のSecret
がそのCertificate
用のものであると判断できます。
Velero
velero
v1.12.2
およびcert-manager
バージョンv1.13.2
でバックアップと復元をテストしました。
いくつかの潜在的なエッジケース
-
バックアップに
cert-manager
CRDが含まれていることを確認してください。例えば、--exclude-namespaces
フラグがvelero backup create
に渡された場合、バックアップに含める実際のリソースがない CRD は、--include-cluster-resources=true
フラグもバックアップコマンドに渡されない限り、バックアップに含まれない可能性があります。 -
Veleroはカスタムリソースのステータスを復元しないため、バックアップから
Order
、Challenge
、およびCertificateRequest
を除外する必要があります。「バックアップから特定のcert-managerリソースを除外する」を参照してください。 -
Veleroのデフォルトの復元順序(
Secrets
をIngress
の前に、カスタムリソースを最後に復元)により、復元操作の順序による不要な証明書の再発行がないようにする必要があります。「復元順序」を参照してください。 -
cert-manager
自体のデプロイメントを復元する場合、残りのデプロイメントの前にcert-manager
のRBACリソースを復元する必要がある場合があります。これは、cert-manager
のコントローラーが、Webhookが準備完了になる前に、cert-manager
のWebhook用のCertificate
を作成できる必要があるためです。これを行うには、コントローラーに適切な権限が必要です。VeleroはデフォルトでRBACリソースの前にPodを復元するため、復元がWebhook Podが準備完了になるのを待って停止する可能性があります。 -
Veleroは所有者参照を復元しないため、
Ingress
用に作成されたCertificate
を、Ingress
自体を再作成しない場合でも、バックアップから除外する必要がある場合があります。「Ingress証明書の復元」を参照してください。
Veleroを使用したバックアップと復元の例
次のコマンドは、Order
、Challenge
、および CertificateRequest
(上記参照) を除外して、デフォルトおよびcert-manager名前空間内のすべてのKubernetesリソースのバックアップを作成します。
velero backup create \full-backup \--include-namespaces cert-manager,default \--include-cluster-resources=true \--exclude-resources challenges.acme.cert-manager.io,orders.acme.cert-manager.io,certificaterequests.cert-manager.io
Veleroが所有者参照を復元しないことを回避するために、バックアップを2つのステップで復元できます。最初に、Secret
と Ingress
、および cert-manager
デプロイメントを復元し、次に Certificate
リソースを復元します。これにより、cert-manager
のコントローラーがIngress用のCertificate
を作成し、所有者参照を設定できます。次に、2回目の復元で、手動で作成されたCertificate
を復元し、Ingress
用に生成されたCertificate
が既に存在することを検出し、再作成を試みません。
Certificate
リソースを除くすべてを復元します
velero restore create \--from-backup full-backup \--exclude-resources certificates.cert-manager.io
- cert-managerが
Ingress
用のCertificate
を作成するのを待ちます(cert-managerにRBAC/Webhookの問題がある場合は、デプロイメントを手動で再起動する必要がある場合があります)。自動生成されたCertificate
が作成されたら、手動で作成されたCertificate
を復元します
velero restore create \--from-backup full-backup
CertificateRequestのバックアップ
ほとんどのシナリオでは、バックアップに CertificateRequest
リソースを含めることは推奨されなくなりました。CertificateRequest
は、X.509証明書の1回限りの要求を表すように設計されています。リクエストが完了すると、CertificateRequest
は通常、安全に削除できます1。ほとんどの場合(Certificate
用にCertificateRequest
が作成されている場合など)、必要なときに(つまり、Certificate
の更新時)、新しいCertificateRequest
が作成されます。v1.3.0
では、ポリシーの実装に向けた取り組みの一環として、CertificateRequest
リソースのIDフィールドを導入しました。作成時に、cert-mananager
のWebhookは、CertificateRequest
のspecを、CertificateRequest
の作成者のIDを表すイミュータブルなIDフィールドで更新します。これにより、復元者のIDが元の作成者のIDと異なる可能性があるため、CertificateRequest
をバックアップおよび復元する際にいくつかの複雑さが加わり、ほとんどの場合、復元されたCertificateRequest
は不適切な状態になる可能性が高くなります。
脚注
-
Certificate
specに対する特定の変更が、そのCertificate
のCertificateRequest
がない場合、再発行をトリガーしないというエッジケースがあります。「証明書が再発行されるタイミングに関するドキュメント」を参照してください。↩