Kubernetes 1.19: SIG-Network の変更内容

[Kubernetes 1.19](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.19.md) の SIG-Network の変更内容をまとめました。

## What's New (新情報)
- Kubernetes 1.19 で [Ingress API](https://kubernetes.io/docs/concepts/services-networking/ingress/) が General Availability となりました :tada:

:memo: Ingress の登場から 5 年近いときを経て、ついに General Availability となりました！後述するように、`networking.k8s.io/v1` ではいくつかのフィールドに変更があるのでご注意ください。公式ドキュメントの [Ingress のページ](https://kubernetes.io/docs/concepts/services-networking/ingress/)も更新されているので合わせてご覧ください。

Ingress のバージョンの歴史を以下に簡単にまとめてみました。

リリース時期  |  Kubernetes のサポート開始 | Ingress バージョン
--- | --- | ---
[2015年9月](https://github.com/kubernetes/kubernetes/releases/tag/v1.1.0) | Kubetnetes v1.1.0 | `experimental/v1alpha1`
[2016年3月](https://github.com/kubernetes/kubernetes/releases/tag/v1.2.0) | [Kubernetes v1.2.0](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.2.md) | `extensions/v1beta1`
[2019年5月](https://github.com/kubernetes/kubernetes/releases/tag/v1.14.0) | [Kubernetes v1.14.0](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.14.md) | `networking.k8s.io/v1beta1`
[2020年8月](https://github.com/kubernetes/kubernetes/releases/tag/v1.19.0) | [Kubernetes v1.19.0](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.19.md) | `networking.k8s.io/v1`

なお、SIG-Network では Ingress の上位概念なものとして Service APIs というリソースの議論がされています。Ingress を置き換えることは目的としていないようです。興味あれば、以下をご覧ください。

- https://github.com/kubernetes/community/tree/master/sig-network#meetings
  - Service APIs Meeting の議事録
- https://github.com/kubernetes-sigs/service-apis
  - Service API のレポジトリ
- https://kubernetes-sigs.github.io/service-apis/
  - Service API のドキュメント

> Service API のコンセプト図  ([API concepts](https://kubernetes-sigs.github.io/service-apis/concepts/) の図を引用)
> ![Service API](https://kubernetes-sigs.github.io/service-apis/schema-uml.svg)


## API Changes (API の変更)
- カスタム Endpoints が EndpointSliceMirroring コントローラーによって、EndpointSlices にミラーされるようになりました ([#91637](https://github.com/kubernetes/kubernetes/pull/91637), [@robscott](https://github.com/robscott)) [SIG API Machinery, Apps, Auth, Cloud Provider, Instrumentation, Network and Testing]
    - :memo: ミラーされたくない場合は、`endpointslice.kubernetes.io/skip-mirror: "true"` というラベルを設定すると除外できるようです
- Go1.14.4 が Kubernetes をビルドするのに必要な最低バージョンになりました ([#92438](https://github.com/kubernetes/kubernetes/pull/92438), [@liggitt](https://github.com/liggitt)) [SIG API Machinery, Auth, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Network, Node, Release, Storage and Testing]
- Kube-proxy: ポートのバインドに失敗した場合に fatal となる `--bind-address-hard-fail` フラグが追加されました ([#89350](https://github.com/kubernetes/kubernetes/pull/89350), [@SataQiu](https://github.com/SataQiu)) [SIG Cluster Lifecycle and Network]
- Kubernetes は golang 1.15.0-rc.1 でビルドされるようになりました
    - 廃止予定となっていた、x.509 のサーバー証明書で Subject Alternative Name がない場合 CommonName フィールドをホスト名として扱う挙動がデフォルトで無効になりました。この挙動は GODEBUG 環境変数に x509ignoreCN=0 を設定することで、一時的に有効にすることができます ([#93264](https://github.com/kubernetes/kubernetes/pull/93264), [@justaugustus](https://github.com/justaugustus)) [SIG API Machinery, Auth, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Network, Node, Release, Scalability, Storage and Testing]
    - :memo: [Go 1.15 から X.509 証明書の CommonName をホスト名として扱う挙動が無効](https://golang.org/doc/go1.15#commonname)になったようです
- ServiceAppProtocol のフィーチャーゲートが beta となりデフォルトで有効になり、Service と Endpoint に AppProtocol フィールドが追加されました。([#90023](https://github.com/kubernetes/kubernetes/pull/90023), [@robscott](https://github.com/robscott)) [SIG Apps and Network]
- PodSpec に SetHostnameAsFQDN という新しいフィールドができました。`true` に設定された場合は fully qualified domain name (FQDN) が Pod のホスト名として設定されます。Linux コンテナでは、カーネルのホスト名フィールドに FQDN が設定されます (utsname 構造体の nodename フィールド)。Windows コンテナでは、レジストリの HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters の値として FQDN が設定されます。Pod が FQDN を持たない場合は無効となります。([#91699](https://github.com/kubernetes/kubernetes/pull/91699), [@javidiaz](https://github.com/javidiaz)) [SIG Apps, Network, Node and Testing]
    - :memo: SetHostnameAsFQDN フィーチャーゲート (alpha) を有効にする必要があります
- `DefaultIngressClass` 機能が GA になりました。`--feature-gate` パラメータは 1.20 で削除されます ([#91957](https://github.com/kubernetes/kubernetes/pull/91957), [@cmluciano](https://github.com/cmluciano)) [SIG API Machinery, Apps, Network and Testing]
- Service.Spec.IPFamily のドキュメントを更新し、dual-stack 機能が GA になる前にセマンティクスが変更される可能性がある注意が入りました。利用者は既存の Service が IPv4, IPv6 または dual-stack かを知りたい場合、IPFamily ではなく、ClusterIP または Endpoints を見なければなりません。 ([#91527](https://github.com/kubernetes/kubernetes/pull/91527), [@danwinship](https://github.com/danwinship)) [SIG Apps and Network]
    - :memo: 現在の IPFamily フィールドは IPv6DualStack 機能が有効なときに `IPv4` もしくは `IPv6` が指定できます
- `Ingress` と `IngressClass` は `networking.k8s.io/v1` になりました。`extensions/v1beta1`、`networking.k8s.io/v1beta1` の Ingress と IngressClass は廃止予定となり、1.22 以上では利用できません。永続化されたオブジェクトは `networking.k8s.io/v1` API でアクセスできます。v1 の Ingress Object で重要な変更は以下です。
  - `spec.backend` -> `spec.defaultBackend`
  - `serviceName` -> `service.name`
  - `servicePort` -> `service.port.name` (文字列の場合)
  - `servicePort` -> `service.port.number` (数値の場合)
  - `pathType` は v1 でデフォルト値を持たなくなりました。"Exact", "Prefix", "ImplementationSpecific" のいずれかを指定してください
  - その他の Ingress API の変更
  - バックエンドに Service だけでなくリソースを指定できるようになりました
      - :memo: 将来的にフレキシブルに拡張できるように Custom Resource をバックエンドに指定できるようになりました。例としては S3 などのストレージバケットに直接ルーティングするユースケースが挙げられています。
  - `path` は正当な正規表現である必要がなくなりました ([#89778](https://github.com/kubernetes/kubernetes/pull/89778), [@cmluciano](https://github.com/cmluciano)) [SIG API Machinery, Apps, CLI, Network and Testing]


## Feature (機能追加)
- Windows で Kubernetes service に Session Affinity を設定する機能がサポートされました。[Windows Server vNext Insider Preview Build 19551](https://blogs.windows.com/windowsexperience/2020/01/28/announcing-windows-server-vnext-insider-preview-build-19551/) 以上のバージョンが必要です。([#91701](https://github.com/kubernetes/kubernetes/pull/91701), [@elweb9858](https://github.com/elweb9858)) [SIG Network and Windows]
- EndpointSlice コントローラーが同期のリトライ失敗時により長く待つようになりました ([#89438](https://github.com/kubernetes/kubernetes/pull/89438), [@robscott](https://github.com/robscott)) [SIG Apps and Network]
    - :memo: exponential backoff の初期値が 5ms から 1s に変更されています
- IPVS proxy で、バーチャルサーバーアドレスがバインドされていない場合、EnsureDummyInterface のパフォーマンスを改善しました。 ([#92609](https://github.com/kubernetes/kubernetes/pull/92609), [@andrewsykim](https://github.com/andrewsykim)) [SIG Network]
- EndpointSliceProxying フィーチャーゲート設定時、Windows 上で kube-proxy が EndpointSlices をサポートしました。([#90909](https://github.com/kubernetes/kubernetes/pull/90909), [@kumarvin123](https://github.com/kumarvin123)) [SIG Network and Windows]
- IPv6DualStack フィーチャーゲートを設定時、Windows 上で kube-proxy が IPv6DualStack をサポートしました ([#90853](https://github.com/kubernetes/kubernetes/pull/90853), [@kumarvin123](https://github.com/kumarvin123)) [SIG Network, Node and Windows]
- Linux 上ではデフォルトで kubep-roxy が Endpoints の代わりに EndpointSlices を見るようなりました。Windows 上では新規で作られたアルファの `WindowsEndpointSliceProxying` フィーチャーゲートでこの機能を有効にできます。([#92736](https://github.com/kubernetes/kubernetes/pull/92736), [@robscott](https://github.com/robscott)) [SIG Network]
- ユーティリティライブラリに小さな拡張が入りました ([#92440](https://github.com/kubernetes/kubernetes/pull/92440), [@luigibk](https://github.com/luigibk)) [SIG Network]
    - [ebtables.go](https://github.com/kubernetes/utils/blob/master/net/ebtables/ebtables.go) に機能が増えたようです
- Service controller: ノードの関連フィールドが変更されたときだけ、LB ノードプールを同期するようになりました。([#90769](https://github.com/kubernetes/kubernetes/pull/90769), [@andrewsykim](https://github.com/andrewsykim)) [SIG Apps and Network]
- SCTPSupport フィーチャーがデフォルトで有効になりました ([#88932](https://github.com/kubernetes/kubernetes/pull/88932), [@janosi](https://github.com/janosi)) [SIG Network]