落とし穴に立て札を立てるが如く

ハマりどころの解決が少しでも早くなることを願って書いていきます

Ambassador で Mapping の apply 時にエラーが起きる時は

こちらの記事はcloud.config tech blogにもマルチポストします。

シンプルな答え

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 APIKubernetes内に作られるのですが、このエンドポイントはサーバー証明書を自動的に作成して使用します。
ただ、Ambassadorの古いバージョンでは証明書の更新を自動で更新を行わないた、め起動して1年が経つと証明書の有効期限が切れてしまい、上記のエラーが発生します。
この問題は過去全てのバージョンで発生しますが、現在修正PRがマージされているのでおそらく次のバージョン辺りで修正されるかと思われます。
https://github.com/emissary-ingress/emissary/pull/5494

解決策

有効期限が切れた証明書を削除して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が公開されたタイミングでアップグレードするべきかと考えています。
同様の問題に直面した方の助けになると幸いです。

参考