Kubernetes 1.15: SIG Network の変更内容

## はじめに

この記事では Kubernetes 1.15 における SIG Network の活動に基づく変更点を紹介します。変更点は以下のドキュメントから収集しています。

- [CHANGELOG](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.15.md)

## 主要な変更点

Network に関する大きな変更はありません。

## アップグレード前の注意事項

- deprecated 扱いとなっていた kube-proxy の `--conntrack-max` フラグが削除されました。このフラグを使用していたユーザーは代わりに `--conntrack-min` と `--conntrack-max-per-core` を使用してください ([#78399](https://github.com/kubernetes/kubernetes/pull/78399), [@rikatz](https://github.com/rikatz))
- deprecated 扱いとなっていた kube-proxy の `--cleanup-iptables` フラグが削除されました ([#78344](https://github.com/kubernetes/kubernetes/pull/78344), [@aramase](https://github.com/aramase))

## 既知の問題

Network に関する既知の問題はありません。

## 廃止予定

- kube-proxy
  - deprecated 扱いとなっていた `--cleanup-iptables` が削除されました ([#78344](https://github.com/kubernetes/kubernetes/pull/78344), [@aramase](https://github.com/aramase))
- API
  - v1.19 から Ingress リソースは extensions/v1beta1 では提供されません。v1.14 から提供されている networking.k8s.io/v1beta1 API に移行してください。既存の Ingress リソースは networking.k8s.io/v1beta1 API からも参照できます
  - v1.16 から NetworkPolicy リソースは extensions/v1beta1 では提供されません。v1.8 から提供されている networking.k8s.io/v1 API に移行してください。既存の NetworkPolicy リソースは networking.k8s.io/v1beta1 API からも参照できます
     - :memo: 次のバージョンで古い API バージョンでの利用は廃止になるので、まだ古い API バージョンを利用している場合は速やかに移行しましょう

## メトリクスの変更

- kube-proxy に、最後にプロキシールールを反映した時刻を示すメトリクス `kube_proxy_sync_proxy_rules_last_timestamp_seconds` が追加されました ([#74027](https://github.com/kubernetes/kubernetes/pull/74027), [@squeed](https://github.com/squeed))

## 注目すべき機能変更

- Service LoadBalancer のための Finalizer プロテクション (ServiceLoadBalancerFinalizer) が Alpha 機能として追加されました。これは関連付けられたロードバランサーのリソースを削除するまで、Service リソースが完全に削除されるのを防止します。この機能はデフォルトで無効化されています ([#78262](https://github.com/kubernetes/kubernetes/pull/78262), [@MrHohn](https://github.com/MrHohn))
  - :memo: これまで `type=LoadBalancer` の Service リソースを削除した時に、外部のロードバランサーが削除されずに取り残されてしまうケースがありました。この機能を使うことで、外部のロードバランサーが確実に削除されるようになります

## API の変更

- kube-proxy でより厳格な ARP の設定を有効化するためのフラグ `--ipvs-strict-arp` が、既存の振る舞いを維持するためにデフォルト無効になりました。このフラグは v1.13.0 でデフォルト有効になりましたが、一部の CNI プラグインに影響を及ぼすことが分かったため、デフォルト無効に変更になります ([#75295](https://github.com/kubernetes/kubernetes/pull/75295), [@lbernail](https://github.com/lbernail))
  - :memo: このフラグを有効にすると、kube-proxy は `net/ipv4/conf/all/arp_ignore` に `1` を、`net/ipv4/conf/all/arp_announce` に `2` をそれぞれ設定します

## その他の機能変更

- Ingress オブジェクトは networking.k8s.io/v1beta1 バージョンとして etcd に保存されるようになりました ([#77139](https://github.com/kubernetes/kubernetes/pull/77139), [@cmluciano](https://github.com/cmluciano))
- IPVS を使用している時に kube-proxy を透過的に再起動できるようになりました ([#75283](https://github.com/kubernetes/kubernetes/pull/75283), [@lbernail](https://github.com/lbernail))
- conntrack により INVALID と判定されたパケットは破棄するようになりました。これにより、Service IP への長時間の TCP 接続において不正な再送信が発生した時に "Connection reset by peer" エラーとして接続が終了してしまう問題を修正します ([#74840](https://github.com/kubernetes/kubernetes/pull/74840), [@anfernee](https://github.com/anfernee))
- kube-proxy が他のモードでの実行時に生成したネットワークルールを自動的に削除しないようになりました。kube-proxy のモードを変更 (例: iptables モードから IPVS モードに変更) する場合は `kube-proxy --cleanup` を実行するか、kube-proxy を再度起動する前に Worker ノードを再起動 (推奨) してください。kube-proxy を異なるモードに変更していない場合は、この変更による対応は不要です。([#76109](https://github.com/kubernetes/kubernetes/pull/76109), [@vllry](https://github.com/vllry))
- kube-proxy の HealthzBindAddress と MetricsBindAddress が IPv6 アドレスの指定をサポートしました ([#76320](https://github.com/kubernetes/kubernetes/pull/76320), [@JieJhih](https://github.com/JieJhih))
- kube-proxy の userspace プロキシーが iptables プロキシーの minSyncInterval パラメーターの値に従うようになりました ([#71735](https://github.com/kubernetes/kubernetes/pull/71735), [@dcbw](https://github.com/dcbw))
- kube-proxy の iptables モードにおいて、ローカルからロードバランサーの IP アドレスへのトラフィックが Service チェインを通るようになりました ([#77523](https://github.com/kubernetes/kubernetes/pull/77523), [@andrewsykim](https://github.com/andrewsykim))
- kube-proxy の IPVS モードにおいて、(特に DNS / syslog による) 多数の DNS 接続の問題を解決するため UDP トラフィックの Graceful Termination を無効化しました ([#77802](https://github.com/kubernetes/kubernetes/pull/77802), [@lbernail](https://github.com/lbernail))
- 異なるハッシュタイプを使用している ipset ルールが存在する場合に kube-proxy がエラーを返す問題を修正しました ([#77371](https://github.com/kubernetes/kubernetes/pull/77371), [@andrewsykim](https://github.com/andrewsykim))
- iptables 1.8 において iptables ルールの削除失敗時に不適切なエラーメッセージが出力される問題を修正しました ([#77303](https://github.com/kubernetes/kubernetes/pull/77303), [@danwinship](https://github.com/danwinship))
- IPVS の Graceful Termination に関するログのログレベルを 2 に引き上げました ([#78395](https://github.com/kubernetes/kubernetes/pull/78395), [@andrewsykim](https://github.com/andrewsykim))
- kube-rpoxy で CleanupAndExit が true の時に正しく終了するようにしました ([#76732](https://github.com/kubernetes/kubernetes/pull/76732), [@JieJhih](https://github.com/JieJhih))
- type=ExternalName に設定された Service において externalName の値の最後のドットを許容するようにしました ([#78385](https://github.com/kubernetes/kubernetes/pull/78385), [@thz](https://github.com/thz))

## 所感

kube-proxy の細かな修正が多く含まれたリリースでした。NetworkPolicy リソースは次のバージョンで extensions/v1beta1 では提供されなくなるため、NetworkPolicy を利用している場合は API バージョンを確認して、速やかに networking.k8s.io/v1 に移行しましょう。