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

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

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 <[email protected]> @shmurata_ Kazuki Suda <[email protected]> @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. ▶ なぜ NoOps に ▶ 継続的に頻繁なサービスの改善を⾏える環境を作りたい + 今のビジネスではサービスの改善のスピードが求められている ▶ オペレーションミスの防⽌

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

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

    + Declaraticve Configuration + Liveness/Readiness Probe + In-Flight Renewing + Rolling Update + Adaptive Scale + HorizontalPodAutoscaler + ClusterAutoscaler 9
  6. 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 削除 追加
  7. ▶ Adaptive Scale 1. HorizontalPodAutoscaler + メトリクスの変動によって⾃動的にPodを⽔平スケール 2. ClusterAutoscaler +

    リソースの枯渇や余剰が発⽣したら⾃動的にNodeを⽔平スケール 12 Kubernetes コントローラ Node Pod Node Node Pod Podの追加 Pod Nodeの追加 Pod
  8. ▶ ステートレスアプリケーション 16 ▶ アプリケーションが状態を持たない ▶ HTTP サーバやアプリケーションサーバ 
 (12

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

    オブジェクトを利⽤すればいい ▶ 問題があったら基本的にインスタンスを
 削除するだけでいい ▶ 適切な設定を⾏えば基本的な
 オペレーションはほぼ不要 + livenessProbe, readinessProbe, etc
  10. ステートフル ▶ Kubernetes でのステートフルアプリケーション 19 ▶ v1.5.0 からステートフルを扱う
 StatefulSets が提供された

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

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

    のリソースとコントローラの概念をもとにして、 Kubernetes の拡張機能を活⽤しアプリケーション固有の運⽤ナレッジをソフト ウェアとしてプログラムする 21 An Operator represents human operational knowledge in software to reliably manage an application. https://coreos.com/operators/
  13. ▶ 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
  14. ▶ etcd ▶ CoreOS, Inc. が開発するCP 型の分散キーバリューストア + Kubernetes の唯⼀のデータストアとしても利⽤されている

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

    etcd クラスタ固有の運⽤ナレッジがプログラムされている + 作成と廃棄: クラスタサイズを指定するだけ + リサイズ: クラスタサイズを変更するだけ + バックアップ: ⾃動的かつ透過的に実⾏ + アップグレード: ゼロダウンタイムアップグレード 26 https://coreos.com/blog/introducing-the-etcd-operator.html
  16. # 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
  17. $ 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
  18. # 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
  19. ▶ ゼロから作る Kubernetes Operator ▶ カスタムリソースを定義する + CustomResourceDefinitions ▶ カスタムコントローラを実装する

    + k8s.io/client-go: Kubernetes Go クライアント + k8s.io/code-generator: カスタムクライアントの⽣成 31
  20. ▶ カスタムリソースを定義する: 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
  21. ▶ 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
  22. ▶ 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
  23. ▶ コントローラは現在の状態を望ましい状態に近づける ▶ reconciliation loop / 調整ループ ▶ カスタムコントローラの実装: k8s.io/client-go

    36 client-go コンポーネント カスタムコントローラコンポーネント (ビジネスロジック) Controller Informer kube-apiserver リソースのリストとウォッチ Callbacks OnAdd OnUpdate OnDelete workqueue Workers clientset CRUD Indexer
  24. ▶ カスタムコントローラの実装: 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
  25. ▶ カスタムコントローラの実装: 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
  26. ▶ カスタムコントローラの実装: 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
  27. ▶ カスタムコントローラコンポーネントの実装 (ビジネスロジック) 40 ▶ カスタムリソースオブジェクトに定義された望ましい状態に現在のクラスタの 状態を近づけるように実装する ▶ お作法が多いため、サンプルや既存の実装を参考にします +

    kubernetes/sample-controller: サンプルのコントローラ実装 + etcd-operator, prometheus-operator, etc + Kubernetes のビルトインコントローラ (controller-manager) + replicaset-controller, endpoint-controller, service-controller, etc
  28. ▶ 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
  29. ▶ ゼロから作る Kubernetes Operator 42 1. 作成したいカスタムリソースの CRD マニフェストと Go

    構造体を定義する + CustomResourceDefinitions 2. カスタムリソースの Go 構造体から clients, informers, listers, deep-copy functions を⽣成する + k8s.io/code-generator 3. カスタムリソースコンポーネント(ビジネスロジック)を実装する + k8s.io/client-go
  30. ▶ Kubernetes Operator 開発ツールの登場 ▶ これまでの Operator 開発は client-go, code-generator

    などの Kubernetes 内部の ツールを使い、既存のコントローラの実装から⾒よう⾒まねで実装する + ドキュメントやマニュアルは全くなかった ▶ 近年になってCRD とカスタムコントローラ実装のための SDK やフレームワーク が登場し、開発が容易になりつつある + コードジェネレータが同梱されている + 抽象化によりお作法が隠蔽されていて間違いを起こしにくい、など 44
  31. ▶ 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 ⾔語のみ 他システムとの連携☓
  32. ▶ 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 ⾔語のみ 他システムとの連携☓
  33. ▶ Yahoo! JAPAN の Kubernetes Cluster Operator ヤフー株式会社向けにゼットラボが開発するマネージド Kubernetes サービス。


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

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

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

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

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

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

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

    drain, (PodDisruptionBudget) ▶ アップグレードが失敗するようなら途中で⽌まるようにする + Machine Probe ▶ 途中で⽌まった場合ロールバックまたは再開が容易に⾏える + declarative configuration, Reconciliation Loop 55 アップグレードコストを最⼩限にして頻繁な更新を可能に
  41. ▶ まとめ ▶ Kuberentes Operator + アプリケーション固有の運⽤ナレッジをソフトウェアとしてプログラムする + Kubernetesで動作させることが難しいアプリケーションもKubernetesの思想 で運⽤できる

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