Internship2025

4月21日(月)からエントリー開始

クラウド基盤Kubernetes基盤開発

コース概要

サイボウズでは、Kubernetes を使用した自社データセンター管理基盤(Neco)の開発および運用をしています。Kubernetes の特徴である宣言的な構成管理の仕組みを活用し、運用の自動化と安定したサービス提供を目標にしています。

2018年にプロジェクトが発足し、2021年に Neco のデータセンターの初期開発が完了しました。現在は、cybozu.com のサービスを段階的に移行していくフェーズです。安定運用と機能拡充が求められる、サービス基盤として最もチャレンジングな時期となりました。

Neco の開発・運用業務では、Kubernetes やエコシステムを深く理解することができ、OSS 活動も活発に行っています。

本インターンでは、Neco の開発・運用業務を2週間体験してもらいます。テーマは、Necoに関連した内容で複数の候補を作り、学生さんの興味に合わせて実際の作業を決定します。

エントリー概要
必要な経験/スキル
  • Goのプログラムを読み書きできる
  • UNIX系OSでのコマンドライン操作
  • Git/GitHubの使用経験
あると望ましい経験/スキル
  • KubernetesやDockerの利用経験
  • 英語の読み書きができる
対象
  • 2027年4月に入社が可能な方
  • 日本国内でインターンに参加できる方
開催形式
オンライン
開催日程
8月18日(月)〜8月29日(金)
受入人数
3名
エントリー期間
  • 1次エントリー開始:4月21日(月)10:00
  • 1次エントリー締切:5月6日(火)23:59
  • 2次エントリー開始:5月7日(水)10:00
  • 2次エントリー締切:5月27日(火)10:00
選考内容
  • 書類選考
    • GitHubアカウントやポートフォリオ等の提出が必要です
  • 面接
準備物
  • ヘッドセットやイヤホン
  • キーボードやマウス(必要に応じて)
  • ネットワーク環境
  • 二要素認証のために必要な私物端末
事前課題
課題1(必須)

以下の仕様を満たす HTTP サーバを Go で実装してください。利用可能な Go バージョンは 1.23 のいずれかのバージョンとします。また利用可能なモジュールは Go の標準モジュールのみとします。

  • サーバはポート番号 8000 で接続を受け付けます。
  • サーバは受け取ったリクエストに応じて Todo アイテムを操作します
  • Todo アイテムは以下のフィールドを持ちます
    • - title string 型
    • description string 型
    - id int 型
  • サーバにアップロードされたデータはメモリ上に保持し、再起動前後で維持する必要はありません。
  • `/todos/{id}` というパスへのアクセスを受け付けます。ただし `{id}` はアクセスするクライアントが自由に指定する 0 以上の整数です。
    • この制約を満たさない `{id}` へのアクセスを考慮する必要はありません。
  • それ以外のパスへのリクエストには全てステータスコード 404 を返します。
  • `/todos/{id}` は以下のメソッドを受け付けます。
    • `POST`
    • `GET`
    • `DELETE`
  • 他のメソッドでアクセスされたときはステータスコード 405 を返します。
  • `POST` メソッドでアクセスされたとき
    • JSON 形式のテキストをリクエストボディで受け取ります。
    • 受け取った JSON は、`title` と `description` フィールドを持ち、それぞれ文字列が入力されています。
    • サーバは受け取った JSON を使って保存している Todo アイテムを作成します。
    • すでに指定された `{id}` が存在している場合は内容を上書きします。
    • 処理に成功した場合、サーバはステータスコード 200 を返します。
    • 処理に失敗した場合、サーバはステータスコード 500 を返します。
  • `GET` メソッドでアクセスされたとき
    • `{id}` に該当するデータがある場合、それを JSON 形式のテキストで返します。ステータスコードは 200 とします。
    • `{id}` に該当するデータがない場合、ステータスコード 404 を返します。
    • 処理に失敗した場合、ステータスコード 500 を返します。
  • `DELETE` メソッドでアクセスされたとき
    • `{id}` に該当する Todo アイテムを削除します。返却するステータスコードは 204 とします。
    • 指定された `{id}` の Todo アイテムがない場合も同様に 204 を返却します。
    • 処理に失敗した場合、ステータスコード 500 を返します。
  • プログラムは main.go という名前の単一のファイルで作成してください。
  • 作成したプログラムは以下のコマンドで実行できるようにしてください。
    • CGO_ENABLED=0 go run ./main.go
サーバの動作例
```
$ curl -s -o - -w "\nStatus Code: %{http_code}\n" http://localhost:8000/todos/0
            
Status Code: 404
$ curl -s -o - -w "\nStatus Code: %{http_code}\n" -X PUT http://localhost:8000/todos/0
            
Status Code: 405
$ curl -s -o - -w "\nStatus Code: %{http_code}\n" -X POST --json
'{"title": "test", "description": "Todo something"}'
http://localhost:8000/todos/0
            
Status Code: 200
$ curl -s -o - -w "\nStatus Code: %{http_code}\n"
http://localhost:8000/todos/0
{"id":0,"title":"test","description":"Todo something"}
Status Code: 200
$ curl -s -o - -w "\nStatus Code: %{http_code}\n" -X DELETE
http://localhost:8000/todos/0
            
Status Code: 204
$ curl -s -o - -w "\nStatus Code: %{http_code}\n"
http://localhost:8000/todos/0
            
Status Code: 404
```
課題2(任意)

課題 1 で作成したプログラムをコンテナ化するための Dockerfile を作成してください。 なお、ベースイメージは以下のイメージの中から用いてください。

  • ghcr.io/cybozu/golang:1.23-noble
  • ghcr.io/cybozu/ubuntu:24.04
  • scratch
課題3(任意)

以下の仕様を満たす Kubernetes のマニフェストを作成してください。 なお作成したマニフェストは、Kubernetes 1.32 のいずれかのバージョンで動作するものとします。

  • 課題 2 で作成した Dockerfile を用いて、コンテナイメージをビルドしてください
  • ビルドしたコンテナイメージを使用する Deployment リソースを作成してください
    • Deployment の Replica 数は 1 にしてください
    • Deployment が使うイメージ名は、todos:dev としてください
  • Service を作成して、上記の Deployment で作成した Pod にアクセス可能な状態にしてください
    • Service の Type は ClusterIP で作成してください
  • 課題提出の際は、manifest.yaml という名前のファイルに Deployment と Service のマニフェストを記述して提出してください
  • 参考情報として、ローカルで Kubernetes の動作確認を行う方法として、kind と呼ばれるツールを使う方法があります。
  • https://kind.sigs.k8s.io
提出方法

各課題の成果物である、main.go・Dockerfile・manifest.yaml の 3 つを secret gist にアップロードしてください。
なお、課題 2・課題 3 の成果物である、Dockerfile・manifest.yaml のアップロードに関しては必須ではありません。
go.mod ファイルはアップロード不要です。また、指定した名前以外のファイルは評価対象になりません。 アップロードした secret gist のリンクを提出してください。

その他

課題に関する質問は受け付けておりません。各課題について言及されていない仕様や要件などに関しては、自由に解釈および設定してください。

待遇
  • 20,000円/日
過去の開催レポート
メンター
写真: 杉浦 智基
杉浦 智基
写真: 竹村 太一
竹村 太一