Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

Shunya Murata

August 03, 2018
Tweet

More Decks by Shunya Murata

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  14. Kubernetes Operator
    Kubernetes の拡張機能を活⽤しアプリケーション固有の

    運⽤ナレッジをソフトウェアとしてプログラムする

    View Slide

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

    View Slide

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

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

    View Slide

  17. ▶ Kubernetes でのステートレスアプリケーション
    17
    ステートレス

    ▶ 基本的な Deployments などのビルトインの
    オブジェクトを利⽤すればいい
    ▶ 問題があったら基本的にインスタンスを

    削除するだけでいい
    ▶ 適切な設定を⾏えば基本的な

    オペレーションはほぼ不要
    + livenessProbe, readinessProbe, etc

    View Slide

  18. ステートフル
    ▶ ステートフルアプリケーション
    18
    ▶ アプリケーションが状態を持つ
    ▶ 分散システムやデータベースなど
    ▶ 障害復旧やスケールに

    アプリケーション固有の運⽤ナレッジが必要

    View Slide

  19. ステートフル
    ▶ Kubernetes でのステートフルアプリケーション
    19
    ▶ v1.5.0 からステートフルを扱う

    StatefulSets が提供された (GA v1.9.0)
    ▶ Pod を 0-N の順序をつけて命名し、

    特定のPod とストレージを紐づけられる
    ▶ しかしこの機能だけでは⼗分ではない

    View Slide

  20. ▶ Kubernetes でのステートフルアプリケーション運⽤の難しさ
    20
    ステートフル

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    オンプレミスの OpenStack 環境に Kubernetes クラスタを作成、管理する。

    2016年7⽉頃から開発を始め、2017年10⽉頃からヤフーの⼀部サービスでプロダク
    ション利⽤開始。
    ▶ セルフサービス
    ▶ マネージド
    ▶ スケーラブル
    ▶ シングルテナント
    48

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  53. ▶ Kubernetesクラスタ作成デモ
    ▶ Kubernetes Cluster Operator を使ってOpenStack上にKubernetesクラスタを⼀
    つ作成
    + CLIツールを⽤意しているのでそれを使って KubernetesCluster リソースを作

    + CRDリソースを可視化するための簡易的なツールで作成の様⼦を表⽰
    + 作成には時間がかかるため事前に録画して待ち時間を取り除いた映像を⽤意
    しています
    ▶ Worker ノードを3台にスケールアウト
    53

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  58. まとめ

    View Slide

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

    View Slide