Slide 1

Slide 1 text

Kubernetes Operatorで実現する NoOps の世界 OpenStack Days Tokyo, Cloud Native Days Tokyo 2018 / August 3, 2018 Shunya Murata @shmurata_ Kazuki Suda @superbrothers

Slide 2

Slide 2 text

▶ アジェンダ 1. NoOps とは 2. Kubernetes Operator とは 3. etcd-operator 4. ゼロから作る Kubernetes Operator 5. Kubernetes Operator 開発の新時代 6. Yahoo! JAPAN の Kubernetes Cluster Operator 7. まとめ 2

Slide 3

Slide 3 text

Shunya Murata / @shmurata_ ▶ ゼットラボ株式会社 ソフトウェアエンジニア ▶ 2010年にヤフー株式会社に新卒⼊社、2015年ゼットラボ株式会社に出向 3

Slide 4

Slide 4 text

ゼットラボ株式会社 / Z Lab Corporation ▶ 2015年に設⽴されたヤフー株式会社の100%⼦会社 ▶ インフラ基盤技術の調査・研究開発 ▶ ヤフー株式会社向けの Kubernetes-as-a-Service の開発 ▶ https://zlab.co.jp/ 4

Slide 5

Slide 5 text

NoOps システムに⾃律運⽤能⼒をもたせて⼈間による運⽤を最⼩化する

Slide 6

Slide 6 text

▶ NoOps ▶ システムに⾃律運⽤能⼒をもたせることで⼈間による運⽤を最⼩化すること ▶ 注意事項 + 運⽤者が必要なくなるわけではない + ブラックボックス化しないようにするためにもシステムが⾏っている運⽤作業を把握し て、最悪⼿動運⽤できる能⼒を持った⼈は必要 6 https://www.slideshare.net/hiromasaoka/noops-88082246

Slide 7

Slide 7 text

▶ なぜ NoOps に ▶ 継続的に頻繁なサービスの改善を⾏える環境を作りたい + 今のビジネスではサービスの改善のスピードが求められている ▶ オペレーションミスの防⽌ + ⼈間がオペレーションすると必ずミスする ▶ NoOps を実現できる環境が揃ってきた + infrastructure as code, immutable infrastructure 7

Slide 8

Slide 8 text

▶ NoOps に必要なこと ▶ Self Healing + 故障発⽣時のサービス無影響+⾃⼰修復能⼒ ▶ In-flight Renewing + 変更・更新に対する無停⽌メンテナンス能⼒ ▶ Adaptive Scale + 負荷変動に弾⼒的に適応する⾃律的なリソース調整能⼒ 8

Slide 9

Slide 9 text

▶ Kubernetes ▶ Kubernetes は NoOps に必要なことを満たしている + Self Healing + Declaraticve Configuration + Liveness/Readiness Probe + In-Flight Renewing + Rolling Update + Adaptive Scale + HorizontalPodAutoscaler + ClusterAutoscaler 9

Slide 10

Slide 10 text

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 削除 追加

Slide 11

Slide 11 text

▶ In-Flight Renewing ▶ Rolling Update + 新しいバージョンのPodの追加と古いバージョンのPodを削除を繰り返すこと で無停⽌で更新 11 Kubernetes コントローラ Node Pod v1 Node Node Pod v1 Pod v1 Pod v2 ࡟আ ௥Ճ

Slide 12

Slide 12 text

▶ Adaptive Scale 1. HorizontalPodAutoscaler + メトリクスの変動によって⾃動的にPodを⽔平スケール 2. ClusterAutoscaler + リソースの枯渇や余剰が発⽣したら⾃動的にNodeを⽔平スケール 12 Kubernetes コントローラ Node Pod Node Node Pod Podの追加 Pod Nodeの追加 Pod

Slide 13

Slide 13 text

▶ すべてのアプリケーションがKubernetesで動かせるわけではない ▶ ステートフルアプリケーションなどまだ難しいアプリケーションもある + アプリケーション固有の初期化 + Pod毎に異なる設定 + ローカルディスクにデータを持つアプリケーション 13

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

