Kubernetes 1.12: 主な変更点 (Major Themes)

## はじめに

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

-   [Kubernetes 1.12: 既知の問題 (Known Issues) と 廃止された機能および廃止予定の機能 (Deprecations and removals)](https://qiita.com/yuanying/items/d5b55b408505d958f350)
-   Kubernetes 1.12: 主な変更点 (Major Themes)
-   [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](https://qiita.com/yuanying/items/ba7e64b44ae933a65792)

## SIG API Machinery

SIG API はこのリリースで dry-run 機能の開発を行いました。この機能によりユーザーはデータ変更せずに、特定のコマンド結果を確認できます。

:memo: dry-run を使用できる一例。

- ResourceQuota
- EventRateLimit
- NamespaceAutoProvision
- ValidAdmissionWebhook
- MutatingAdmissionWebhook

## SIG-autoscaling

SIG Autoscaling は Horizontal Pod Autoscaling API とそのアルゴリズムの改善にフォーカスしました。

- クリーンナップされより統合された API である autoscaling/v2beta2 をリリースしました。
- より多様なユースケースでより良く動作するように、readiness の検出と補正を改善しました。  
  :memo: 具体的にはスケールアップ後に適用されていた horizontal-pod-autoscaler-upscale-delay (3m) が使用されなくなり、通常の監視間隔でメトリクスの監視が実施されるようになりました。
  またデフォルトの監視間隔も 30s から 15s に変更されています。

## SIG-azure
SIG azure は2つの新しいアルファ機能にフォーカスしました。

- Cloud Provider に Azure アベイラビリティゾーンのサポートが追加されました。
- Cross-RG リソースがサポートされました（disks、azure file、node [experimental]）

上記の新機能の他に、Azure 仮想マシンスケールセット（VMSS）と Cluster-Autoscaler のサポートが安定しているため、GA とみなされました。

- Azure 仮想マシンスケールセット（VMSS）を使用すると、オンデマンドまたはスケジュールによって自動的に増減する負荷分散された VM を作成・管理できます。
- Kubernetes はこの機能により Azure VMSS でコンテナ化されたアプリケーションのスケーリングを行います。
この機能には Cluster-Autoscaler と連携し、Kubernetes クラスタのノードサイズを自動的に調整する機能も含まれています。  
:memo: 以下のブログで詳しい内容が説明されています。  
[Support for Azure VMSS, Cluster-Autoscaler and User Assigned Identity](https://kubernetes.io/blog/2018/10/08/support-for-azure-vmss--cluster-autoscaler-and-user-assigned-identity/)

## SIG-cli

SIG-CLI は、新しいプラグイン機構の実装とプラグイン作者のための CLI ライブラリの提供に注力し、加えてコードのリファクタリングに取り組みました。

詳しくは @&#xFFF0;superbrothers による[この記事](https://qiita.com/superbrothers/items/e54d650b889f5229c534)が参考になります。

## SIG-cloud-provider

このリリースが SIG Cloud Provider の初リリースです！

v1.12 で SIG Cloud Provider は既存、または新規の Cloud Provider をより良くサポートするために、プロセスとインフラストラクチャーの構築にフォーカスしました。
その取り組み（その多くはまだ進行中）のいくつかは次の通りです。

- すべての Cloud Provider から E2E コンフォーマンステストの結果を TestGrid にレポート（SIG Testing 、 SIG Release と連携）  
  :memo:
  TestGrid は [kubernetes/test-infra](https://github.com/kubernetes/test-infra/tree/master/testgrid) リポジトリにまとめられており、結果は[こちらのGAE](https://k8s-testgrid.appspot.com/) にホストされています
- 以下を含め Cloud Provider ごとに必要最低限なドキュメントを定義する（SIG Docs と連携）
  - kube-apiserver 、 kube-controller-manager 、 kube-schedule 、 kubelet と cloud-controller-manager のサンプルマニフェスト
  - クラウド固有のコントローラーが使用するラベルとアノテーション

上記に加え、SIG Cloud Provider は `kubernetes/kubernetes` リポジトリから Cloud Provider 固有のコードを削除する長期的な仕組みにも重点を置いています。

## SIG-cluster-lifecycle

このリリースで SIG Cluster lifecycle は、バグ修正といくつかの重要な機能を追加し、kubeadm のユーザーエクスペリエンスの改善にフォーカスしました。
kubeadm で変更されたいくつかの内容は次の通りです。

- kubeadm の設定が `v1alpha3` に昇格しました:  
:memo: v1alpha2 は v1.13 で削除される予定なので、[こちらのドキュメント](https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-config/)をもとに移行をおすすめします。
  - `v1alpha1` は削除されました。
  - `v1alpha3` では `MasterConfiguration` を `InitConfiguration`、`ClusterConfiguration`、`JoinConfiguration`、`KubeletConfiguration` と `KubeProxyConfiguration` のコンポーネントに分割しました。
  - 異なるコンポーネントの設定（YAML）でも `---` 区切り文字を使い、同じファイルで定義し適用できるようになりました。
- CRI のハンドリングを以下の通り改善しました
  - Container ランタイムが docker だけの場合、crictl は不要に
  - インストールされた CRI の検出を改善
  - コンテナイメージを pull した時のエラー出力が改善
- オフラインやエアギャップ環境のサポートが改善されました[#1041](https://github.com/kubernetes/kubeadm/issues/1041)  
:memo:
ここで使われているエアギャップ環境とは、インターネットなどのネットワークから物理的に隔離されているような環境を指しています
  - kubeadm はエアギャップ環境ではローカルのクライアントバージョンを使って制御します
  - いくつかの kubeadm コマンドは、オフラインモードで動作するようになりました
- 証明書処理の改善
  - アップグレード処理の一部として証明書を更新
  - 証明書を更新するコマンド `kubeadm alpha phase certs renew` を追加
  - kubeadm で作成された証明書の DN (Distinguished Name) の一意性が向上
- HA（高可用性）の改善
  - コントロールプレーンのインスタンスを既存クラスタに追加する `kubeadm join --experimental-control-plane` コマンドが使用できるように
  - `kubeadm join --experimental-control-plane` コマンドで作成されたコントロールプレーンのインスタンスをアップグレードするために、` kubeadm upgrade node experimental-control-plane` が使用できるようになりました
- マルチアーキテクチャのサポート（EXPERIMENTAL）:
  - kubeadm は docker イメージの `Schema 2` のマニフェストをサポートしました。これは、マルチアーキテクチャをサポートする kubeadm ベースの Deployment を作成する最初のプロセスです。  
  :memo: これは異なるアーキテクチャのノードを持つクラスタで発生していた[問題](https://github.com/kubernetes/kubernetes/issues/33916)に対応するための改善です
- 非推奨機能
  - Feature Gates の Alpha ステージである HighAvailability、SelfHosting、CertsInSecrets が非推奨となりました。v1.13.0 で削除される予定です。

## SIG-ibmcloud

新しい SIG として SIG-ibmcloud が設立されました。
SIG-ibmcloud はこのグループの設立にフォーカスし、IBM Clouds の継続的な Kubernetes のスケーラビリティテスト、アップグレード戦略などを共有しています。
その他にも SIG メンバーと協力し、 Cloud Provider のコードを GitHub リポジトリへ移行するプロセスも進行中です。

## SIG-instrumentation

機能の追加はありませんが、メトリクスサーバーの大規模なリファクタリングとバグ修正が実施されました。

## SIG-node

SIG-node では Share Process Namespace 機能をアルファからベータに移行しました。
この機能を使用すると Pod 内の全てのコンテナが、共通のプロセス名前空間を共有するようになります。  
:memo: 機能が有効になっていれば（デフォルトは有効）、以下の通り Pod に設定し使用できます。

```pod_share_process_ns.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  shareProcessNamespace: true # <--- add
  containers:
  ...
```

この機能により PID1 問題に対応したり、サイドカーより `kill -HUP` などでシグナルの送信が可能となります。

また、このリリースで 2 つのアルファ機能が追加されました。
RuntimeClass のアルファ機能では、様々なワークロードタイプをサポートするため、複数の実行時オプションをノードに指定できるようになりました。
例えば、ネイティブの Linux コンテナや、コンテナをホストカーネルから分離したサンドボックスコンテナなどが考えられます。
:memo: 詳細はこちらの記事を参照

- [Introducing RuntimeClass](https://kubernetes.io/blog/2018/10/10/kubernetes-v1.12-introducing-runtimeclass/)
- [Runtime Class の KEP](https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md)

CustomCFSQuotaPeriod のアルファ機能は、CFS Quata で適用されるデフォルト周期を変更できます。
:memo: （デフォルト時）kubelet は CFS Quota を使用して Pod の cpu-limits を適用します。
デフォルト周期の状態でワークロードのレイテンシが発生している場合、パフォーマンスを改善できる可能があります。
:memo: デフォルトの CPU CFS（Completely Fair Scheduler）周期は 100 ミリ秒です。

最後に、この SIG では新しい機能の設計と実装を進めながらバグの修正を実施し、継続的に信頼性を向上させることに重点を置いています。

## SIG-OpenStack
SIG-OpenStack の開発は主にバグ修正と OpenStack リソースでのパリティ向上（機能的同等性）にフォーカスしています。
In-tree Provider から External Provider への移行を進めるために、新しい機能は External Provider に主に制限されました。

In-tree のバグの修正と改善は次の通りです。

- VIP がないロードバランサーステータスの修正
- サーバーステータスのフィルタリングを修正
- Cinder ボリュームで作成された PVC のリサイジングを修正
- Cloud config で定義されていないロードバランサーの設定を無効化
- ノードシャットダウン時の taint をサポート

上記に加え、External Provider には以下の修正と機能が追加されています。

- 作成済み Floating IP の割り当てを防ぐバグを修正
- OS_DOMAIN_NAME が指定されていない時の Cinder の認証バグを修正
- スコープのないトークンの同期をスキップする、Keystone の認証エラーを修正
- client-auth-plugin の認証エラーを修正
- 依存関係の参照を In-tree Provier から External Provider を参照するように修正
- プロバイダ ID でインスタンスをシャットダウンできるように対応
- サービス削除後に Floating IP を保持するアノテーションを追加
- stable と development ブランチにコンフォーマンステストを追加
- Keystone Trust による認証のサポートとカスタム CA 提供のために Manilla のサポートを追加
- ドキュメントの更新を追加
- 共有データをプロビジョニングするために Manilla のサポートを追加
- ロードバランサの説明にクラスタネームを追加
- Kubernetes と Keystone プロジェクト間の同期処理を追加
- ノードの 'hostname' に内部 DNS 名を使用
- Cinder と Manilla に CSI v0.3.0 のサポートを追加
- パフォーマンスを向上のために、Octavia ロードバランサーに 'cascade delete' をサポート
- ロードバランサのネーミングを改善

## SIG-scheduling

SIG Scheduling は主に信頼性とパフォーマンス向上にフォーカスし開発をしました。

- Pod のアフィニティ/アンチアフィニティ機能のパフォーマンスがアルゴリズムの最適化により 100 倍以上向上しました。  
- DaemonSet コントローラーにスケジュールされていた DaemonSet の Pod が、v1.12 でデフォルトのスケジューラーにより配置されるようになりました。この変更により DaemonSet の Pod はデフォルトスケジューラーの全てのスケジューリング機能を利用できます。
- スケジューラーの Image Locality を優先する機能が改善されデフォルトで有効になりました。この機能を有効にすると、Pod が必要とするコンテナイメージの一部または全てを Local に持つノードが優先的に選択され、Pod の起動時間が短縮されます。
- TaintNodeByCondition はベータに移行しデフォルトで有効になりました。
- 2000 ノード以上の大きなクラスタで、最大で 50％ ほどスケジューラーのスループットが向上しました。

## SIG-service-catalog

- アクションを実行したユーザーをブローカーに知らせる Originating Identity 機能は、現在 GA になりました。
- オペレーターがクラスタレベルではなく、ネームスペースごとにブローカーをインストールできる [Namespaced Brokers](https://svc-cat.io/docs/namespaced-broker-resources/) が GA になりました
- [Service Plan Defaults](https://svc-cat.io/docs/service-plan-defaults/) の機能がアルファになり、現在も開発中です。
この機能はサービスのデフォルトのプロビジョニングパラメーターをオペレーターが定義できる機能です。  
:memo:
例えばデフォルトのプロビジョニングパラメーターとして、データベースに接続できるデフォルトの IP アドレスなどを定義できます。
- サービスカタログによって公開されるサービスを[フィルタリングする機能](https://svc-cat.io/docs/catalog-restrictions/)がサポートされました。  
- kubectl と svcat コマンドの出力フォーマットを改善し、いくつかのコマンドを追加することでエクスペリエンスが向上しました。

## SIG-storage
@&#xFFF0;ysakashita による[この記事](https://qiita.com/ysakashita/items/d498043f356fed1d0cbe)が参考になります。

## SIG-vmware

SIG-VMware では主に、In-tree Cloud Provider のバグ修正、 External Cloud Provider の開発スタート、vSphere の Cluster-API Provider のオーナーシップを取ることにフォーカスしました。

In-tree Cloud Provider のバグ修正と改善は次の通りです。

- vSphere タグを使用し、Zone 初期化のサポートを追加
- 自動テストのために vcsim を導入し、テストハーネスを改善
- v1.10 から v1.11 へのアップデートを妨げていた不具合を修正

External Cloud Provider は確立し、In-tree Cloud Provider と同等の機能に達しました。v1.13 では安定化とデプロイメントモデルを作ることを目指します。
また CSI プラグインの vSphere ボリューム機能も In-tree からの移行を開始しています。

現在、Cluster API の取り組みは既存のコードを完全に再構築し、 Terraform から govmomi を直接使用するようになっています。

## SIG-windows

SIG Windows は既存機能群の安定化と信頼性の向上にフォーカスしています。主にバグ修正です。