Kubernetes v1.8: 主な変更点 (Major Themes)

このエントリは、[Kubernetes v1.8 CHANGELOG](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.8.md#v180) から主な変更点 (Major Themes) をまとめています。その他の項目は下記リンク先を参照してください。

- Kubernetes v1.8: 主な変更点 (Major Themes)
- [Kubernetes v1.8: Before Upgrading](https://qiita.com/tkusumi/items/0962220a0700cb1f6eb3)
- [Kubernetes v1.8: 既知の問題 (Known Issues)](https://qiita.com/superbrothers/items/fe1e878cc1eb6d9faa96)
- [Kubernetes v1.8: Deprecations](https://qiita.com/tkusumi/items/43fd62c1da931443943a)

---

Kubernetes は、分野ごとに [Special Interest Groups](https://github.com/kubernetes/community/blob/master/sig-list.md) (SIGs) として組織されたコミュニティメンバーによって開発されており、v1.8 の CHANGELOG から SIG 毎にそのバージョンで取り組んだ事柄がそれぞれ記載されるようになった。

## [SIG API Machinery](https://github.com/kubernetes/community/tree/master/sig-api-machinery)

リスト取得の小さなチャンクへの分解やカスタム API サーバや Custom Resource Definitions (CRDs) のサポートの改善、クライアントサイドでのイベントスパムフィルタリングなど。

### kube-apiserver: [alpha] リストページネーションの実装

これまでリストの取得は全件取得のみしかできず、とても大きなリストの取得には CPU、メモリを多く消費していたが、etcd3 からリストの取得にリミットを指定できるようになったため、apiserver はこの機能によりリストの取得をチャンクに分割し取得できるようになった。

この機能はアルファであるため有効にするためには、apiserver `--feature-gates` で `APIListChunking` を指定する必要がある。1.9 リリースでこの機能はデフォルトになる予定となっている。

- [Alpha list paging implementation by smarterclayton · Pull Request \#48921 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/48921)
- [Design for consistent API chunking in Kubernetes by smarterclayton · Pull Request \#896 · kubernetes/community](https://github.com/kubernetes/community/pull/896)

### CustomResourceDefinitions (CRDs): [alpha] JSON scheme によるオブジェクトのバリデーションをサポート

CustomResourceDefinition (CRD) API は、JSON scheme をベースとした CRD スペックにより[カスタムオブジェクト](https://kubernetes.io/docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions/#validation)のバリデーションをサポートした。これまで CRDs オブジェクトはスペックが提供されておらず、どのような構造のオブジェクトでも書き込みが成功していた。

この機能を有効にするには、apiserver `--feature-gates` で `CustomResourceValidation` を指定する必要がある。

- [apiextensions: validation for customresources by nikhita · Pull Request \#47263 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/47263)
- [Proposal: Validation for CustomResources\. by nikhita · Pull Request \#708 · kubernetes/community](https://github.com/kubernetes/community/pull/708)

### Go Client: クライアントサイドイベントスパムフィルタリングをサポート

クラスタ内コンポーネントからの apiserver への過剰なトラフィックを抑制するクライアントサイドイベントスパムフィルタリングが追加された。

- [Add client side event spam filtering by derekwaynecarr · Pull Request \#47367 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/47367)

## [SIG Apps](https://github.com/kubernetes/community/tree/master/sig-apps)

Workload API が apps/v1beta2 への昇格し、DaemonSet, Deployment, ReplicaSet, StatefulSet オブジェクトがこの変更により影響が受ける。

### Workload API (DaemonSet, Deployment, ReplicaSet, StatefulSet) が apps/v1beta2 へ昇格

Workload API が apps/v1beta2 に昇格した。この変更により DaemonSet, Deployment, ReplicaSet, StatefulSet オブジェクトが影響を受ける。apps/v1beta2 への移行に伴う主な変更は下記の通り。

- 全ての Workload API の `spec.revisionHistoryLimit` のデフォルト値が 10 に変更
- 全ての Workload API で `spec.selector` のデフォルティングの廃止
- StatefulSet、DaemonSet で `spec.updateStrategy` のデフォルトが OnDelete から RollingUpdate に変更
- CronJob で `spec.successfulJobsHistoryLimit` のデフォルトが 3、`spec.failedJobsHistoryLimit` が 1 に変更

Workload API は 1.9 で stable への昇格を予定している。

- [Move workload API objects to group version apps/v1beta2 · Issue \#49135 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/issues/49135)
- [Workload Controllers v1Beta2 · Issue \#353 · kubernetes/features](https://github.com/kubernetes/features/issues/353)
- [Workloads GA · Issue \#484 · kubernetes/features](https://github.com/kubernetes/features/issues/484)
- [remove apps/v1beta2 defaulting codes for obj\.Spec\.Selector and obj\.Labels by crimsonfaith91 · Pull Request \#50164 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/50164)

## [SIG Auth](https://github.com/kubernetes/community/tree/master/sig-auth)

RBAC の stable への昇格や Advanced auditing の beta への昇格、リソースの暗号化の外部鍵管理システムとの連携など。リソースの暗号化は 1.8 で beta に昇格する予定だったが、alpha のままとなった。

### RBAC: [stable] v1beta1 から v1 へ昇格

RBAC API グループが v1beta1 から v1 へ昇格した。API の変更は含まれていない。

- [Role\-based access control \(RBAC\) · Issue \#2 · kubernetes/features](https://github.com/kubernetes/features/issues/2)

### Advanced auditing: [beta] alpha から beta へ昇格

Advanced auditing が alpha から beta に昇格した。alpha から後方互換性のない変更が入ったため、修正が必要かもしれないことに注意。

- [Advanced Auditing Beta Changes · Issue \#48561 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/issues/48561)
- [Audit Logging for k8s · Issue \#22 · kubernetes/features](https://github.com/kubernetes/features/issues/22)

### Encrypting data: [alpha] シークレットなどのリソースの暗号化は、外部の鍵管理システム(KMS)に暗号化鍵を格納する仕組みをサポート

1.7 で提供されたシークレットなどのリソースの暗号化で外部の鍵管理システム (KMS) に暗号化キーを保存する仕組みが入った。これはもともとのファイルベースのストレージを補い、複数の KMS と連携できるようになる。Google Cloud KMS プラグインが追加され、Google 側の連携が完了すれば利用できるようになる。

- [Add Google cloud KMS service for envelope encryption transformer by sakshamsharma · Pull Request \#48574 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/48574)

## [SIG Autoscaling](https://github.com/kubernetes/community/tree/master/sig-autoscaling)

Horizontal Pod Autoscaler (HPA) のカスタムメトリクスのサポート、Cluster Autoscaler のパフォーマンス改善やエラーレポートなど。

### Horizontal Pod Autoscaler: [beta] カスタムメトリクスによるスケールをサポート

Horizontal Pod Autoscaler でカスタムメトリクスがサポートされて v1beta1 に昇格した。また関連する metrics APIs (カスタムメトリクスと resource/master メトリクスの提供) も合わせて v1beta1 に昇格した。

- [Proposal: Horizontal Pod Autoscaler Version 2 by DirectXMan12 · Pull Request \#120 · kubernetes/community](https://github.com/kubernetes/community/pull/120)
- [Switch references in HPA docs from alpha to beta by DirectXMan12 · Pull Request \#5671 · kubernetes/kubernetes\.github\.io](https://github.com/kubernetes/kubernetes.github.io/pull/5671)

### Cluster Autoscaler: [stable] GA に昇格

Cluster Autoscaler で下記の改善が行われ、GA に昇格した。詳しくはリリースページを参照。

- [Release Cluster Autoscaler 1\.0\.0 · kubernetes/autoscaler](https://github.com/kubernetes/autoscaler/releases/tag/cluster-autoscaler-1.0.0)

## [SIG Cluster Lifecycle](https://github.com/kubernetes/community/tree/master/sig-cluster-lifecycle)

kubeadm のクラスタの更新コマンドのサポートと alpha として self-hosted コントロールプレーンの作成をサポート。

### kubeadm: [alpha] kubeadm init が self-hosted クラスタの作成をサポート

`kubeadm init` での self-hosted クラスタの作成がサポートされた。self-hosted クラスタというのは Kubernetes クラスタの内部コンポーネントをそのクラスタ自身で管理することをいっている。より self-hosted クラスタのより詳しい情報は [kubernetes/community#206](https://github.com/kubernetes/community/pull/206) を参照。

これまで kubeadm で構築されるクラスタは Static Pod を利用していたが、self-hosted ではそのクラスタ内で DaemonSet によりデプロイされる。また1.8 時点ではコントロールプレーンのコンポーネント (apiserver, controller manager, scheduler) のみの self-hosted 化をサポートしている。

この機能を有効にするには、`kubeadm init` に `--feature-gates=SelfHosting=true` を設定し実行する必要がある。コントロールプレーンの self-hosted 化は次のリリース 1.9 でデフォルトになる予定になっている。

- [Self\-hosting support in kubeadm · Issue \#415 · kubernetes/features](https://github.com/kubernetes/features/issues/415)
- [Update docs/admin/kubeadm\.md to cover self\-hosting in 1\.8\. by mattmoyer · Pull Request \#5497 · kubernetes/kubernetes\.github\.io](https://github.com/kubernetes/kubernetes.github.io/pull/5497)

### kubeadm: [beta] クラスタのアップグレードを行う `upgrade` サブコマンドが追加

新たに upgrade サブコマンドが追加された。このコマンドによって Static Pod, self-hosted 双方のクラスタのアップグレードを行うことができる。

- [Easy, automated upgrades with the \`kubeadm upgrade\` command · Issue \#296 · kubernetes/features](https://github.com/kubernetes/features/issues/296)
- [kubeadm upgrades design proposal \- Google ドキュメント](https://docs.google.com/document/d/1PRrC2tvB-p7sotIA5rnHy5WAOGdJJOIXPPv23hUFGrY/edit#heading=h.bh2yxci0holi)
- [Add \`kubeadm upgrade\` docs by mhausenblas · Pull Request \#4770 · kubernetes/kubernetes\.github\.io](https://github.com/kubernetes/kubernetes.github.io/pull/4770)
- [kubeadm: Add 'kubeadm upgrade plan' and 'kubeadm upgrade apply' CLI commands by luxas · Pull Request \#50872 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/50872)
- [Implement the \`kubeadm upgrade\` command by luxas · Pull Request \#48899 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/48899)

## [SIG Instrumentation](https://github.com/kubernetes/community/tree/master/sig-instrumentation)

Heapster に代わる metrics-server の提供など。

[SIG Instrumentation]: https://github.com/kubernetes/community/tree/master/sig-instrumentation

### metrics-server を resource metrics API を提供する方法として推奨

metrics-server が新たにリソースメトリクス API を提供する方法として推奨されるようになった。metrics-server はこれまで Heapster をデプロイしていたのと同様にアドオンとしてデプロイする必要がある。これまで `kubectl top` や Horizontal Pod Autoscaler (HPA) などのコントローラは Heapster の提供するメトリクスを利用していた。

metrics-server は extended-apiserver として実装されており、`/apis/metrics.k8s.io` パスに登録される。

- [kubernetes\-incubator/metrics\-server](https://github.com/kubernetes-incubator/metrics-server)
- [Metrics Server \(for resource metrics API\) · Issue \#271 · kubernetes/features](https://github.com/kubernetes/features/issues/271)
- [Added documentation for Metrics Server by piosz · Pull Request \#5560 · kubernetes/kubernetes\.github\.io](https://github.com/kubernetes/kubernetes.github.io/pull/5560)

## [SIG Multi-cluster (formerly known as SIG Federation)](https://github.com/kubernetes/community/tree/master/sig-federation)

Federation の stable リリース (GA) に向けての準備など。

## [SIG Node](https://github.com/kubernetes/community/tree/master/sig-node)

ベンダー固有のコードを Kubelet に追加することなくハードウェアを利用できるようにする Device Plugin などの提供。

### [alpha] Kubelet を拡張する Device Plugin のサポート

ベンダー固有のコードを Kubelet に追加することなく特定のハードウェアを利用できるようにする Device Plugin がサポートされた。ユースケースとしてベンダー固有の初期化やセットアップを必要とする GPUs やハイパフォーマンス NIC、FPGAs、InfiniBand、ストレージデバイスやそれらのようなコンピューティングリソースなどの利用が想定されている。これらの検出とコンテナからの利用、ヘルスチェックなどがこれにより提供される。

v1.8 では Nvidia GPUs のみがテストされている。またこの機能を有効にするには、kubelet `--feature-gates` で `DevicePlugins` を指定し、Device Plugin 実装をクラスタにデプロイしておく必要がある。

- [Extension to support new compute resources · Issue \#368 · kubernetes/features](https://github.com/kubernetes/features/issues/368)
- [Deviceplugin jiayingz by jiayingz · Pull Request \#51209 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/51209)
- [Device Plugins \- Kubernetes](https://kubernetes.io/docs/concepts/cluster-administration/device-plugins/)
- [container\-engine\-accelerators/cmd/nvidia\_gpu at master · GoogleCloudPlatform/container\-engine\-accelerators](https://github.com/GoogleCloudPlatform/container-engine-accelerators/tree/master/cmd/nvidia_gpu)

## [SIG Network](https://github.com/kubernetes/community/tree/master/sig-network)

NetworkPolicy API のアウトバウンドトラフィックポリシーのサポートや CIDR に基づくポリシーの適用など。現在の iptables とユーザランドのモードに加えて alpha として IPVS モードが kube-proxy に追加された。

### NetworkPolicy: [beta] EgressRules をサポート

従来の Ingress トラフィック(インバウンド）に加えて Egress トラフィック(アウトバウンド）が NetworkPolicy API でサポートされた。

```yaml
  egress:
  - to:
    - podSelector:
        matchLabels:
          role: backend
    ports:
    - protocol: TCP
      port: 5978
```

NetworkPolicy API を利用するには、それに対応した Weave Net や Calico のような Pod Network アドオンを利用している必要がある。

- [Add EgressRule to NetworkPolicy by cmluciano · Pull Request \#51351 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/51351)

### NetworkPolicy: [beta] CIDR に基づくポリシーの適用をサポート

従来の `namespaceSelector`, `podSelector` に加えて CIDR に基づくポリシーを適用する `ipBlock` がサポートされた。`ipBlock` で指定した CIDR の範囲外のトラフィックが除外される。

```yaml
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      port: 5978
```

- [Add IPBlock to Network Policy by cmluciano · Pull Request \#50033 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/50033)
- [update network\-policy by adding egress and ipBlock usage by Lion\-Wei · Pull Request \#5473 · kubernetes/kubernetes\.github\.io](https://github.com/kubernetes/kubernetes.github.io/pull/5473#issuecomment-331616722)

### kube-proxy: [alpha] ipvs モードをサポート

従来の `userspace`, `iptables` に加えて、IPVS を利用する `ipvs` モードがサポートされた。現在の iptables によるアプローチは、Huawei において 50000 を超える services を利用した際にパフォーマンスに問題があったとされ、IPVS によるアプローチが提案されていた。iptables は本来ファイアウォール向けに設計されたものであるため、ロードバランシング向けにおいては IPVS はより高度な機能を備えパフォーマンスが優れている。

この機能を有効にするには、kube-proxy `--feature-gates` で `SupportIPVSProxyMode=true` を指定し、合わせて `--proxy-mode` を `ipvs` に設定する必要がある。

- [Implement IPVS\-based in\-cluster service load balancing · Issue \#265 · kubernetes/features](https://github.com/kubernetes/features/issues/265)
- [Implement IPVS\-based in\-cluster service load balancing by dujun1990 · Pull Request \#46580 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/46580)
- [add proxy\-mode:ipvs in service\.md by Lion\-Wei · Pull Request \#5571 · kubernetes/kubernetes\.github\.io](https://github.com/kubernetes/kubernetes.github.io/pull/5571)

## [SIG Scalability](https://github.com/kubernetes/community/tree/master/sig-scalability)

継続的インテグレーション環境による継続的なスケーラビリティテストの自動化や現在のスケーラビリティ限界点についてのドキュメントの作成、SLIs (Service Level Indicators)、SLOs (Service Level Objectives) の策定など。

- [scalability validation report](https://github.com/kubernetes/features/tree/master/release-1.8/scalability_validation_report.md)

## [SIG Scheduling](https://github.com/kubernetes/community/tree/master/sig-scheduling)

さまざまなワークロードを混在できるようにし、またより高いレベルのリソース使用率と可用性を実現する Pod Priority と Pod Preemption をサポート。

### [alpha] PriorityClasses と Pod Priority のサポート

プライオリティを数値で定義する non-namespaced リソースの PriorityClasses が新たに追加された。このリソースは名前とプライオリティの数値で構成される。

```yaml
apiVersion: v1
kind: PriorityClass
metadata:
  name: high-priority
value: 1000000
globalDefault: false
description: "This priority class should be used for XYZ service pods only."
```

合わせて Pod Priority がサポートされた。Pod `.spec.priorityClassName` に PriorityClass オブジェクト名を設定することで Pod にプライオリティが設定される。`globalDefault` が `true` に設定された PriorityClass オブジェクトが存在せず、priorityClassName が設定されていない Pod はプライオリティが 0 とみなされる。

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  priorityClassName: high-priority
```

この機能を有効にするには、kube-apiserver `--feature-gates=PodPriority=true` を指定し、合わせて `--runtime-config=scheduling.k8s.io/v1alpha1=true` に設定する必要がある。

- [Add Priority to Kubernetes API by bsalamat · Pull Request \#45610 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/45610)
- [Add Priority admission controller by bsalamat · Pull Request \#49322 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/49322)
- [Add user docs for pod priority and preemption by bsalamat · Pull Request \#5328 · kubernetes/kubernetes\.github\.io](https://github.com/kubernetes/kubernetes.github.io/pull/5328)

### [alpha] Pod Priority に基づく Preemption のサポート

Pod Priority に基づく Preemption (先取り、差し替え) がスケジューラでサポートされた。Pod P を作成するとノードのアサインがスケジュールされる。もし、その Pod P をスケジュールできるノードが見つからないと、スケジュールが保留された Pod P に対して Preeption ロジックが開始され、Pod P よりプライオリティが低い一つ以上の Pods を削除して Pod P をスケジュールできるノードを探す。もしそのようなノードが見つかればプライオリティの低い Pods を削除し、 Pod P がそのノードにスケジュールされる。この機能は Borg のリソース効率のよいスケジュール機能としてよく紹介されているものの Kubernetes 実装のようだ。

この機能を有効にするには、PodPriority を有効にする必要がある。

- [Add pod preemption to the scheduler by bsalamat · Pull Request \#50949 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/50949)
- [Add user docs for pod priority and preemption by bsalamat · Pull Request \#5328 · kubernetes/kubernetes\.github\.io](https://github.com/kubernetes/kubernetes.github.io/pull/5328)

## [SIG Storage](https://github.com/kubernetes/community/tree/master/sig-storage)

ボリュームのリサイズやスナップショット、マウントオプションの指定やメトリクスの拡充など。

### PersistentVolume: [alpha] ボリュームのリサイズのサポート

PersistentVolume のボリュームサイズのリサイズがサポートされた。alpha においてはファイルシステムのリサイズを伴わないボリュームタイプのみをサポートしている。（現在は GlusterFS のみ）ボリュームのリサイズをサポートしている StorageClass から作成された PersistentVolumeClaim のボリュームサイズを編集することでボリュームのリサイズを行うことができる。ボリュームのリサイズによって新しい PersistentVolume が作成されることはない。

この機能を有効にするには、kube-apiserver `--feature-gates=ExpandPersistentVolumes=true` を設定し、合わせて `PersistentVolumeClaimResize` アドミッションプラグインを有効にする必要がある。

1.9 で beta, 1.10 で stable への昇格を予定している。

- [Add support for resizing PVs · Issue \#284 · kubernetes/features](https://github.com/kubernetes/features/issues/284)
- [Proposal for growing persistent volumes by gnufied · Pull Request \#657 · kubernetes/community](https://github.com/kubernetes/community/pull/657)
- [Implement Controller for growing persistent volumes by gnufied · Pull Request \#49727 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/49727)
- [Add docs for implementing resize by gnufied · Pull Request \#5528 · kubernetes/kubernetes\.github\.io](https://github.com/kubernetes/kubernetes.github.io/pull/5528)
- [Using Admission Controllers \- Kubernetes](https://kubernetes.io/docs/admin/admission-controllers/#persistentvolumeclaimresize)

### PersistentVolume: [alpha] スナップショットのサポート

スナップショットの作成、リスト、削除、リストアがサポートされた。現在はプロトタイプであるため、バージョンの変更により以前のスナップショットのリストアが保証されていないため注意が必要。

1.9 で beta, 1.10 で stable への昇格を予定している。

- [Storage Volume Snapshots · Issue \#177 · kubernetes/features](https://github.com/kubernetes/features/issues/177)
- [Add volume snapshots feature by tsmetana · Pull Request \#331 · kubernetes\-incubator/external\-storage](https://github.com/kubernetes-incubator/external-storage/pull/331)

### PersistentVolume: [stable] マウントオプションが beta から stable に昇格

マウントオプションが beta から stable に昇格した。それに合わせて PersistentVolume に `mountOptions` フィールドが追加された。これはアノテーションによる指定を置き換える。また同様に StorageClass に `mountOptions` フィールドが追加された。

- [Proposal for taking mount option to GA by gnufied · Pull Request \#771 · kubernetes/community](https://github.com/kubernetes/community/pull/771)
- [Take mount options to GA by adding PV\.spec\.mountOptions by wongma7 · Pull Request \#50919 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/50919)
- [Support Volume Mount Options · Issue \#168 · kubernetes/features](https://github.com/kubernetes/features/issues/168)

### [stable] ボリュームの利用に関するメトリクスのサポート

さまざまなボリューム操作に関する高レベルなメトリクスがサポートされた。これは個々のボリュームタイプに依存しない形で PersistentVolume Controller (kube-controller-manager) に実装されている。Prometheus Metrics Format で出力されており、具体的に提供されるメトリクスは以下の通り。

| Name                                 | Help                         | Type      | Labels                            |
|--------------------------------------|------------------------------|-----------|-----------------------------------|
| `storage_operation_duration_seconds` | `Storage operation duration` | Histogram | `volume_plugin`, `operation_name` |
| `storage_operation_errors_total`     | `Storage operation errors`   | Histogram | `volume_plugin`, `operation_name` |

- [Add support for high level volume operation metrics · Issue \#349 · kubernetes/features](https://github.com/kubernetes/features/issues/349)
- [Add a proposal for high level volume metrics by gnufied · Pull Request \#809 · kubernetes/community](https://github.com/kubernetes/community/pull/809)
- [Add volume operation metrics to operation executor and PV controller by wongma7 · Pull Request \#50036 · kubernetes/kubernetes](https://github.com/kubernetes/kubernetes/pull/50036)