kubernetes

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

このエントリは、Kubernetes v1.8 CHANGELOG から主な変更点 (Major Themes) をまとめています。その他の項目は下記リンク先を参照してください。


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

SIG API Machinery

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

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

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

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

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

CustomResourceDefinition (CRD) API は、JSON scheme をベースとした CRD スペックによりカスタムオブジェクトのバリデーションをサポートした。これまで CRDs オブジェクトはスペックが提供されておらず、どのような構造のオブジェクトでも書き込みが成功していた。

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

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

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

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 への昇格を予定している。

SIG Auth

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

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

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

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

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

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

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

SIG Autoscaling

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

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

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

Cluster Autoscaler: [stable] GA に昇格

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

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 を参照。

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

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

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

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

SIG Instrumentation

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

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 パスに登録される。

SIG Multi-cluster (formerly known as SIG Federation)

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

SIG Node

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

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

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

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

SIG Network

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

NetworkPolicy: [beta] EgressRules をサポート

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

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

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

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

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

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

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

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

この機能を有効にするには、kube-proxy --feature-gatesSupportIPVSProxyMode=true を指定し、合わせて --proxy-modeipvs に設定する必要がある。

SIG Scalability

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

SIG Scheduling

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

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

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

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 にプライオリティが設定される。globalDefaulttrue に設定された PriorityClass オブジェクトが存在せず、priorityClassName が設定されていない Pod はプライオリティが 0 とみなされる。

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 に設定する必要がある。

[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 を有効にする必要がある。

SIG Storage

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

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

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

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

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

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

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

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

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

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

[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