# 前職のチーム内状況と私の役割(時系列順)
入社後1ヶ月は新人研修に参加し、チームに配属されたのは5月からでした。私が配属したチームは同年の8月にリリースが予定されていたので、開発と本番環境の基盤はすでにある程度できている状態でした。
結局、リリースは12月に延長されたこともあり、11月ごろまではOJTの一環でjenkins,docker周りの仕事を担当していました。
リリース間近になると、全体的に若いチームだったということもあり、先輩方は新人への指示に手が回らない状況になっていました。その時期の私は、c++で先方の会社に送るgrafanaのグラフのスクリーンショットを自動で撮影するプログラムを作成したり、jenkinsの容量を監視するスクリプトを書いたりと、自分で仕事を探しチームに貢献してきました。
ゲームのリリース後は、半数以上のエンジニアが退職した為、一人でインフラ業務を担当するようになりました。勿論一人でインフラ業務を全て行うには力不足だった為、チーム外の先輩方にも相談・確認しながらなんとか大きな問題無く、業務を遂行しました。
# サービス終了時のGKE本番環境の縮小オペレーション
サービス終了に伴い、ゲームのサーバー構成を返金対応が行える最低限の構成まで縮小する必要がありました。また、そのオペレーションはメンテナンス中に行うのですが、実装の都合上メンテナンス中もAPIサーバーのダウンタイム0で行う必要がありました。
私はこの作業をメインで行わせて頂き、具体的にはKubernetesのマニフェスト作成とメンテナンス中に走らせる各種スクリプトの作成を担当しました。
私が設定した手順は、
1. 必要最低限のスペックで新規ノードプールを作成
2. 旧ノードプールに最小構成のマニフェストで各種podを再デプロイ
3. 旧ノードプールの全ノードに対してcordonを打つスクリプトを使い、新規podのデプロイを行わないようにする
4. 旧ノードプールの全ノードに対してdrainを打つスクリプトを使い、kube-systemのpodも含めてダウンタイム無しで新ノードプールへ移行する
5. 不要なリソースを削除するスクリプトを使い、マニフェストで定義されずに残り続けているリソースの削除
です。
上記の手順でメンテナンスを行う事を想定し、各種スクリプトやマニフェストを構築しました。
ダウンタイムを発生させない為の工夫として、マニフェストでmaxsurgeを設定する事で、少なくとも一台はpodが建った状態でローリングアップデートを行うようにしました。また、新ノードプールにpodを移行させる際もdrainを使い、リクエストを捌ききってからpodの移行を行えるように意識しました。
結果として、ステージング環境でのテスト、本番環境でのサーバー縮小メンテナンスも大きな問題なく実施できました。
# アップデート前の最終確認会の提案と実施
私のチームでは、プロジェクトが運用フェーズに入ったタイミングで多くのエンジニアが退職し、gitのブランチ管理を行う人が居なくなっていました。チームメンバーはどのブランチにどのバージョンのデータを入れれば良いか分からない状況が続いており、アップデート内容の設定を入れ忘れるといった初歩的なミスで緊急メンテナンスを行う回数も少なくは有りませんでした。チームとしてもこういったミスは、データワーカーの個人的なミスという扱いがされており、チームの問題としては見られていない状態でした。
私は、データワーカーに注意を促すだけではなくアップデートまでの確認フローを改善しない限り、初歩的なミスは無くならないと感じていました。そこで私が指揮を取り、ホワイトボード等を使ってどのバージョンのデータはどのブランチに入れるかの共有や、データの不備が無いかをチームメンバー全員で確認する会を実施しました。結果として緊急メンテの回数は多い時期の半分程度まで減り、先方のスケジュール変更に関しても柔軟に対応できるチームになりました。
# スキルセットについて
| スキル名 | 自分のレベル感 |
| ---- | ---- |
| Jenkins | 基本的、及び構造的なjob作成。スレーブ作成・保守・監視。スレーブの負荷分散対応の経験。 |
| Linux | Linuxへの基本的な理解。調べながらであればマシントラブルが起きた際も、どこに原因が有るか調査可能です。 |
| kubernetes | マニフェストを読み理解する力は有り、既存マニフェストへの変更を加えた経験があります。要件に合わせたサーバー構成を1から構築した経験はありません。 |
| Docker | 小さなアプリケーションをDockerに載せ替えた経験が幾度かあります。一からアプリケーションを作る場合もDockerコンテナを使用します。 |
| Shellコマンド | 基本的なコマンドライン操作、30行程の簡単なスクリプトの作成等が行えます。前職ではコマンドラインを使って、毎日作業を行っていました。 |
| C++ | 独学ではありますが、簡単なコード作成は可能です。 |
| GCE | 用途の違う複数のインスタンスの作成経験。インスタンスのトラブル対応や運用経験。 |
| GKE | 簡単なトラブル対応。メンテナンス時のnodeの増減見積もり等。 |
| その他GCP | 携わっていたプロジェクトがGCPヘビィだったので幾つかのサービスには簡単に触れた事があります。Dataflow, BigQuery, GCCB, GCS, FWルール等。 |