Kubernetes 1.2の変更点


Kubernetesの[v1.2のmilestone](https://github.com/kubernetes/kubernetes/milestones/v1.2) にあるissue/PRと [release-1.1](https://github.com/kubernetes/kubernetes/tree/release-1.1)と[release-1.2](https://github.com/kubernetes/kubernetes/tree/release-1.2)のブランチのdiffからKubernetes 1.2に入るであろう主な変更点をまとめてみました。Kelsey Hightowerさんの[KubeCon2016 EUでの1.2のリリースに関するtweet](https://twitter.com/kelseyhightower/status/707877289799892992)によると、リリースは3月末を予定しているようです。

他の参考情報

- kubernetes-dev ML [Kubernetes 1.2 Timeline](https://groups.google.com/forum/#!topic/kubernetes-dev/oO4lKNnC7zU)スレッド
- Kubernetes GitHub Wiki [Release-1.2](https://github.com/kubernetes/kubernetes/wiki/Release-1.2)
- GCP Podcast [#16 Kubernetes 1.2 with Kelsey Hightower](https://www.gcppodcast.com/post/episode-16-kubernetes-1-dot-2-with-kelsey-hightower/)

## 変更点
### 全体的なもの

- **ConfigMap**が実装された
    - 複数の設定をまとめたオブジェクトで、volumeや環境変数としてPodに渡すことができるもの
    - 公式ドキュメント [Using ConfigMap](http://kubernetes.io/docs/user-guide/configmap/)
    - Secretに似ているが動的にアップデートがPodに反映できるようになる?(Volumeとして使った場合)
        - Designドキュメント [Generic Configuration Object](https://github.com/kubernetes/kubernetes/blob/master/docs/design/configmap.md)
    - [Aggregator for ConfigMap resource implementation #18455](https://github.com/kubernetes/kubernetes/issues/18455)
- **Job**がStableに昇格
    - Jobはバッチ処理のような終わりのある処理を行うためのリソース
    - 公式ドキュメント [Jobs](http://kubernetes.io/docs/user-guide/jobs/)
    - [Job: requirements for graduation to stable #15985](https://github.com/kubernetes/kubernetes/issues/15985)
    - [Copy Jobs to batch/v1 group #21434](https://github.com/kubernetes/kubernetes/pull/21434)
        - batch/v1のグループに移動
- **Deployment**がデフォルトで有効になった(Betaに昇格) :tada:
    - DeploymentはReplicationController、Podの宣言的なアップデートを可能にする機能
        - ```kubectl rolling-update```はクライアント側でアップデートするが、Deploymentはサーバサイドで処理され、より宣言的に書ける
    - 公式ドキュメント [Deployments](http://kubernetes.io/docs/user-guide/deployments/)
    - [Enable deployments by default #20517](https://github.com/kubernetes/kubernetes/pull/20517)
    - [Deployment: requirements for graduation to "beta" #15313
](https://github.com/kubernetes/kubernetes/issues/15313)
- **DaemonSet**がデフォルトで有効になった(Betaに昇格)
    - DaemonSetはすべてのNodeで特定のPodを動かしたい時に使える機能
        - 例えばNodeごとの監視デーモンやクラスタストレージのデーモンなど
    - 公式ドキュメント [Daemon Sets](http://kubernetes.io/docs/admin/daemons/)
    - [Graduate DaemonSet API to v1beta1, enable it by default. #21130](https://github.com/kubernetes/kubernetes/pull/21130)
- **Inert Deployment**が実装された
    - Deploymentはconfigの変更をトリガーするすることができるが、それを一時的に停止する機能
    - [RFC: Inert deployments #14516](https://github.com/kubernetes/kubernetes/issues/14516)
- **ReplicaSet**が追加された
    - 名前がわかりづらいと言われている"Replication Controller"のrename準備？
    -  [Create ReplicaSet #3024](https://github.com/kubernetes/kubernetes/issues/3024)
    -  [Introducing ReplicaSet, a new incarnation of Replication Controller. #19042](https://github.com/kubernetes/kubernetes/pull/19042)
- **Ingress**のBasic TLSサポート
    - https://github.com/kubernetes/kubernetes/pull/20142
- GCEの**Ubernetes Lite**をサポート
    - Ubernetesは複数のプロバイダ、複数リージョンのクラスタを連携させる機能として提案されている
    - Ubernetes Liteは同一プロバイダの複数のAvailability Zoneだけをサポートする軽量版
        - 詳細はProposalの[Kubernetes Multi-AZ Clusters](https://github.com/kubernetes/kubernetes/blob/master/docs/proposals/federation-lite.md)を参照
    - [Ubernetes Lite support for GCE #17919](https://github.com/kubernetes/kubernetes/pull/17919)
- **Scheduler**のパフォーマンス改善 :tada:
    - CoreOSがblogで紹介していたスケジューラ改善がいくつか取り込まれている模様
        - CoreOS Blog: [Improving Kubernetes Scheduler Performance](https://coreos.com/blog/improving-kubernetes-scheduler-performance.html)
    - [scheduler: using inefficient math library causes significant slowdown #18126](https://github.com/kubernetes/kubernetes/issues/18126)
    - [scheduler: inefficient cache operation slows down scheduler #18255](https://github.com/kubernetes/kubernetes/issues/18255)
- **Scheduler**に**Node Affinity**という機能が追加(alpha) :tada:  
    - NodeSelectorに代わる、Podが動作するNodeを選択する機能(affinity=相性)
        - 最終的にはNodeSelectorはdeprecatedにするとのこと
    - デフォルトで以下のNodeラベルを用意しているのも気が利いている
        - `kubernetes.io/hostname`
        - `failure-domain.beta.kubernetes.io/zone`
        - `failure-domain.beta.kubernetes.io/region`
        - `beta.kubernetes.io/instance-type`
    - Designドキュメント [Node affinity and NodeSelector
](https://github.com/kubernetes/kubernetes/blob/master/docs/design/nodeaffinity.md)
    - [Update user guide and scheduler documentation to describe node affinity #21235](https://github.com/kubernetes/kubernetes/pull/21235)
    - Pod Affinityという機能も提案されている
        - PodのAnti-affinityを使えばPodをAvailability ZoneやNodeで分散させることができるようになる模様 :tada:
        - Designドキュメント [Inter-pod topological affinity and anti-affinity
](https://github.com/kubernetes/kubernetes/blob/master/docs/design/podaffinity.md)
- 1000ノード対応？
    - [1.2: support 1000 node / 32000 core clusters #20834](https://github.com/kubernetes/kubernetes/issues/20834)
- **Probe**のliveness/readinessにいくつかのパラメータが追加された
    - [Add liveness/readiness probe parameters #15967](https://github.com/kubernetes/kubernetes/pull/15967)
        - ``PeriodSeconds`` probeの間隔
        - ``SuccessThreshold`` failureからsuccessになるまでの閾値
        - ``FailureThreshold`` failureになるまでの閾値
- **Node Metrics** APIのsummaryが実装
    - [Nodes Metrics API - Summary Impl #19932](https://github.com/kubernetes/kubernetes/pull/19932)
- **Scheduler Extender**の追加 :tada:
    - WebAPIでSchedulerを拡張できる機能
        - PodとNodeのリストが引数で渡されるイメージ
    - [Scheduler extension #13580](https://github.com/kubernetes/kubernetes/pull/13580)
    - Designドキュメント [Scheduler extender](https://github.com/kubernetes/kubernetes/blob/master/docs/design/scheduler_extender.md)
- **Horizontal Pod Autoscaler**(HPA)がGenerally Availableに?
    - [HorizontalPodAutoscaler API: requirements for graduation to GA #18528](https://github.com/kubernetes/kubernetes/issues/18528)
        - [HPA in GA step 2 #21577](https://github.com/kubernetes/kubernetes/issues/21577) 1.3でextenions/v1beta1から正式にv1になり
        - [HPA in GA step 3 #21578
](https://github.com/kubernetes/kubernetes/issues/21578) 1.4でextensions/v1beta1を削除の予定


### 認証関連(Sig-Auth)

- 認可のモードにWebhookが実装された :tada:
    - 独自の認可をWebAPIで実装できる
    - [plugin/pkg/auth: add webhook implementation of authorizer.Authorizer plugin #20347](https://github.com/kubernetes/kubernetes/pull/20347)
- Secretが環境変数にも設定できるようになった
    - 公式ドキュメント [Secrets#Using Secrets as Environment Variables](http://kubernetes.io/docs/user-guide/secrets/#using-secrets-as-environment-variables)
    - [Expose secrets to containers in environment variables #4710](https://github.com/kubernetes/kubernetes/issues/4710)



### kubectl関連

- ```kubectl create```
    - リソースをyaml/jsonなしにCLIで簡単につくれるようになる
    - namespace, secret, configmapに対応
        - 特にsecretはbase64で設定ファイルを書く必要があったので楽になりそう :tada:
        - 例 ```kubectl create secret generic prod-db-password --from-literal=user=produser --from-literal=password=Y4nys7f11```
- ```kubectl drain``` :tada:
    - Nodeのメンテナンスに向けてunschedulableにし、そのNodeのPodを削除する
    - [Mark node to be decommissioned and act accordingly #3885](https://github.com/kubernetes/kubernetes/issues/3885)
- ```kubectl cordon``` / ```kubectl uncordon```
    - Nodeをunschedulableにする
    - [Mark node to be decommissioned and act accordingly #3885](https://github.com/kubernetes/kubernetes/issues/3885)
- ```kubectl explain```
    - リソースのドキュメントを表示する
    - ```kubectl explain pods.spec``` といった形でリソースの形式の詳細が表示されるので便利そう
- ```kubectl convert```
    - 別バージョンのAPI間でconfigの変換をする
- ```kubectl rollout```
    - DeploymentとDaemonSetの管理をするためのもの
    - history, pause, resume, undoのサブコマンドを持つ
    - [Develop Deployment UX equivalent to kubectl rolling-update #17168](https://github.com/kubernetes/kubernetes/issues/17168)
- --recordオプションが各種サブコマンドに追加
    - deploymentのannotationsにkubectlで作った際のコマンドが記録されるようになった
        - ```kubectl rollout history```で見た時にわかりやすくなる
    - [Record kubectl commands (useful when viewing rollout history); copy deployment's annotations to its RC #20035](https://github.com/kubernetes/kubernetes/pull/20035)

## Kubernetes 1.3?

[3/3のKubernetes Community Meeting](https://youtu.be/ozpqRDrRtLE?t=2443)によると下記がGoogleが1.3でフォーカスするものとのこと

1. PetSets
  - レガシーアプリケーションのサポート
  - [Proposal for implementing nominal services AKA PetSets #18016](https://github.com/kubernetes/kubernetes/pull/18016)
2. Cluster Federation (Ubernetes)
  - 大きいので1.3でも全ては実装されなそう
3. Identity Managementとの統合
4. Cluster Auto Scaling
  - クラスタ自体のオートスケール
5. Scheduled Jobの改善