サイボウズサマーインターン2020 報告 〜 OSSへの貢献を通して学ぶKubernetes基盤開発

こんにちは。Necoチームの池添とsatです。

サイボウズは毎年サマーインターンシップを開催しています。

今年は新型コロナウイルス(COVID-19)の影響で一時開催が危ぶまれました。 しかし、この状況で学生の皆さんの就業体験の機会が失われてしまうのもよくないと考え、フルリモートでインターンシップを実施することとしました。

blog.cybozu.io

Kubernetes基盤開発コースは8月と9月の2回開催で、1回目の8月3日~14日(9日間)の日程には4人の学生が参加してくれました。

Kubernetes基盤開発コース担当のNecoチームはサイボウズの中でも、もっともOSSを活用しているチームです。 そこでこのコースでは、Necoチームが取り組んでいるKubernetes基盤開発について、OSSへの貢献を通して知ってもらう機会にしました。単に開発をするだけではなく、サイボウズがどういう意図で自社プロダクトをOSSとして公開しているか、また、既存のOSSの開発に参加しているのかについても学んでもらいました。

具体的には、2人ずつのチームに分かれて下記のような課題に取り組んでもらうこととしました。

1つめのチームはKubernetesプログラミングの手法を学び、新しいOSSプロダクトを開発するという課題です。

2つめのチームはOSSの作法を学び、メンテナと英語でやり取りしながらRook(後述)にコントリビュートするという課題です。

リモートインターンシップのための取り組み

今回、Necoチームではフルリモートでのインターンシップ受け入れに挑戦しました。 フルリモートであることがデメリットとならないように様々な取り組みを実施しましたので、いくつか紹介したいと思います。

開発環境

個人の環境の違いによる問題がでないように、開発環境としてはGCP上のインスタンスを利用してもらいました。

朝会/夕会、振り返り

朝会や振り返りの時間には、実際にNecoチームが普段実施しているミーティングに参加してもらいました。 実際のミーティングに参加することで、Necoチームが普段どのような仕事をしているのか、どのように改善を進めているのかを知ってもらうことができたと思います。

勉強会

課題に取り組む前に必要な知識を学んでもらうため、いくつかの勉強会を実施し、GoのContextの使い方のような基礎的な内容から、RookやTopoLVMの概要、OSS開発の作法などを学んでもらいました。

Kubernetesのカスタムコントローラ開発に関しては下記のような資料を用意して、手を動かしながら理解してもらいました。

zoetrope.github.io

これらを一通り終えた後に、どちらの課題に取り組むかをインターン生たちに選択してもらいました。

リモートモブプログラミング

課題はリモートモブプログラミング形式で取り組んでもらいました。

これはチームごとにメンターとなる社員2~3名と学生2名が常時Zoomで接続し、誰か1人の画面を共有しながらプログラミングを進めていくというものです。

モブプログラミングでは、常時ナビゲータからの指示が入るため分からないところでハマることがほとんどありません。 また、コードは書いたそばからレビューされることになり、エディタの使い方や様々なテクニックを共有することもでき、非常に密度の濃い時間を経験できたのではないかと思います。

成果発表会

成果発表会も、もちろんリモートで開催しました。Zoom で手軽に参加できるということもあり、40名を超える社員が発表を聴きに来てくれました。

リモートでのプレゼン発表は聴講者からの反応が少なくてやりにくいことも多いと思うのですが、今回の成果発表会ではたくさんの社員が適時チャットでコメントしてくれたので、非常に盛り上がった成果発表会となりました。

TopoLVMチームの課題

ここでは、TopoLVMチームが取り組んだ課題について具体的に紹介したいと思います。

TopoLVMはサイボウズが開発するCSI (Container Storage Interface) プラグインで、Kubernetesでローカルストレージを利用する際に便利なOSSとなっています。 最近では海外の利用ユーザーも増えてきています。

blog.cybozu.io

TopoLVMチームでは、TopoLVMに関する3つの課題に取り組んでもらいました。

Kubectlプラグインの開発

github.com

手始めにKubernetesプログラミングに慣れてもらうために、kubectlプラグインの開発に取り組んでもらいました。

この課題ではkubectlプラグインの作り方、KubernetesのAPIサーバーとやり取りする方法、envtestを利用したテストの書き方などを学んでもらいました。 特にプラグインの実装よりも自動テストに時間をかけていることを体験してもらい、我々がいかにテストを重視しているのかを知ってもらえたのではないかと思います。

