Ambassador で Mapping の apply 時にエラーが起きる時は
2024-05-21
azblob://2024/05/21/eyecatch/2024-05-21-ambassador-emissary-tls-error-troubleshoot-000.jpg

シンプルな答え

apply 時に出力されるエラーが以下のようなパターンであれば内部の証明書の期限が切れているので、いくつかコマンドを実行して証明書を更新してください。
Error from server: error when creating "<リソース名orマニフェスト名>": conversion webhook for getambassador.io/v3alpha1, Kind=Mapping failed: Post "https://emissary-apiext.emissary-system.svc:443/webhooks/crd-convert?timeout=30s": tls: failed to verify certificate: x509: certificate has expired or is not yet valid: current time yyyy-mm-ddThh:mm:ssZ is after yyyy-mm-ddThh:mm:ssZ
証明書更新には以下のコマンドを順に実行します。
大抵の場合コマンドは決め打ちで大丈夫ですが、環境に応じて namespace 等変更してください。
# 既存の有効期限が切れた証明書を削除します
kubectl delete secret emissary-ingress-webhook-ca -n emissary-system

# emissary-apiextを再起動します。再起動のタイミングで証明書が自動生成されます。
kubectl rollout restart deploy/emissary-apiext -n emissary-system

原因

Ambassador(現Emissary)のCRDのリクエストを処理するWebhook APIがKubernetes内に作られるのですが、このエンドポイントはサーバー証明書を自動的に作成して使用します。
ただ、Ambassadorの古いバージョンでは証明書の更新を自動で更新を行わないため起動して1年が経つと証明書の有効期限が切れてしまい、上記のエラーが発生します。
この問題は過去全てのバージョンで発生しますが、現在修正PRがマージされているのでおそらく次のバージョン辺りで修正されるかと思われます。

解決策

有効期限が切れた証明書を削除してWebhook APIのDeploymentをrestartします。Podの起動時に証明書が自動生成されます。
# 既存の有効期限が切れた証明書を削除します
kubectl delete secret emissary-ingress-webhook-ca -n emissary-system

# emissary-apiextを再起動します。再起動のタイミングで証明書が自動生成されます。
kubectl rollout restart deploy/emissary-apiext -n emissary-system

おわりに

今回は最近遭遇したエラー対応時に得た知見を共有しました。
一致期間ごとにこのコマンドを実行するCronJobを実行する解決する方法もありますが、根本解決には次のバージョンのEmissaryが公開されたタイミングでアップグレードするべきかと考えています。
同様の問題に直面した方の助けになると幸いです。