▶ ステートレスアプリケーション 16 ▶ アプリケーションが状態を持たない ▶ HTTP サーバやアプリケーションサーバ 
 (12 Factor App) など ▶ 障害復旧やスケールにアプリケーション 固有の運⽤ナレッジが必要ない ステートレス

Slide 17

Slide 17 text

▶ Kubernetes でのステートレスアプリケーション 17 ステートレス + ▶ 基本的な Deployments などのビルトインの オブジェクトを利⽤すればいい ▶ 問題があったら基本的にインスタンスを
 削除するだけでいい ▶ 適切な設定を⾏えば基本的な
 オペレーションはほぼ不要 + livenessProbe, readinessProbe, etc

Slide 18

Slide 18 text

ステートフル ▶ ステートフルアプリケーション 18 ▶ アプリケーションが状態を持つ ▶ 分散システムやデータベースなど ▶ 障害復旧やスケールに
 アプリケーション固有の運⽤ナレッジが必要

Slide 19

Slide 19 text

ステートフル ▶ Kubernetes でのステートフルアプリケーション 19 ▶ v1.5.0 からステートフルを扱う
 StatefulSets が提供された (GA v1.9.0) ▶ Pod を 0-N の順序をつけて命名し、
 特定のPod とストレージを紐づけられる ▶ しかしこの機能だけでは⼗分ではない +

Slide 20

Slide 20 text

▶ Kubernetes でのステートフルアプリケーション運⽤の難しさ 20 ステートフル + ▶ アプリケーション固有の障害復旧やス ケールなどの運⽤ナレッジをどのように 適応するか ▶ データ消失や使⽤不能な状態になること を防ぎながら、スケール、アップグレー ド、設定変更などを実施する必要がある

Slide 21

Slide 21 text

▶ Kubernetes Operator ▶ Kubernetes のユーザに変わって複雑なステートフルアプリケーションのインス タンスを作成、スケール、アップグレード、設定変更などを⾏うコントローラ ▶ 基本的な Kubernetes のリソースとコントローラの概念をもとにして、 Kubernetes の拡張機能を活⽤しアプリケーション固有の運⽤ナレッジをソフト ウェアとしてプログラムする 21 An Operator represents human operational knowledge in software to reliably manage an application. https://coreos.com/operators/

Slide 22

Slide 22 text

▶ SRE: ソフトウェアを書くことでアプリケーションを運⽤に⾃動化をもたらすロール 22 “したがってSREは、これまで運⽤チーム が⾏ってきたことをソフトウェアの専⾨ 性を持つエンジニアが⾏い、エンジニア が⼈⼿による管理を⾃動化するソフト ウェアを設計し実装する能⼒を持ち、そ れをいとわないということから成り⽴っ ています。” https://www.oreilly.co.jp/books/9784873117911/

Slide 23

Slide 23 text

▶ 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

Slide 24

Slide 24 text

etcd-operator Create/configure/manage etcd clusters atop Kubernetes

Slide 25

Slide 25 text

▶ etcd ▶ CoreOS, Inc. が開発するCP 型の分散キーバリューストア + Kubernetes の唯⼀のデータストアとしても利⽤されている ▶ 分散システムである etcd クラスタの運⽤には固有のナレッジが必要になる + ブートストラッピング + Quorum の維持 + クラスタメンバーの再構成 + バックアップ + ディザスタリカバリ + 致命的なイベントの監視 25

Slide 26

Slide 26 text

▶ etcd-operator ▶ CoreOS が開発する etcd クラスタの作成/設定/管理を⾏う Kubernetes Operator ▶ etcd クラスタ固有の運⽤ナレッジがプログラムされている + 作成と廃棄: クラスタサイズを指定するだけ + リサイズ: クラスタサイズを変更するだけ + バックアップ: ⾃動的かつ透過的に実⾏ + アップグレード: ゼロダウンタイムアップグレード 26 https://coreos.com/blog/introducing-the-etcd-operator.html

