こんにちは、Necoチームの鎌田、阪上、そしてストレージチームの大神、satです。
サイボウズは毎年サマーインターンシップを開催しています。2022年度のサマーインターンシップもさまざまなコースを用意しました。本記事では8月22日~9月2日の10日間にわたって開催された、Kubernetes基盤開発コース、およびストレージコースの模様をお届けいたします。
Kubernetes基盤開発コースではKubernetesを用いたサイボウズの新しいインフラ基盤であるNecoの開発業務を、ストレージコースではNecoの上に構築したストレージ基盤の開発業務を体験してもらいました。 今回のインターンシップでは、Kubernetes基盤開発コースには4名、ストレージコースには2名の学生さんが参加してくれました。
講義
Kubernetes基盤開発コース、およびストレージコースでは、数多くの講義や勉強会を実施しました。
- Introduction to Kubernetes
- Kubernetesの基礎についてハンズオン形式で学ぶ講義
- Kubernetes勉強会
- Kubernetesについてより深く学ぶ講義
- サイボウズとOSS
- 企業にとってのOSSの位置づけについての一般論、および、サイボウズについての具体例を紹介
- つくって学ぶKubebuilder
- Kubebuilderやcontroller-runtimeを利用したKubernetesコントローラの開発方法を学ぶチュートリアル
- Ginkgo/GomegaによるKubernetes Operatorのテスト手法
- GinkgoとGomegaというライブラリを利用したKubernetesコントローラのテスト手法
- NecoWeekly
- 最近気になるCloud Native関連のネタを共有する雑談会
- その他、社内で開催されている勉強会
学生さんには各コースで必要となる知識に応じてこれらの講義に参加してもらい、基礎知識を身につけた上で以下のそれぞれのコースに分かれて実作業に入りました。
- Kubernetes基盤開発コース
- ストレージコース
ここからは2つのコースで具体的に取り組んだ内容について紹介します。
Kubernetes基盤開発コース
Kubernetes基盤開発コースでは、Kubernetesコントローラの開発を通じてKubernetesの基礎やコントローラの開発手法およびテスト手法を学んでもらうことを目的としています。 それぞれ2人ずつ、以下のチームに分かれて課題に取り組んでもらいました。
- nyamberチーム
- necotiatorチーム
nyamberチーム
Necoチームでは、これまでサーバーのプロビジョニングやKubernetesクラスタの構築、Kubernetes上で動作するアプリケーションの動作テストを自動化するために、仮想データセンタという仕組みを開発してきました。
さらに現在、Kubernetes上に仮想データセンタ環境を構築するためのKubernetesコントローラとしてnyamberを開発しています。 このチームでは、nyamberを題材にKubernetesコントローラの開発に取り組んでもらいました。
実施したタスク
nyamberチームでは、Kubernetesコントローラの開発を新しいカスタムリソースの定義から実装・テストまで一通り取り組みました。
AutoVirtualDCカスタムリソースの仕様・定義
nyamberには仮想データセンタの環境と1対1で対応するVirtualDCリソースがあります。 そのVirtualDCリソースをユーザ指定のスケジュールで自動作成・削除したり、 仮想データセンタ環境構築の失敗時に再作成する機能を持つのが今回作成したAutoVirtualDCリソースです。 そのような期待する動作を元に、どのようなフィールドやステータスを持てば良いかAutoVirtualDCのCustom Resource Definitionを設計しました。このタスクでkubebuilderの使い方などの開発ツールの利用を実践してもらいました。
Reconcilerの実装
AutoVirtualDCのフィールドにユーザが指定したスケジュールを元にVirtualDCリソースの作成・削除をする処理、 もし作られたVirtualDCリソースが仮想的なデータセンタの立ち上げに失敗していた場合に必要に応じて再作成する処理を実装しました。 時間に応じた期待する動作が存在するため時間を扱う部分をMockにしてテスト可能にする工夫をしました。Reconcilerの処理を冪等にするべきという前提がある状態で時間を扱うという内容の難しさから Reconcilerの実装方法やコードをテスト可能な状態に実装する方法を学んでもらえたのではないかと思います。
Admission Webhookの実装
Kubernetesにはリソースが保存される前にデフォルト値を設定したり、フィールドのvalidationを行うためのAdmission Webhookと呼ばれる機構が提供されています。 AutoVirtualDCリソースにも、想定しないフィールド指定の方法やフォーマットがあり、それらを保存前に確認するためのValidating Admission Webhookを実装しました。このタスクを通してKubernetesのリソースの保存時の動作についても理解してもらえたと思います。
E2Eテストの実装
最後にコントローラやWebhookの単体テストでまかなえない部分のテストをE2Eテストに追加しました。
これらのタスクでKubernetesコントローラの開発を一通り経験していただきました。さらにKubernetesやKubernetesコントローラの動作についても理解を深めていただけたと思います。
necotiatorチーム
サイボウズでは、複数のチームがKubernetesクラスタを共有するマルチテナンシー方式でクラスタを構築しています。
Kubernetesには、Namespaceごとにリソースの使用量を制限するResourceQuotaという仕組みがありますが、テナントごとにリソースの使用量を制限する仕組みはありません。 そこで、Kubernetes上でテナントごとのリソース使用量の上限を制限するコントローラとしてnecotiatorを開発することにしました。
このチームでは、社員と一緒にZoomでリモートモブプログラミングを行いながら、necotiatorの設計、実装、テストに携わってもらいました。
実施したタスク
TenantResourceQuotaの定義
サイボウズ社内でのKubernetesクラスタの使い方や現在の課題をインプットとしてnecotiatorの設計を行い、TenantResourceQuotaという新しいカスタムリソースを定義してもらいました。このカスタムリソースには、テナントチームが使用可能なリソースの総量と、テナントのNamespaceを指定するためのnamespace selectorを宣言するようにしました。コントローラとAdmission Webhookの実装
necotiatorでは、テナント内のResourceQuotaの総量がTenantResourceQuotaの上限値を超えないよう制限する必要があります。そこでコントローラとしてResourceQuotaの総量を集計する機能を実装し、ResourceQuotaの総量が上限を超えないことを検証するAdmission Webhookを実装しました。結合テストとE2Eテストの実装
Ginkgo/GomegaというライブラリとEnvtestパッケージを使って、コントローラの各種機能を試験する結合テストと、Kubernetesクラスタ上にデプロイしたコントローラのE2E試験を実装してもらいました。学生さんと一緒に、必要なテストケースの列挙にも取り組みました。
このチームはKubernetesコントローラを新規開発するというタスクだったのですが、わずか2週間という短い期間の中で基本的な機能が動作するところまで完成させることができました。 この課題を通して、Kubernetesコントローラの動作や実装について深く理解できたのではないかと思います。 また、実装よりも多くのテストを書くという経験を通して、プロダクション環境で動かすシステムにおけるテストの重要性も知ることができたと思います。 さらには、KindやTiltを活用した効率的な開発手法、Prometheus Collectorによるメトリクスの公開、Server-Side Applyによる差分適用手法など、発展的な内容にも取り組むことができました。 学ぶことの多い非常に濃密な2週間だったと思います。
ストレージコース
ストレージコースでは、2名のインターン生を受け入れ、実務に近い課題として以下を実施しました。
- Upstream OSSへのPR投稿
- CSI Driver E2Eモニタ開発
ストレージコースのインターンを主催しているCSAチームでも、普段の業務をモブプログラミングで行っています。インターンでも、インターン生2名と社員3名の合計5名でZoomを用いたリモートモブプログラミングを行いました。
Upstream OSSへのPR投稿
まず、最初の2日程で、インターン生お二人のそれぞれに1件ずつ、Upstream OSSとしてRookへのPR投稿を行っていただきました。
投稿していただいたPRはそれぞれ以下の通りです。
この課題によって、OSS開発におけるコミュニティとのやり取りの仕方や、レビュー時のコード修正の方法などを学んでいただきました。
成果として、前者のPRはレビューの指摘事項は反映し終わり間もなくマージという所まで至ることができ、後者のPRはマージにまで至ることができました。
CSI Driver E2Eモニタ開発
CSAでは、Necoが提供するKubernetes環境上で動作するアプリケーションに向けて、Rook/CephやTopoLVMなどのCSI Driverによってストレージを提供しています。
ストレージの提供は、PVC(PersistentVolumeClaim)というリクエストに応じて自動的に行われるようにしています。ただし、これを監視するモニターがまだ無かったため、今回のインターンでインターン生の方々と共に開発を行いました。
ここでは、技術的な詳細には立ち入らず、どのような観点で何を行ったかを説明します。
対象の把握
まず、PVCに応じてストレージを提供できない状況はどのような状況なのか、そしてどのようなメトリクスでそれを判断できるのか、といった事を、実験用の環境で確認しました。実験により、問題の状況は様々なケースで発生し得る事が分かり、まずはその内の1つのケースに限定してモニターの開発を進めることにしました。(結果的にはこの1つのケースの実装で終わりました。)
ここでは、インターン生には「まずは対象をよく観察する」という事を学んでいただきました。
実装
設計についてはある程度事前に社員の側で用意していたため、それに沿った形でインターン生の方々に実装を行っていただきました。
成果としては、まだPoCの域を出ませんが、想定ケースで必要となるメトリクスを取得しVictoriaMetricsのメトリクスとしてエクスポートさせることができました。
実装は全てGo言語で行っていただき、ここでは、Go言語での実装ノウハウなどを学んでいただきました。
ストレージコースまとめ
この様に、ストレージコースのインターンでは、普段、CSAチームが業務として行っている課題の一部を切り出してインターン生の方々に行っていただきました。
CSAチームはOSSをフル活用したチームであり、今回のインターンを通してインターン生の方々から「インターン後もOSSへのコントリビュートを行ってみたい」というコメントが得られたことは良かったと思います。
まとめ
去年までもそうだったのですが、いずれのコースも始まったばかりのころは知らないことばかりで苦労しましたが、終盤に近付くにつれて講師が口を出さなくても学生たちが自律的にアイデアを出したり手を動かしたりできるようになる場面が増えました。頼もしい限りです。この経験が彼らの今後の人生を決める上で役に立つことを願っています。
最後になりますが、Necoチームやストレージチームでは一緒に働いてくれるかたを募集中です。以下募集要項を見て興味を持ったかたはぜひご応募ください。