Kubernetes 1.16: API Changes

# はじめに

このエントリは、[Kubernetes 1.16 の CHANGELOG](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.16.md) からにAPI Changes についてまとめています。翻訳に合わせて補足を追記しています。その他の内容は [Kubernetes 1.16 の変更点まとめ](https://qiita.com/uesyn/items/0246346d8958318fa1d4)を参照ください。

このエントリでは補足などの追加のコメントは :pencil: のあとに追加するようにしています。

## API Changes

- `MutatingWebhookConfiguration` と `ValidatingWebhookConfiguration` の API が `admissionregistration.k8s.io/v1` に昇格しました
    - v1 から `failurePolicy` のデフォルト値が `Ignore` から `Fail` に変更されました
        - :memo: Fail になったことによって Pod の ValidatingWebhookConfiguration を追加して Webhook 先起動しなくなると Pod がデプロイできなくなり修正も行えない問題が報告されています。移行するときは注意しましょう。
    - v1 から `matchPolicy` のデフォルト値が `Exact` から `Equivalent` に変更されました
    - v1 から `timeout` のデフォルト値が `30s` から `10s` に変更されました
    - v1 から `sideEffects` のデフォルト値が削除され、必須フィールドとなりました。 v1 では `None` か `NoneOnDryRun` のみが許可されています
        - :memo: `Unknown` と `Some` が削除されたようです。 `Unknown` は以前はデフォルト値になっていましたが `Unknown` だと dryRun が動作せず `kubectl diff` などを使うとエラーになっていましたが今後はそういったことはなくなりそうです。
    - `admissionReviewVersions` のデフォルト値が削除され、必須フィールドとなりました。`v1` または `v1beta` がサポートされています。
    - `name` フィールドが `admissionregistration.k8s.io/v1` の `MutatingWebhookConfiguration` と `ValidatingWebhookConfiguration` オブジェクトの中でユニークな値を設定しなければいけないように変更されました
- admission webhook から送られる `AdmissionReview` API が `admission.k8s.io/v1` に昇格しました。 Webhookは、 `admissionReviewVersions：["v1"、"v1beta1"]`で `v1` AdmissionReviewオブジェクトを受信するための設定を指定でき、送信されるのと同じ` apiVersion`のAPIオブジェクトで応答する必要があります。 `admission.k8s.io/v1` を利用している webhooks はそのレスポンスで追加のバリデーションが行われます。
    - validating admission webhooks では `response.patch` と `response.patchType` は許可されなくなりました
    - `apiVersion: "admission.k8s.io/v1"` が必須になりました
    - `kind: "AdmissionReview"` が必須になりました
    - `response.uid: "<value of request.uid>"` が必須になりました
    - `response.patch` が設定されている場合は `response.patchType: "JSONPatch"` が必須になりました ([#80231](https://github.com/kubernetes/kubernetes/pull/80231), [@liggitt](https://github.com/liggitt))
    - :memo: 上記の `MutatingWebhookConfiguration` と `ValidatingWebhookConfiguration` にあった `admissionReviewVersions` で指定して、Webhook はリクエストのオブジェクトと同じバージョンのレスポンスを返す必要があるようです
- `CustomResourceDefinition` APIが `apiextensions.k8s.io/v1` に昇格しました。変更点は以下のとおりです。
    - Validattion Schema による新しい Defaulting 機能の使用はv1に制限されています
    - `spec.scope` のデフォルト値は `Namespaced` ではなくなり、明示的な指定が必須になりました
    - `spec.version` は v1 で削除されました。代わりに `spec.versions` を利用してください。
    - `spec.validation` は v1 で削除されました。代わりに `spec.versions[*].schema` を利用してください。
    - `spec.subresources` は v1 で削除されました。代わりに `spec.versions[*].subresources` を利用してください。
    - `spec.additionalPrinterColumns` は v1 で削除されました。代わりに `spec.versions[*].additionalPrinterColumns` を利用してください。
    - `spec.conversion.webhookClientConfig` は `spec.conversion.webhook.clientConfig` に移動されました。
    - `spec.conversion.conversionReviewVersions` は `spec.conversion.webhook.conversionReviewVersions` に移動されました
    - `spec.versions[*].schema.openAPIV3Schema` は v1 の CustomResourceDefinitions を作成するときに必須になりました
    - `spec.preserveUnknownFields: true`　は v1 の CustomResourceDefinitions を作成するときに許可されなくなりました。 代わりにスキーマの定義に`x-kubernetes-preserve-unknown-fields: true` を追加してください。
        - :memo: スキーマを定義するほうに定義するようになったようです。[ソース](https://github.com/kubernetes/kubernetes/blob/v1.16.0/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/structural.go#L71)
    - `additionalPrinterColumns` の各カラム定義の `JSONPath` フィールドが削除され、v1 から `jsonPath` に変更されました。 (fixes https://github.com/kubernetes/kubernetes/issues/66531)
    - `apiextensions.k8s.io/v1beta1` の `CustomResourceDefinition` が廃止予定となり、 v1.19 で廃止される予定になりました。 ([#79604](https://github.com/kubernetes/kubernetes/pull/79604), [@liggitt](https://github.com/liggitt))
- CR の変換のために CustomResourceDefinition conversion webhook との間で送受信される `ConversionReview` API が `apiextensions.k8s.io/v1`に昇格しました。 CustomResourceDefinition conversion webhook は、CustomResourceDefinition の conversionReviewVersions リストに v1 を含めることで、 `apiextensions.k8s.io/v1` バージョンの `ConversionReview` APIオブジェクトでの受信および応答をサポートすることを示すことができるようになりました。 conversion webhook は、受け取ったのと同じ apiVersion の ConversionReview オブジェクトで応答する必要があります。 `apiextensions.k8s.io/v1` `ConversionReview` のレスポンスは、送信されたオブジェクトの `request.uid`と一致する` response.uid`を指定する必要があります。 ([#81476](https://github.com/kubernetes/kubernetes/pull/81476) 、[@liggitt](https://github.com/liggitt))
- RuntimeClasses を考慮したスケジューリングがサポートされました。RuntimeClasses は tolarations と nodeSelector で指定でき、RuntimeClass を使った Pod を作成すると PodSpec にそれらの指定がマージされます。
- CloudProvider によって報告される Node IP のセットが変更された場合でも、 kubelet は同じプライマリ Node IP をより確実に報告するようになりました。
([#79391](https://github.com/kubernetes/kubernetes/pull/79391), [@danwinship](https://github.com/danwinship))
    - :memo: マージの方法に問題があったようでマージ方式に変更があったようです。
- ハッシュの変更を回避するために、コンテナハッシュ値を計算するときにnilまたは空のフィールドを省略します。 コンテナ仕様にゼロ以外のデフォルト値を持つ新しいフィールドの場合、ハッシュは変更されます。([#57741](https://github.com/kubernetes/kubernetes/pull/57741), [@dixudx](https://github.com/dixudx))
- `apiextensions.v1beta1.CustomResourceDefinitionStatus` と `apiextensions.v1.CustomResourceDefinitionStatus` の conditions は必須ではなくなりオプショナルになりました。([#64996](https://github.com/kubernetes/kubernetes/pull/64996), [@roycaihw](https://github.com/roycaihw))
- CustomResourceDefinition の condition ステータスが変更されたときに `lastTransitionTime` が更新されるようになりました。([#69655](https://github.com/kubernetes/kubernetes/pull/69655), [@CaoShuFeng](https://github.com/CaoShuFeng))