Slide 27

Slide 27 text

# 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

Slide 28

Slide 28 text

$ 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

Slide 29

Slide 29 text

# 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

Slide 30

Slide 30 text

ゼロから作る Kubernetes Operator CustomResourceDefinitions, client-go, code-generator

Slide 31

Slide 31 text

▶ ゼロから作る Kubernetes Operator ▶ カスタムリソースを定義する + CustomResourceDefinitions ▶ カスタムコントローラを実装する + k8s.io/client-go: Kubernetes Go クライアント + k8s.io/code-generator: カスタムクライアントの⽣成 31

Slide 32

Slide 32 text

▶ カスタムリソースを定義する: 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

Slide 33

Slide 33 text

▶ 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

Slide 34

Slide 34 text

▶ 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

Slide 35

Slide 35 text

▶ カスタムコントローラの実装: クライアントライブラリ、コード⽣成 ▶ k8s.io/client-go + コントローラを実装するためのさまざまな機構が含まれている ▶ k8s.io/code-generator + カスタムリソース⽤のクライアントコードを⽣成する 35

Slide 36

Slide 36 text

▶ コントローラは現在の状態を望ましい状態に近づける ▶ reconciliation loop / 調整ループ ▶ カスタムコントローラの実装: k8s.io/client-go 36 client-go コンポーネント カスタムコントローラコンポーネント (ビジネスロジック) Controller Informer kube-apiserver リソースのリストとウォッチ Callbacks OnAdd OnUpdate OnDelete workqueue Workers clientset CRUD Indexer

Slide 37

Slide 37 text

▶ カスタムコントローラの実装: 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

Slide 38

Slide 38 text

▶ カスタムコントローラの実装: 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

Slide 39

Slide 39 text

▶ カスタムコントローラの実装: 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

Slide 40

Slide 40 text

▶ カスタムコントローラコンポーネントの実装 (ビジネスロジック) 40 ▶ カスタムリソースオブジェクトに定義された望ましい状態に現在のクラスタの 状態を近づけるように実装する ▶ お作法が多いため、サンプルや既存の実装を参考にします + kubernetes/sample-controller: サンプルのコントローラ実装 + etcd-operator, prometheus-operator, etc + Kubernetes のビルトインコントローラ (controller-manager) + replicaset-controller, endpoint-controller, service-controller, etc

Slide 41

Slide 41 text

▶ 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

Slide 42

Slide 42 text

▶ ゼロから作る Kubernetes Operator 42 1. 作成したいカスタムリソースの CRD マニフェストと Go 構造体を定義する + CustomResourceDefinitions 2. カスタムリソースの Go 構造体から clients, informers, listers, deep-copy functions を⽣成する + k8s.io/code-generator 3. カスタムリソースコンポーネント(ビジネスロジック)を実装する + k8s.io/client-go

Slide 43

Slide 43 text

Kubernetes Operator 開発の新時代 Kubebuilder, Operator SDK, Metacontroller

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

▶ 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 ⾔語のみ 他システムとの連携☓

Slide 46

Slide 46 text

▶ 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 ⾔語のみ 他システムとの連携☓

Slide 47

Slide 47 text

Yahoo! JAPANの Kubernetes Cluster Operator Kubernetes クラスタを作成、設定、管理を⾃動化する

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

▶ Kubernetes Cluster Operatorの価値 煩雑なKubernetesのオペレーションから運⽤者を解放する ▶ クラスタの作成、削除、設定変更 ▶ ノード (VM) の追加・削除 ▶ クラスタのゼロダウンタイムアップグレード ▶ 障害や問題のあるノードの修復 ▶ データストア (etcd) のバックアップ、リストア Kubernetes はコンテナ化されたアプリケーションの運⽤に⼤きなメリットがある ⼀⽅でそれ⾃体の運⽤には多くのオペレーションが必要になる。 50

