こんにちは、Necoプロジェクトの池添(@zoetro)です。
このたびサイボウズがCNCF(Cloud Native Computing Foundation)にシルバーメンバーとして加盟しました。 それに伴い、我々の開発しているCKE(Cybozu Kubernetes Engine)がKubernetes Conformance Softwareに認定されました。
CKEはKubernetesクラスタの構築と運用を自動化するためのソフトウェアです。 本記事ではCKEの概要と、他のツールとは異なる特徴的な機能について紹介したいと思います。
Kubernetes Conformance Softwareとは
Kubernetes Conformance Software ProgramとはCNCFが実施している認定プログラムです。
認定を取得するためには、Sonobuoyによる適合テストに合格する必要があり、 これによりソフトウェアがKubernetesの標準に適合していることを保証することができます。
認定済みのソフトウェアであれば標準的なKubernetesの機能が利用できるため、エンドユーザーは安心して利用することが可能になります。
CKEとは
CKEは下記のような特徴を持つKubernetesクラスタの構築と運用を自動化するためのソフトウェアです。
- Declarative ConfigurationによるKubernetesクラスタの構築と運用の自動化
- さまざまなKubernetesの機能に対応
- コントロールプレーンのHA構成
- API Aggregation, Scheduler Extenderなどの拡張への対応
- Encryption at RestによるSecretデータの暗号化
- いくつかのKubernetesリソースを標準でセットアップ
- CoreDNS, Node-local DNSキャッシュ
- RBACやPodSecurityPolicyなどマルチテナント運用に必要なポリシー
- インプレイスでのKubernetesのアップグレード
- コンテナランタイムとしてDockerとCRI Runtimeをサポート
- 任意のKubernetesリソースの管理機能(CNIプラグインのセットアップなどに利用可能)
- サーバー管理ツール(sabakan)との連携機能
- バックエンドにetcdとVaultを利用
- CKE自体もHA構成で高可用運用可能
CKEはDeclarative Configuration(宣言的設定)を採用しています。 Kubernetesクラスタのあるべき理想の状態を宣言しておくと、CKEは実際のKubernetesクラスタの状態が理想の状態に収束するように必要なオペレーションを自動的に実行します。
これにより、スクラッチからのKubernetesクラスタの立ち上げ、故障が発生したときの自動修復、各種ソフトウェアのアップグレード、ノードの追加や削除、各種設定の変更などがすべて自動的に実施されます。
我々のKubernetesクラスタでは1,000台規模のノードを取り扱うので、運用コスト的にこのような自動化は必須となってきます。
CKEの特徴的な機能
Kubernetesクラスタを構築するツールは数多く存在しますが、CKEはそれらとは異なる特徴的な機能を備えています。 本記事ではそのいくつかを紹介したいと思います。
なお、CloudNative Days Tokyo 2019においてCKEについて発表しました。興味のある方はぜひご覧ください。
インプレイスでのKubernetesのアップグレード
Kubernetesクラスタ構築ツールにおいて、無停止でのKubernetesアップグレードは悩みのタネのひとつです。
例えばKubernetesの標準的なクラスタ構築ツールであるkubeadmでは、
kubectl drain
コマンドでワークロード(Podなど)を別のノードに退避させてからアップグレードをおこないます*1。
このような方式の場合、ノードのローカルストレージを利用しているようなステートフルなアプリケーションを退避させるのはコストが大きく難しい作業になります。
一方、CKEではワークロードの退避をせず、以下のようなインプレイス方式でのアップグレードをおこなっています。
- 新しいバージョンのKubernetesコンポーネント(kubeletなど)のコンテナイメージをノード上にロードする
- Kubernetesコンポーネントの設定ファイルを更新する
- 古いKubernetesコンポーネントを停止し、新しいKubernetesコンポーネントを立ち上げる
各種ワークロードはコンテナランタイム上で動いているので、Kubernetesコンポーネント(kubelet)を再起動しても問題なく動き続けることが可能になっています。
OSやコンテナランタイムを更新する場合にはkubeadmと同じ方式でアップグレードする必要がありますが、 Kubernetesのアップグレードだけであればこのような簡単な方法で高速に実施することができます。
サーバー管理ツール(sabakan)との連携機能
CKEでは理想のKubernetesクラスタの状態を宣言すると説明しました。 しかしノードが1,000台規模のクラスタでは、理想の状態を宣言するだけでも一苦労です。
例えば、以下のような様々な状況を考慮して動的にクラスタの理想状態を変更していく必要があります。
- ハードウェア故障が発生したノードにPodがスケジューリングされないようにする
- コントロールプレーンが同一ラックに配置されないようにする
- 退役時期が近いノードよりも新しいノードを優先してクラスタに追加する
- リソースが不足しているのでノードを追加する
Necoプロジェクトではsabakanというツールを開発して、サーバーのプロビジョニングや、サーバーのメタデータや健康状態の管理をおこなっています。
CKEはsabakanが提供する以下のような情報をもとに、クラスタの理想状態を自動的に更新します。
- モニタリング情報
- ネットワーク接続可能性
- ハードウェアの故障状態
- インストールされているOSのバージョン
- 静的な情報
- 退役までの期間
- 搭載しているハードウェア
- 配置されているラック番号
詳しいアルゴリズムを知りたい方は以下をごらんください。
まとめ
本記事では、Kubernetesクラスタの構築と運用を自動化するツールであるCKEの紹介をおこないました。
このような自動化をおこなったとしても運用コストがゼロになるということはなく、いくつかのオペレーションは人間が実施しなくてはなりません。 しかし、CKEのおかげでKubernetesクラスタの運用コストを大幅に削減することが可能になりました。
Docker-ComposeでCKEを立ち上げ、Vagrantで用意したVM上にKubernetesクラスタを構築するサンプルを以下に用意しました。 興味のある方はぜひ試してみてください。