TopoLVMの不具合修正

github.com

TopoLVMはサイボウズだけが利用しているものではなく、何人もの社外のユーザーが利用してくれています。

インターンシップ期間中に社外のユーザーから不具合が報告されたので、課題として不具合を修正し、新しいバージョンをリリースするところまで体験してもらいました。

pvc-autoresizerの開発

github.com

メイン課題としてpvc-autoresizerの実装に取り組んでもらいました。 pvc-autoresizerは、Podが利用している永続化ボリューム(PV: PersistenVolume)の空き容量が少なくなってきたら、自動的にサイズを拡張するというソフトウェアです。

この課題では英語でデザインドキュメントを書くところから開始し、基本的な機能の実装とテスト、チームメンバーによるレビューと、我々が普段の開発で実施している内容とほとんど同じ体験をしてもらいました。

なお、pvc-autoresizerはインターンシップの課題として開発したものですが、TopoLVMだけでなく様々なCSIプラグインで利用できる汎用的なソフトウェアとなっています。 今後、ドキュメントやサンプル等を整備して、広く利用されるOSSに育てていきたいと考えています。

Rookチームの課題

ここでは、Rookチームが取り組んだ課題について紹介します。

まずはこの課題に取り組む背景としてRook、およびRookとNecoの関係について説明をしておきます。RookはKubernetes上で動作する各種ストレージソフトウェアのオーケストレーションです。Necoではストレージ基盤としてCephを使うことを決めており、かつ、その管理にRookを使うことになったので開発に取り組んでいるというわけです。詳細については以下の記事をごらんください。

blog.cybozu.io

これらを踏まえた上で、Rookチームでは実際にupstreamのRookの開発に参加してもらいました。

Rookは大きなプロジェクトなので、実際にPRを投げる前に覚えるべきことがたくさんあります。このため、まずは全体構造をつかむためにRookにおけるKubernetesとCephの機能の対応、ローカル環境でのビルド/テスト方法、PR投稿時のルールなどを学びました。

upstream Rookへの修正の取り込み

前節において述べた準備が終わった後は、次のように簡単なPR投稿からはじめてインクリメンタルに難易度を上げていくという進め方をしました。

  1. ドキュメント修正
  2. コード修正: 実装方針が既に決まっているもの
  3. コード修正: 実装方針を自分で考えるもの

おふたりとも試行錯誤しながら順調に進み、最終的にはわずか二週間弱の間に5個のPRをマージというすばらしい成果をあげました。

github.com

github.com

github.com

github.com

github.com

マージされなかったPR

投稿したもののインターン期間中にマージされなかった修正も3つありました。これらはインターン終了後にNecoのメンバに引継いで継続中です。

1つ目は、同時期に出されたPRにおいて同様の修正がされていたので不要になったというものです。これは開発が活発なOSSにおいてよくあることです。

github.com

残る2つは、PRそのものがどうというより、Rookに現在発生しているCIの不具合によってマージができなかったというものです。

github.com

github.com

これらについてはCIの問題が解決すればマージされる見込みです。

インターン生たちが得たもの

上述したPRの投稿、マージといったわかりやすい成果以外にも、おふたりは様々なことを学びました。

まずはアクティブなOSSの開発におけるスピード感です。とくにPR5969については、日本時間の昼間に投稿したらアメリカ中部に住んでいるはずのメンテナに7分後にマージされました。さすがに彼らもこれには「マージが滅茶苦茶速い!あとこの人はいつ寝てるんだ!?」と、驚いたようです。

続いてOSSへの貢献に抵抗がなくなりました。OSSへの最初の貢献には、コードを書く以外にも「自分がやっていいのだろうか」「反対されたらどうしよう」などの心理的な障壁があるためにためらいがちなのですが、おふたりは見事その障壁を乗り越えました。メンテナからの質問にも臆することなく答えられるようになりました。今後本人たちが望めば、さまざまなOSSの開発に問題なく参加できることでしょう。

まとめ

今回のインターンシップはフルリモートでの開催ということで運営が難しかった面もありますが、非常に充実した内容で実施することができました。

この経験が学生の皆さんにとってKubernetesやインフラにより強く興味を持つきっかけとなり、彼らの進路を決定する助けになったり、Kubernetes界隈を盛り上げる一助となれば幸いです。