Slide 51

Slide 51 text

▶ Kubernetes Cluster Operatorの実装 Kubernetesは分散システムの開発に必要な機能を備えている。 ▶ Kubernetes API を拡張する + CustomResourceDefinition: カスタムリソースの定義 ▶ ライブラリ: k8s.io/client-go + Clientset: API クライアント + Informer: オブジェクトの変更検知 + workqueue: goroutine セーフなキューの実装 + Leader election: リーダー選出 51

Slide 52

Slide 52 text

▶ カスタムリソースとカスタムコントローラ 52 master ノード ノード X kube-apiserver KubernetesClusters MachineDeployments MachineSets Kuberneteses Machines KubernetesCluster Controller MachineDeployment Controller MachineSet Controller Kubernetes Controller リストとウォッチ 作成と管理 Machine Controller

Slide 53

Slide 53 text

▶ Kubernetesクラスタ作成デモ ▶ Kubernetes Cluster Operator を使ってOpenStack上にKubernetesクラスタを⼀ つ作成 + CLIツールを⽤意しているのでそれを使って KubernetesCluster リソースを作 成 + CRDリソースを可視化するための簡易的なツールで作成の様⼦を表⽰ + 作成には時間がかかるため事前に録画して待ち時間を取り除いた映像を⽤意 しています ▶ Worker ノードを3台にスケールアウト 53

Slide 54

Slide 54 text

▶ ダウンタイムなくアップグレードするには + 安全なノードの削除(kubectl drain) ▶ リソースを減らさないようにアップグレード + Nodeを追加して削除を繰り返していく + Nodeの数に⽐例して時間がかかる Kubernetes Cluster Operator ノード C ノード B ノード A drain 追加 54 ▶ Kubernetesクラスタのアップグレード

Slide 55

Slide 55 text

▶ クラスタのアップグレードを実現する上で注意したこと ▶ 全体のリソースが減らないようにする + リソースを追加してから削除するローリングアップグレード ▶ ダウンタイムなくアップグレードできるようにする + kubectl drain, (PodDisruptionBudget) ▶ アップグレードが失敗するようなら途中で⽌まるようにする + Machine Probe ▶ 途中で⽌まった場合ロールバックまたは再開が容易に⾏える + declarative configuration, Reconciliation Loop 55 アップグレードコストを最⼩限にして頻繁な更新を可能に

Slide 56

Slide 56 text

▶ なぜ頻繁な更新が⾏える状態を作りたいか? アップグレードのコストを下げる ▶ 利⽤者はKubernetesクラスタをアップグレードするモチベーションは低い + コストが⼤きいとアップグレードされなくなる ▶ コストが低ければ頻繁なアップグレードが可能になる + 変更しやすくなる + 負の遺産を作りにくくなる + セキュリティやパフォーマンスも最⼤化される 56

Slide 57

Slide 57 text

▶ ゼロダウンタイムアップグレードのデモ ▶ Kubernetes クラスタのバージョンを v1.10.1 からv1.10.2にアップグレード ▶ クラスタにはサービスに⾒⽴てたnginxをreplicas 5でデプロイ + PodDisruptionBudget で min available を 4 に設定 ▶ クライアントからのアクセスとしてnginxに curl でpollingし続ける 57

Slide 58

Slide 58 text

まとめ

Slide 59

Slide 59 text

▶ まとめ ▶ Kuberentes Operator + アプリケーション固有の運⽤ナレッジをソフトウェアとしてプログラムする + Kubernetesで動作させることが難しいアプリケーションもKubernetesの思想 で運⽤できる ▶ Yahoo! JAPAN の Kubernetes Cluster Operator + 管理の⼤変な Kubernetes クラスタを⼀元管理しクラスタの運⽤負荷を軽減 + アップグレードの負荷を⼤幅に下げることですべてのクラスタがサポート バージョン内といった健全な状態を維持できている 59