ingress-nginx4.12.1にhelmチャート更新して出たエラー備忘録

3月末頃の脆弱性の対応ということでチャートのバージョンアップを行ったが思いのほか難航したのでその備忘録です。
https://www.wiz.io/blog/ingress-nginx-kubernetes-vulnerabilities
チャート直下のvalues.yamlの設定で脆弱性の入り口になるらしいadmissionWebhooksをenabled:falseにしてた（過去のhelmチャートアップデート時に設定が増えたときに使わない余計なリソースを食う可能性がある設定として無効化した）のでネットワーク越しに狙われる危険性は低い状態ではあったが、4.11.5もパッチ済バージョンでエラーでないのでそちらで対応してた。
しかしAKS1.31に対応するingress-nginxチャートバージョンが4.12.1以降でAKS1.30が7月でEOLなので対応を迫られたという経緯。

### ・チャートの管理方法について(前提)
helm pullで指定バージョンをダウンロードしてアプリのチャートのchartsディレクトリに入れてgitで管理、helm upgradeてアプリのチャートと一緒に入れてる（AzureDevOpsでパイプライン組んでプルリクでhelm diffプラグインで差分でてマージでupgradeでAKSにデプロイされる方式）
この記事で言う設定更新上書きはアプリ側のチャート直下のvalues.yamlでchartsのしたの依存チャートのvalues.yamlを上書きを指します。

### ・アノテーションのエラー
ingress-nginx4.12.1helmチャートアップデートしたら、
ingressControllerのログにエラーがでてサイトが見えなくなった。

```
E0328 08:19:59.091704       7 store.go:938] annotation group ServerSnippet contains risky annotation based on ingress configuration
```

原因は、以下issueにかかれているとおりアノテーションのスニペット設定のセキュリティレベルが引き下げられたためとあり、
https://github.com/kubernetes/ingress-nginx/issues/12648
https://github.com/kubernetes/ingress-nginx/issues/12656
以下の設定を行うことでエラーが回避できるところまでは動作確認できました。
```
ingress-nginx:
   controller:
     electionID: ingress-controller-leader
     ingressClassByName: true
     ingressClassResource:
@@ -44,6 +47,7 @@ ingress-nginx:
       #ingressClass: "nginx"
     config:
       server-tokens: "false"
+      annotations-risk-level: "Critical" 
```

### ・正規表現のエラー
unknown directiveというような以下のエラーが出ました。影響としては新規のPodがCrashloopBackoffになりデプロイに失敗してました。サイトは見えるので障害おきないがPodが更新されないという状態でした。
チャートのvalues.yamlではなく、ingressリソース側の設定の問題だとわかるまで設定差分を調べました。

```
-------------------------------------------------------------------------------
  Warning  RELOAD  2m35s  nginx-ingress-controller  Error reloading NGINX: 
-------------------------------------------------------------------------------
Error: exit status 1
2025/04/08 08:59:25 [emerg] 29#29: unknown directive "8})/" in /tmp/nginx/nginx-cfg773932017:7186
nginx: [emerg] unknown directive "8})/" in /tmp/nginx/nginx-cfg773932017:7186
nginx: configuration file /tmp/nginx/nginx-cfg773932017 test failed
```
pathまわりでエラーに合致する箇所が見つかり、正規表現の問題と思われました。
copilotに「ingress-nginxチャート4.12.1　正規表現 エラー」的な内容と現状の設定を食わせてissueが見つかり、正規表現の一部が4.12.1のチャートから使えなくなっているということがわかりました。
https://github.com/kubernetes/ingress-nginx/issues/13101

原因の正規表現の箇所（kind:ingressのとこ）↓
```
- path: /test.([0-9]{8})
```
対処↓ チャートを4.12.1にする際に以下のannotationを追加すると解決
```
nginx.ingress.kubernetes.io/use-regex: "true"
```
https://kubernetes.github.io/ingress-nginx/examples/rewrite/



### ・rewriteのエラー
正規表現きいてるか確認しようとingressコントローラのPodに`kubectl exec`でわたってnginx.confの位置を特定して`kubectl cp`でコピーしてきてgrepでチャートアプデ前後の差分比較したところなんかrewrite設定がだめそう＋ingressコントローラPodのログをよく見たらrewriteの警告でていた。

```
$ kubectl logs test-ingress-nginx-internal-controller-8c4488c87-xxxxx|grep -i rewrite
W0605 04:07:59.624584       6 validators.go:243] validation error on ingress default/ingress-internal: annotation rewrite-target contains invalid value /xxxx/daily/xxx?baseDay=$1
W0605 04:07:59.624901       6 main.go:148] rewrite-targetis invalid, defaulting to empty
```
issueとデフォルト値比較で以下を入れればいいようだという話に。
https://github.com/kubernetes/ingress-nginx/issues/11003
https://github.com/kubernetes/ingress-nginx/issues/13092
```
controller:
  enableAnnotationValidations: false
```
↑この値は ingress-nginx4.11.3,4.11.5までは初期値がfalseだけど4.12.1からtrueになってたので戻したところ、kind:ingressのほうの以下のアノテーションの設定の`?`かなにかがバリデーションに引っかかって無効化されてたnginx.confの影響がなくなってrewriteの設定が有効になっていた。後方互換性を崩される対処方法についてドキュメントにも注意書きはあった。
https://kubernetes.github.io/ingress-nginx/examples/rewrite/

```
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /xxxx/daily/xxx?baseDay=$1
```

ingressリダイレクト参考
https://qiita.com/piggydev/items/2a24b382f9e082074921