Kubernetes 1.12:  API Changes

## はじめに

このエントリは、[Kubernetes 1.12 の CHANGELOG](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.12.md#v1120) から API Changes についてまとめています。翻訳に合わせて補足を追記しています。その他の内容は次のリンク先を参照してください。

-   [Kubernetes 1.12: 既知の問題 (Known Issues) と 廃止された機能および廃止予定の機能 (Deprecations and removals)](https://qiita.com/yuanying/items/d5b55b408505d958f350)
-   [Kubernetes 1.12: 主な変更点 (Major Themes)](https://qiita.com/watawuwu/items/aeac4c5e3b43cc7ea5a0)
-   [Kubernetes 1.12: Action Required](https://qiita.com/yuanying/items/08cd4bbfe1731d5ac648)
-   [Kubernetes 1.12: 新機能 (New Features)](https://qiita.com/watawuwu/items/85039af85134e2ad53f1)
-   Kubernetes 1.12: API Changes

## Kubernetes 1.12:  API Changes
-   `kubeadm` コマンドにおいて `alpha phase kubelet config annotate-cri` phrase コマンドがサポートされました。([#68449](https://github.com/kubernetes/kubernetes/pull/68449), [@fabriziopandini](https://github.com/fabriziopandini))
    <blockquote style='color: white; font-size: 90%;'><div>:pencil: **Note**</div> `kubeadm init` 時に config から渡された CRI Socket の情報を `kubeadm upgrades` 時に利用できるよう、`Node` のアノテーションに保存する、という Phase のようです。</blockquote>

-   Windows 上の `kubeadm` において `--cri-socket` のデフォルト値が `--tcp://localhost:2375` になりました。([#67447](https://github.com/kubernetes/kubernetes/pull/67447), [@benmoss](https://github.com/benmoss))

-   `kubeadm` にて、実験的に `--rootfs` フラグが実装されました。これを利用することで `kubeadm` は (Kubernetes 設定のための) ファイル操作をする前に `chroot` を行うようになります。この機能はたとえば docker から起動された `kubeadm` のように、 Kubernetes を異なるファイルシステム上にセットアップするために便利でしょう。(:memo: 便利そう！) ([#54935](https://github.com/kubernetes/kubernetes/pull/54935), [@anguslees](https://github.com/anguslees))

-   `kubeadm config images pull` 時に指定する `--cri-socket-path` フラグが他のサブコマンドとの一貫性確保のために `--cri-socket` へリネームされました。

-   `kubeadm` にて `ControlPlaneEndpoint` の設定が `API` から `ClusterConfiguration` へと移動しました。([#67830](https://github.com/kubernetes/kubernetes/pull/67830), [@fabriziopandini](https://github.com/fabriziopandini))

-   `kubeadm` の `InitConfiguration` が　`InitConfiguration` および `ClusterConfiguration` の二つの構造体に分割されました。([#67441](https://github.com/kubernetes/kubernetes/pull/67441), [@rosti](https://github.com/rosti))
    <blockquote style='color: white; font-size: 90%;'><div>:pencil: **Note**</div> `InitConfiguration` がリファクタリングされて、`kube-proxy` や `controller-manager` の設定のような cluster-wide な設定が `ClusterConfiguration` という設定カテゴリに整理され、Init 時のマスターノードの設定から分割された、ということのようです。</blockquote>

-   `RuntimeClass` API がアルファ機能として追加されました。この機能を利用する際には `RuntimeClass` feature gate を有効化してください。`RuntimeClass` API リソースは、クラスタ内のコンテナを実行するために利用する、異なるランタイムのクラスを定義することできます。`Pod` は、その定義内の `RuntimeClassName` フィールドを通して、`RuntimeClass` を選択することができます。([#67737](https://github.com/kubernetes/kubernetes/pull/67737), [@tallclair](https://github.com/tallclair))

-   サーバサイドにおける dry-run の実行が、副作用 (side effect) や調整ループ (reconciliation mechanism) に依存する Admission webhook を実行してしまう問題を解決するために、`admissionregistration.k8s.io/v1beta1.ValidatingWebhookConfiguration` と `admissionregistration.k8s.io/v1beta1.MutatingWebhookConfiguration` に その Webhook がサーバサイドの dry-run をサポートしているかどうかを示す新しいフィールド(`SideEffects`) が追加されました。もし、dry-run をサポートしていない Webhook が呼ばれるリソースに対するリクエストがあった場合、サーバは `400: Bad Request` を返し、リクエストを拒否します。また、`admission.k8s.io/v1beta1.AdmissionReview` に対しても、dry-run に対応している Webhook であるかを確認するために同じように新しくフィールドが追加されました。([#66936](https://github.com/kubernetes/kubernetes/pull/66936), [@jennybuckley](https://github.com/jennybuckley))

-   `CRI` の `RunPodSandboxRequest` において sandobox を実行する際にランタイムの設定を選択するために利用できる `runtime_hundler` field がサポートされました。(アルファ機能) ([#67518](https://github.com/kubernetes/kubernetes/pull/67518), [@tallclair](https://github.com/tallclair))
    <blockquote style='color: white; font-size: 90%;'><div>:pencil: **Note**</div> `io.kubernetes.cri-o.TrustedSandbox` アノテーションによる、`trusted` なのか、`untrusted` なのか、というバイナリーな選択肢から、`RuntimeClass` へと置き換わる第一歩のようです、</blockquote>

-   `status` サブリソースが有効化された際に、CRD バリデーションスキーマのルートにさらにいくつかのフィールドが許されるようになりました。([#65357](https://github.com/kubernetes/kubernetes/pull/65357), [@nikhita](https://github.com/nikhita))

-   `kubelet` における `--docker-disable-shared-pid` フラグは削除されました。Pod 内の PID namespace の共用は個々の `Pod` の `ShareProcessNamespace` オプションを利用してください。([#66506](https://github.com/kubernetes/kubernetes/pull/66506), [@verb](https://github.com/verb))

-   `kube-dns` で利用されている `dnsmasq` に `--dns-loop-detect` オプションが追加されました。([#67302](https://github.com/kubernetes/kubernetes/pull/67302), [@dixudx](https://github.com/dixudx))
    <blockquote style='color: white; font-size: 90%;'><div>:pencil: **Note**</div> [cluster/addons/dns](https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns) 内と `kubeadm`, `kubemark` で利用されているマニフェストの `dnsmasq` の引数に `--dns-loop-detect` を渡すようにした、というだけのようです。</blockquote>

-   `kube-addon-manager` において追加の `--prune-whitelist` リソースをサポートしました。([#67743](https://github.com/kubernetes/kubernetes/pull/67743), [@Random-Liu](https://github.com/Random-Liu))
    <blockquote style='color: white; font-size: 90%;'><div>:pencil: **Note**</div> `addon-manager` は `addonmanager.kubernetes.io/mode` というラベルと、`kubectl apply --prune --label=$LABEL` という[仕組み](https://kubernetes.io/docs/concepts/overview/object-management-kubectl/declarative-config/#alternative-kubectl-apply-f-directory-prune-l-your-label)を使って[リソースの管理を行っている](https://qiita.com/inajob/items/300805e895eec6535dd2)のですが、デフォルトで prune されないリソースが存在し、addon 管理上問題となっていました。この修正で prune されるべきリソースがちゃんと prune されるようになったようです。</blockquote>

-   [Resource Quota ScopeSelectors](https://kubernetes.io/docs/concepts/policy/resource-quotas/#resource-quota-per-priorityclass) がベータに昇格し、デフォルトで有効化されます。([#67077](https://github.com/kubernetes/kubernetes/pull/67077), [@vikaschoudhary16](https://github.com/vikaschoudhary16))
    <blockquote style='color: white; font-size: 90%;'><div>:pencil: **Note**</div> `ResourceQuota` に `scopeSelector` というフィールドが追加され、プライオリティクラスごとに Quota を設定できる機能のようです。</blockquote>

-   OpenAPI spec とドキュメントに `DELETE` リクエスト時の `202 Accepted` レスポンスが反映されました。この変更はエラーパスに依存しているいくつかのクライエントに影響を与える可能性があります。([#63418](https://github.com/kubernetes/kubernetes/pull/63418), [@roycaihw](https://github.com/roycaihw))
    <blockquote style='color: white; font-size: 90%;'><div>:pencil: **Note**</div> `kube-apiserver` はそもそも非同期の `DELETE` オペレーション時に 202 Accepted を返していたのですが、それが OpenAPI の spec に反映されていなかった問題を修正した、ということらしいですが、その OpenAPI spec から生成された各種言語のクライアントが非同期オペレーションをサポートしていない場合があるようです。</blockquote>

-   アルファ機能であった `Initializer` アドミッションプラグインはデフォルトとして今後有効化されることはありません。これは、アルファ API としてデフォルトとしてオフにせよというポリシー通りの振る舞いです。([#66039](https://github.com/kubernetes/kubernetes/pull/66039), [@liggitt](https://github.com/liggitt))

-   `kube-scheduler` に API レベルでバリデーションが追加されました。([#66799](https://github.com/kubernetes/kubernetes/pull/66799), [@noqcks](https://github.com/noqcks))
    <blockquote style='color: white; font-size: 90%;'><div>:pencil: **Note**</div> `kube-scheduler` の設定ファイルのバリデーションが入った、ということらしいです。</blockquote>

-   `PodDisruptionBudget` における `DisruptedPods` フィールドが必須項目からオプション項目になりました。