Kubernetes Operator で実現する NoOps の世界 / How we accomplish NoOps by Kubernetes Operator.

Kubernetes Operator で実現する NoOps の世界 / How we accomplish NoOps by Kubernetes Operator.

OpenStack Days Tokyo, Cloud Native Days Tokyo 2018 / August 3, 2018

6ee833afddca37209631fb25a0cec547?s=128

Shunya Murata

August 03, 2018
Tweet

Transcript

  1. Kubernetes Operatorで実現する NoOps の世界 OpenStack Days Tokyo, Cloud Native Days

    Tokyo 2018 / August 3, 2018 Shunya Murata <shmurata@zlab.co.jp> @shmurata_ Kazuki Suda <ksuda@zlab.co.jp> @superbrothers
  2. ▶ アジェンダ 1. NoOps とは 2. Kubernetes Operator とは 3.

    etcd-operator 4. ゼロから作る Kubernetes Operator 5. Kubernetes Operator 開発の新時代 6. Yahoo! JAPAN の Kubernetes Cluster Operator 7. まとめ 2
  3. Shunya Murata / @shmurata_ ▶ ゼットラボ株式会社 ソフトウェアエンジニア ▶ 2010年にヤフー株式会社に新卒⼊社、2015年ゼットラボ株式会社に出向 3

  4. ゼットラボ株式会社 / Z Lab Corporation ▶ 2015年に設⽴されたヤフー株式会社の100%⼦会社 ▶ インフラ基盤技術の調査・研究開発 ▶

    ヤフー株式会社向けの Kubernetes-as-a-Service の開発 ▶ https://zlab.co.jp/ 4
  5. NoOps システムに⾃律運⽤能⼒をもたせて⼈間による運⽤を最⼩化する

  6. ▶ NoOps ▶ システムに⾃律運⽤能⼒をもたせることで⼈間による運⽤を最⼩化すること ▶ 注意事項 + 運⽤者が必要なくなるわけではない + ブラックボックス化しないようにするためにもシステムが⾏っている運⽤作業を把握し

    て、最悪⼿動運⽤できる能⼒を持った⼈は必要 6 https://www.slideshare.net/hiromasaoka/noops-88082246
  7. ▶ なぜ NoOps に ▶ 継続的に頻繁なサービスの改善を⾏える環境を作りたい + 今のビジネスではサービスの改善のスピードが求められている ▶ オペレーションミスの防⽌

    + ⼈間がオペレーションすると必ずミスする ▶ NoOps を実現できる環境が揃ってきた + infrastructure as code, immutable infrastructure 7
  8. ▶ NoOps に必要なこと ▶ Self Healing + 故障発⽣時のサービス無影響+⾃⼰修復能⼒ ▶ In-flight

    Renewing + 変更・更新に対する無停⽌メンテナンス能⼒ ▶ Adaptive Scale + 負荷変動に弾⼒的に適応する⾃律的なリソース調整能⼒ 8
  9. ▶ Kubernetes ▶ Kubernetes は NoOps に必要なことを満たしている + Self Healing

    + Declaraticve Configuration + Liveness/Readiness Probe + In-Flight Renewing + Rolling Update + Adaptive Scale + HorizontalPodAutoscaler + ClusterAutoscaler 9
  10. Node A Pod ▶ Self Healing ▶ Declarative Configuration +

    desired state/actual state ▶ Liveness/Readiness Probe + Health Checks ▶ Podのセルフヒーリング + Nodeに障害が発⽣するとPod をサービスアウトして削除 + 不⾜するとPodを⾃動的に追加 10 Kubernetes コントローラ 障害検知 Node B Pod Pod Service 削除 追加
  11. ▶ In-Flight Renewing ▶ Rolling Update + 新しいバージョンのPodの追加と古いバージョンのPodを削除を繰り返すこと で無停⽌で更新 11

    Kubernetes コントローラ Node Pod v1 Node Node Pod v1 Pod v1 Pod v2 ࡟আ ௥Ճ
  12. ▶ Adaptive Scale 1. HorizontalPodAutoscaler + メトリクスの変動によって⾃動的にPodを⽔平スケール 2. ClusterAutoscaler +

    リソースの枯渇や余剰が発⽣したら⾃動的にNodeを⽔平スケール 12 Kubernetes コントローラ Node Pod Node Node Pod Podの追加 Pod Nodeの追加 Pod
  13. ▶ すべてのアプリケーションがKubernetesで動かせるわけではない ▶ ステートフルアプリケーションなどまだ難しいアプリケーションもある + アプリケーション固有の初期化 + Pod毎に異なる設定 + ローカルディスクにデータを持つアプリケーション

    13
  14. Kubernetes Operator Kubernetes の拡張機能を活⽤しアプリケーション固有の
 運⽤ナレッジをソフトウェアとしてプログラムする

  15. ▶ ステートレスとステートフル 15 ステートレス ステートフル

  16. ▶ ステートレスアプリケーション 16 ▶ アプリケーションが状態を持たない ▶ HTTP サーバやアプリケーションサーバ 
 (12

    Factor App) など ▶ 障害復旧やスケールにアプリケーション 固有の運⽤ナレッジが必要ない ステートレス
  17. ▶ Kubernetes でのステートレスアプリケーション 17 ステートレス + ▶ 基本的な Deployments などのビルトインの

    オブジェクトを利⽤すればいい ▶ 問題があったら基本的にインスタンスを
 削除するだけでいい ▶ 適切な設定を⾏えば基本的な
 オペレーションはほぼ不要 + livenessProbe, readinessProbe, etc
  18. ステートフル ▶ ステートフルアプリケーション 18 ▶ アプリケーションが状態を持つ ▶ 分散システムやデータベースなど ▶ 障害復旧やスケールに


    アプリケーション固有の運⽤ナレッジが必要
  19. ステートフル ▶ Kubernetes でのステートフルアプリケーション 19 ▶ v1.5.0 からステートフルを扱う
 StatefulSets が提供された

    (GA v1.9.0) ▶ Pod を 0-N の順序をつけて命名し、
 特定のPod とストレージを紐づけられる ▶ しかしこの機能だけでは⼗分ではない +
  20. ▶ Kubernetes でのステートフルアプリケーション運⽤の難しさ 20 ステートフル + ▶ アプリケーション固有の障害復旧やス ケールなどの運⽤ナレッジをどのように 適応するか

    ▶ データ消失や使⽤不能な状態になること を防ぎながら、スケール、アップグレー ド、設定変更などを実施する必要がある
  21. ▶ Kubernetes Operator ▶ Kubernetes のユーザに変わって複雑なステートフルアプリケーションのインス タンスを作成、スケール、アップグレード、設定変更などを⾏うコントローラ ▶ 基本的な Kubernetes

    のリソースとコントローラの概念をもとにして、 Kubernetes の拡張機能を活⽤しアプリケーション固有の運⽤ナレッジをソフト ウェアとしてプログラムする 21 An Operator represents human operational knowledge in software to reliably manage an application. https://coreos.com/operators/
  22. ▶ SRE: ソフトウェアを書くことでアプリケーションを運⽤に⾃動化をもたらすロール 22 “したがってSREは、これまで運⽤チーム が⾏ってきたことをソフトウェアの専⾨ 性を持つエンジニアが⾏い、エンジニア が⼈⼿による管理を⾃動化するソフト ウェアを設計し実装する能⼒を持ち、そ れをいとわないということから成り⽴っ

    ています。” https://www.oreilly.co.jp/books/9784873117911/
  23. ▶ Kubernetes Operators in the Wild ▶ coreos/etcd-operator + Create/configure/manage

    etcd clusters atop Kubernetes ▶ coreos/prometheus-operator + Create/configure/manage Prometheus clusters atop Kubernetes ▶ rook/rook + Storage Orchestration for Kubernetes / Ceph / CockroachDB ▶ oracle/mysql-operator + Create, operate and scale self-healing MySQL clusters in Kubernetes ▶ kubeflow/tf-operator + Tools for ML/Tensorflow on Kubernetes ▶ nats-io/nats-operator + Manage NATS clusters atop Kubernetes, automating their creation and administration 23 https://github.com/operator-framework/awesome-operators
  24. etcd-operator Create/configure/manage etcd clusters atop Kubernetes

  25. ▶ etcd ▶ CoreOS, Inc. が開発するCP 型の分散キーバリューストア + Kubernetes の唯⼀のデータストアとしても利⽤されている

    ▶ 分散システムである etcd クラスタの運⽤には固有のナレッジが必要になる + ブートストラッピング + Quorum の維持 + クラスタメンバーの再構成 + バックアップ + ディザスタリカバリ + 致命的なイベントの監視 25
  26. ▶ etcd-operator ▶ CoreOS が開発する etcd クラスタの作成/設定/管理を⾏う Kubernetes Operator ▶

    etcd クラスタ固有の運⽤ナレッジがプログラムされている + 作成と廃棄: クラスタサイズを指定するだけ + リサイズ: クラスタサイズを変更するだけ + バックアップ: ⾃動的かつ透過的に実⾏ + アップグレード: ゼロダウンタイムアップグレード 26 https://coreos.com/blog/introducing-the-etcd-operator.html
  27. # Clone etcd-operator repository and change working directory $ git

    clone https://github.com/coreos/etcd-operator && cd etcd-operator # Deploy etcd-operator $ kubectl create -f example/deployment.yaml deployment.extensions/etcd-operator created ▶ etcd-operator のデプロイ 27
  28. $ cat example/example-etcd-cluster.yaml apiVersion: etcd.database.coreos.com/v1beta2 kind: EtcdCluster metadata: name: example-etcd-cluster

    spec: size: 3 version: 3.2.13 # Create an etcd cluster $ kubectl create -f example/example-etcd-cluster.yaml etcdcluster.etcd.database.coreos.com/example-etcd-cluster created # A 3 member etcd cluster is created $ kubectl get pods -l app=etcd NAME READY STATUS RESTARTS AGE example-etcd-cluster-7pdh8hv22s 1/1 Running 0 3m example-etcd-cluster-jqwm8cbgwp 1/1 Running 0 4m example-etcd-cluster-tg9q8bzjk6 1/1 Running 0 4m ▶ etcd クラスタの作成 28
  29. # Modify the manifest file and change size from 3

    to 5 $ cat example/example-etcd-cluster.yaml apiVersion: etcd.database.coreos.com/v1beta2 kind: EtcdCluster metadata: name: example-etcd-cluster spec: size: 5 # <- change size from 3 to 5 version: 3.2.13 # Apply the size change $ kubectl apply -f example/example-etcd-cluster.yaml etcdcluster.etcd.database.coreos.com/example-etcd-cluster configured # The etcd cluster will scale to 5 members (5 pods) $ kubectl get pods -l app=etcd NAME READY STATUS RESTARTS AGE example-etcd-cluster-7pdh8hv22s 1/1 Running 0 10m example-etcd-cluster-bttw5sxrp2 1/1 Running 0 1m example-etcd-cluster-jqwm8cbgwp 1/1 Running 0 11m example-etcd-cluster-tg9q8bzjk6 1/1 Running 0 11m example-etcd-cluster-vmzhpjlkvm 1/1 Running 0 51s ▶ etcd クラスタのリサイズ (3 → 5) 29
  30. ゼロから作る Kubernetes Operator CustomResourceDefinitions, client-go, code-generator

  31. ▶ ゼロから作る Kubernetes Operator ▶ カスタムリソースを定義する + CustomResourceDefinitions ▶ カスタムコントローラを実装する

    + k8s.io/client-go: Kubernetes Go クライアント + k8s.io/code-generator: カスタムクライアントの⽣成 31
  32. ▶ カスタムリソースを定義する: CustomResourceDefinitions (CRD) ▶ Kubernetes API に
 任意のカスタムリソースを追加 +

    API エンドポイント + CRUD オペレーション + Watch API ▶ オブジェクトの検証 + OpenAPI v3 schema 32 apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: etcdclusters.etcd.database.coreos.com spec: group: etcd.database.coreos.com names: kind: EtcdCluster listKind: EtcdClusterList plural: etcdclusters shortNames: - etcd singular: etcdcluster scope: Namespaced version: v1beta2 versions: - name: v1beta2 served: true storage: true
  33. ▶ Kubernetes API に
 任意のカスタムリソースを追加 + API エンドポイント + CRUD

    オペレーション + Watch API ▶ オブジェクトの検証 + OpenAPI v3 schema ▶ Kubernetes API を拡張する: CustomResourceDefinitions (CRD) 33 apiVersion: etcd.database.coreos.com/v1beta2 kind: EtcdCluster metadata: name: example-etcd-cluster spec: size: 5 version: 3.2.13
  34. ▶ Kubernetes API を拡張する: CustomResourceDefinitions (CRD) 34 GROUP VERSION KIND

    NAMESPACE NAME # replicasets.apps resource https://MASTER_URL/apis/apps /v1 /namespaces/default/replicasets /my-rs # etcdclusters.etcd.database.coreos.com resource https://MASTER_URL/apis/etcd.database.coreos.com/v1beta2/namespaces/default/etcdclusters/example-etcd-cluster
  35. ▶ カスタムコントローラの実装: クライアントライブラリ、コード⽣成 ▶ k8s.io/client-go + コントローラを実装するためのさまざまな機構が含まれている ▶ k8s.io/code-generator +

    カスタムリソース⽤のクライアントコードを⽣成する 35
  36. ▶ コントローラは現在の状態を望ましい状態に近づける ▶ reconciliation loop / 調整ループ ▶ カスタムコントローラの実装: k8s.io/client-go

    36 client-go コンポーネント カスタムコントローラコンポーネント (ビジネスロジック) Controller Informer kube-apiserver リソースのリストとウォッチ Callbacks OnAdd OnUpdate OnDelete workqueue Workers clientset CRUD Indexer
  37. ▶ カスタムコントローラの実装: k8s.io/code-generator 37 ▶ client-go は Kubernetes のビルトインリソース (e.g.

    Pods) を扱えるが、カスタム リソースは当然扱えない ▶ code-generator は、定義したカスタムリソースの Go 構造体から client-go で カスタムリソースを扱うためのいくつかのコードを⽣成 // +genclient // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object type EtcdCluster struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` Spec ClusterSpec `json:"spec"` Status ClusterStatus `json:"status"` } type ClusterSpec struct { // Size is the expected size of the etcd cluster. // The etcd-operator will eventually make the size of the running // cluster equal to the expected size. // The vaild range of the size is from 1 to 7. Size int `json:"size"` // Repository is the name of the repository that hosts // etcd container images. It should be direct clone of the repository in official // release: // https://github.com/coreos/etcd/releases // That means, it should have exact same tags and the same meaning for the tags. https://github.com/coreos/etcd-operator/blob/v0.9.2/pkg/apis/etcd/v1beta2/cluster.go
  38. ▶ カスタムコントローラの実装: k8s.io/code-generator 38 ▶ deepcopy-gen: type T 毎に func

    (t *T) DeepCopy() *T メソッドの作成 ▶ client-gen: カスタムリソース API グループのクライアントの作成 ▶ informer-gen: APIサーバ上のカスタムリソースの変更に対応するための informers の作成 ▶ lister-gen: カスタムリソースの listers の作成 $ vendor/k8s.io/code-generator/generate-groups.sh all \ github.com/coreos/etcd-operator/pkg/generated \ github.com/coreos/etcd-operator/pkg/apis \ etcd:v1beta2 Generating deepcopy funcs Generating clientset for etcd:v1beta2 at github.com/coreos/etcd-operator/pkg/generated/clientset Generating listers for etcd:v1beta2 at github.com/coreos/etcd-operator/pkg/generated/listers Generating informers for etcd:v1beta2 at github.com/coreos/etcd-operator/pkg/generated/informers
  39. ▶ カスタムコントローラの実装: k8s.io/code-generator 39 $ tree pkg/generated pkg/generated ├── clientset

    │ └── versioned │ ├── clientset.go │ ├── doc.go │ ├── fake │ │ ├── clientset_generated.go │ │ ├── doc.go │ │ └── register.go │ ├── scheme │ │ ├── doc.go │ │ └── register.go │ └── typed │ └── etcd │ └── v1beta2 │ ├── doc.go │ ├── etcd_client.go │ ├── etcdbackup.go │ ├── etcdcluster.go │ ├── etcdrestore.go │ ├── fake │ │ ├── doc.go │ │ ├── fake_etcd_client.go │ │ ├── fake_etcdbackup.go │ │ ├── fake_etcdcluster.go │ │ └── fake_etcdrestore.go │ └── generated_expansion.go ├── informers │ └── externalversions │ ├── etcd │ │ ├── interface.go │ │ └── v1beta2 │ │ ├── etcdbackup.go │ │ ├── etcdcluster.go │ │ ├── etcdrestore.go │ │ └── interface.go │ ├── factory.go │ ├── generic.go │ └── internalinterfaces │ └── factory_interfaces.go └── listers └── etcd └── v1beta2 ├── etcdbackup.go ├── etcdcluster.go ├── etcdrestore.go └── expansion_generated.go 16 directories, 30 files
  40. ▶ カスタムコントローラコンポーネントの実装 (ビジネスロジック) 40 ▶ カスタムリソースオブジェクトに定義された望ましい状態に現在のクラスタの 状態を近づけるように実装する ▶ お作法が多いため、サンプルや既存の実装を参考にします +

    kubernetes/sample-controller: サンプルのコントローラ実装 + etcd-operator, prometheus-operator, etc + Kubernetes のビルトインコントローラ (controller-manager) + replicaset-controller, endpoint-controller, service-controller, etc
  41. ▶ etcd-operator のビジネスロジック (調整ループ) 41 “example-etcd-cluster” は2つの Pods を管理している +

    name: A-000, version 3.0.9 + name: A-001, version 3.1.0 望ましい状態との⽐較 + 3 メンバーで構成されていなければならない + version は 3.1.0 でなければならない 望ましい状態になるには + 1メンバーのリカバリ + クラスタのバックアップ + 3.1.0 にアップグレード apiVersion: etcd.database.c kind: EtcdCluster metadata: name: example-etcd-cluste spec: size: 3 version: 3.1.0 https://coreos.com/blog/introducing-the-etcd-operator.html
  42. ▶ ゼロから作る Kubernetes Operator 42 1. 作成したいカスタムリソースの CRD マニフェストと Go

    構造体を定義する + CustomResourceDefinitions 2. カスタムリソースの Go 構造体から clients, informers, listers, deep-copy functions を⽣成する + k8s.io/code-generator 3. カスタムリソースコンポーネント(ビジネスロジック)を実装する + k8s.io/client-go
  43. Kubernetes Operator 開発の新時代 Kubebuilder, Operator SDK, Metacontroller

  44. ▶ Kubernetes Operator 開発ツールの登場 ▶ これまでの Operator 開発は client-go, code-generator

    などの Kubernetes 内部の ツールを使い、既存のコントローラの実装から⾒よう⾒まねで実装する + ドキュメントやマニュアルは全くなかった ▶ 近年になってCRD とカスタムコントローラ実装のための SDK やフレームワーク が登場し、開発が容易になりつつある + コードジェネレータが同梱されている + 抽象化によりお作法が隠蔽されていて間違いを起こしにくい、など 44
  45. ▶ Kubernetes Operator 開発ツールの⽐較 45 client-go 
 code-generator kubebuilder Operator

    SDK Metacontroller 開発元 kubernetes/kubernetes SIG API Machinery CoreOS (Red Hat) Google Cloud Platform アーキテクチャ ライブラリ SDK SDK Hook ステータス stable v1.0.0 (stable?) pre-alpha v0.2.0 Pros 低レベルAPI ⾼レベルAPIと抽象化 scaffolding とコード⽣成
 ドキュメント◦ ⾼レベルAPIと抽象化 scaffolding とコード⽣成
 ドキュメント◦ どんな⾔語でも ⾼い抽象化と最⼩の実装 ドキュメント◦ Cons 低レベルAPI
 ドキュメント☓ Go ⾔語のみ Go ⾔語のみ 他システムとの連携☓
  46. ▶ Kubernetes Operator 開発ツールの⽐較 46 client-go 
 code-generator kubebuilder Operator

    SDK Metacontroller 開発元 kubernetes/kubernetes SIG API Machinery CoreOS (Red Hat) Google Cloud Platform アーキテクチャ ライブラリ SDK SDK Hook ステータス stable v1.0.0 (stable?) pre-alpha v0.2.0 Pros 低レベルAPI ⾼レベルAPIと抽象化 scaffolding とコード⽣成
 ドキュメント◦ ⾼レベルAPIと抽象化 scaffolding とコード⽣成
 ドキュメント◦ どんな⾔語でも ⾼い抽象化と最⼩の実装 ドキュメント◦ Cons 低レベルAPI
 ドキュメント☓ Go ⾔語のみ Go ⾔語のみ 他システムとの連携☓
  47. Yahoo! JAPANの Kubernetes Cluster Operator Kubernetes クラスタを作成、設定、管理を⾃動化する

  48. ▶ Yahoo! JAPAN の Kubernetes Cluster Operator ヤフー株式会社向けにゼットラボが開発するマネージド Kubernetes サービス。


    オンプレミスの OpenStack 環境に Kubernetes クラスタを作成、管理する。
 2016年7⽉頃から開発を始め、2017年10⽉頃からヤフーの⼀部サービスでプロダク ション利⽤開始。 ▶ セルフサービス ▶ マネージド ▶ スケーラブル ▶ シングルテナント 48
  49. ▶ Yahoo! JAPAN の Kubernetes Cluster Operator ▶ セルフサービス +

    開発者が⾃由にクラスタを作成、削除、設定変更することができる ▶ マネージド + 障害や問題のあるノードの修復(セルフヒーリング) + クラスタを安全にゼロダウンタイムでアップグレードできる + モニタリングサービスとの連携 + データストア (etcd) のバックアップ、リストア ▶ スケーラブル + 開発者の要求に基づいてクラスタサイズを⾃由に変更できる 49
  50. ▶ Kubernetes Cluster Operatorの価値 煩雑なKubernetesのオペレーションから運⽤者を解放する ▶ クラスタの作成、削除、設定変更 ▶ ノード (VM)

    の追加・削除 ▶ クラスタのゼロダウンタイムアップグレード ▶ 障害や問題のあるノードの修復 ▶ データストア (etcd) のバックアップ、リストア Kubernetes はコンテナ化されたアプリケーションの運⽤に⼤きなメリットがある ⼀⽅でそれ⾃体の運⽤には多くのオペレーションが必要になる。 50
  51. ▶ Kubernetes Cluster Operatorの実装 Kubernetesは分散システムの開発に必要な機能を備えている。 ▶ Kubernetes API を拡張する +

    CustomResourceDefinition: カスタムリソースの定義 ▶ ライブラリ: k8s.io/client-go + Clientset: API クライアント + Informer: オブジェクトの変更検知 + workqueue: goroutine セーフなキューの実装 + Leader election: リーダー選出 51
  52. ▶ カスタムリソースとカスタムコントローラ 52 master ノード ノード X kube-apiserver KubernetesClusters MachineDeployments

    MachineSets Kuberneteses Machines KubernetesCluster Controller MachineDeployment Controller MachineSet Controller Kubernetes Controller リストとウォッチ 作成と管理 Machine Controller
  53. ▶ Kubernetesクラスタ作成デモ ▶ Kubernetes Cluster Operator を使ってOpenStack上にKubernetesクラスタを⼀ つ作成 + CLIツールを⽤意しているのでそれを使って

    KubernetesCluster リソースを作 成 + CRDリソースを可視化するための簡易的なツールで作成の様⼦を表⽰ + 作成には時間がかかるため事前に録画して待ち時間を取り除いた映像を⽤意 しています ▶ Worker ノードを3台にスケールアウト 53
  54. ▶ ダウンタイムなくアップグレードするには + 安全なノードの削除(kubectl drain) ▶ リソースを減らさないようにアップグレード + Nodeを追加して削除を繰り返していく +

    Nodeの数に⽐例して時間がかかる Kubernetes Cluster Operator ノード C ノード B ノード A drain 追加 54 ▶ Kubernetesクラスタのアップグレード
  55. ▶ クラスタのアップグレードを実現する上で注意したこと ▶ 全体のリソースが減らないようにする + リソースを追加してから削除するローリングアップグレード ▶ ダウンタイムなくアップグレードできるようにする + kubectl

    drain, (PodDisruptionBudget) ▶ アップグレードが失敗するようなら途中で⽌まるようにする + Machine Probe ▶ 途中で⽌まった場合ロールバックまたは再開が容易に⾏える + declarative configuration, Reconciliation Loop 55 アップグレードコストを最⼩限にして頻繁な更新を可能に
  56. ▶ なぜ頻繁な更新が⾏える状態を作りたいか? アップグレードのコストを下げる ▶ 利⽤者はKubernetesクラスタをアップグレードするモチベーションは低い + コストが⼤きいとアップグレードされなくなる ▶ コストが低ければ頻繁なアップグレードが可能になる +

    変更しやすくなる + 負の遺産を作りにくくなる + セキュリティやパフォーマンスも最⼤化される 56
  57. ▶ ゼロダウンタイムアップグレードのデモ ▶ Kubernetes クラスタのバージョンを v1.10.1 からv1.10.2にアップグレード ▶ クラスタにはサービスに⾒⽴てたnginxをreplicas 5でデプロイ

    + PodDisruptionBudget で min available を 4 に設定 ▶ クライアントからのアクセスとしてnginxに curl でpollingし続ける 57
  58. まとめ

  59. ▶ まとめ ▶ Kuberentes Operator + アプリケーション固有の運⽤ナレッジをソフトウェアとしてプログラムする + Kubernetesで動作させることが難しいアプリケーションもKubernetesの思想 で運⽤できる

    ▶ Yahoo! JAPAN の Kubernetes Cluster Operator + 管理の⼤変な Kubernetes クラスタを⼀元管理しクラスタの運⽤負荷を軽減 + アップグレードの負荷を⼤幅に下げることですべてのクラスタがサポート バージョン内といった健全な状態を維持できている 59