(1) はじめに
こんにちは!2023年新卒入社 株式会社ZUU プロダクト開発部Data Reliability Engineering(DRE)チームの吉本です。
現在はインフラ・データエンジニアとしてKubernetesを用いた自社プロダクトのインフラの設計からデプロイ、運用まで幅広く担当してます。また、BIgQueryを用いたデータ基盤の開発・運用をすると共に、社内のデータ利活用を推進するための取り組みを実施しています。
本記事では、未経験で入社した私が入社半年でKubernetesを使ったインフラ構築を行なった話をお伝えしていきます。
この記事を通して、ZUUに興味を持っていただけたら嬉しいです。
(2) 新卒エンジニアの挑戦
1ヶ月のGo言語とVue.jsを使用したフロント・バックエンド開発の研修を終え、DREチームに配属されました。
インフラについては右も左もわからなかったため、配属されて暫くは業務を行いながらキャッチアップをする日々。ちょうどKubernets実践ガイドという本を読んでいる折に別チームから新規開発したマイクロサービスのインフラ構築の依頼がきました。良いアウトプットの機会だと思い、「やってみたい!」という気持ちを上長に伝えたところ快く任せていただきました。
(3) 必要となった知識
1. Kubernetes
まずはKubernetesを理解するのに必要なコンテナ化について説明します。
コンテナ化とはアプリケーションの動作に必要なコードを入れ物に格納することです。これによりどのような環境でも実行できるようになります。
そしてKubernetesとは多数のコンテナの管理を自動化するオーケーストレーションツールです。コンテナ管理は以下のようなことを行なっています。以下に4つ例を挙げます。
- ロードバランシング〜コンテナへの通信が一つに集中しないように分散する。
- データ永続化〜コンテナが落ちてもデータが消えないようにストレージを割り当てる。
- スケーリング〜コンテナが許容しているメモリやCPUの量を超えそうな時に新しいコンテナを用意する。また、余裕ができるとコンテナを減らす。
- オートヒーリング〜コンテナが落ちてしまった時に自分でコンテナを回復させる。
また、Kubernetesではコンテナなどのリソースのあるべき状態を「マニフェスト」で定義しています。Kubernetesではこのマニフェストをみて、指定された状態に合わせてリソースを自動的に作成、更新、削除します。
2. GitOps
インフラ構築を行う際に注意すべきなのは、デプロイしたら終了というわけではないことです。サービスは日々改善されるものなのでいかに少ない労力で開発プロセスを運用し続けるかが重要であり、そのために必要な概念がGitOpsです。
詳しくは以下URL
https://www.redhat.com/ja/topics/devops/what-is-gitops
GitOpsの実現に必要なのがCI/CDの実装。CI/CDについても詳しくは以下URL
https://www.redhat.com/ja/topics/devops/what-is-ci-cd
(4) インフラ構築のプロセス
Goで開発されたアプリケーションをKubernetesにデプロイするために、以下の3つのステップをまずテスト環境で行い、その後本番環境でも同様に行いました。
- アプリケーションのビルド
- Kubrnetesマニフェスト作成
- Argocdでデプロイ
全体像は以下のようになっています。
1. 使用技術
今回の構築では以下の技術を使用しています。
- GKE (Google Kubernetes Engine): Google Cloud Platform上でのKubernetesのフルマネージドサービス。
- Cloud Build: Google CloudのフルマネージドなCIサービスで、ソースコードから容易にコンテナやアプリケーションをビルド、テスト、デプロイします。
- Terraform: インフラストラクチャをコードとして記述し、クラウドリソースの作成と変更を自動化するオープンソースのIaC(Infrastructure as Code)ツール。
- Argocd: Kubernetes用のGitOps継続的デリバリーツールで、Gitリポジトリの内容をクラスタに同期させます。
2. アプリケーションのビルド(CIの構築)
Goで作成されたアプリケーションをKubernetesで動作させるにはアプリケーションのイメージが必要です。今回はCloud Buildで イメージを作成しました。以下がイメージビルドの設定コードの一部です。
Cloud Buildでは「steps」によってステップごとにビルドを分けることができます。
一つ目のステップでは「①アプリケーションのビルドに必要なライブラリをインストール」し、「②Makefileの設定にそってテスト、ビルド」しています。
(Makefileについては以下を参照:https://qiita.com/yoskeoka/items/317a3afab370155b3ae8 )
二つ目のステップでは「③Dockerfileにそってイメージをビルド」します。そしてビルドされたイメージは「④”path/to/cache_fdb_card_image:$SHORT_SHA”のパスのRegistryに保存」します。Dockerfileでは「⑤ステップ1でビルドしたGoを実行するためのディレクトリをコンテナにコピー」しています。そして「⑥設定ファイルを格納するためのディレクトリを新たに作成」しています。
また、GitHubで新しい機能がマージされた際に自動でビルドするようにTerraformでトリガーを作成しました。
これによって「⑧インフラ用のGithubリポジトリのmainブランチにpush」された際に「⑦パスで指定したイメージビルドの設定コード」に従ってCloud Buildが動作するようになりました!
3. Kubernetesマニフェストの作成
いよいよKubernetesによるインフラ構築を行います!
コンテナをデプロイするためのDeployment、コンテナ同士が通信するためのService、秘匿の設定情報を格納するためのExternalSecretのリソースをマニフェストで定義しました。
テスト環境と本番環境で同じ設定をしているマニフェストを書くのは時間が勿体無いので、共通部分をまとめるためにKustomizeを使用しました。
ファイル構成はこのようになっています。
「micro_cache_fdb_card」の設定を例にして説明します。
baseに共通の項目を記述します。
ここで「cfc_image」という仮の名前のイメージを定義します。そしてbaseの定義をkustomizeで使用するためにkustomization.yamlを作成し、resourcesに追加します。
テスト環境と本番環境を分けるためにstgディレクトリ内にkustomization.yamlとpatchディレクトリを追加します。patchディレクトリにはbaseの設定を上書きしたいYAMLファイルを記述します。
「path/to/cache_fdb_card_image」はそれぞれの環境でビルドされたGoアプリケーションが保存されているRegistoryへのパスになります。このようにすることでテスト環境と本番環境で個別のリソースを定義できるようになります。
4. ArgoCDを用いたデプロイ(CDの構築)
ArgocdとGithubリポジトリ(アプリケーションとインフラのリポジトリは区別されており、ここではインフラ用のリポジトリと)を紐付けるためにはApplicationsが必要になります。
ここで重要になるのが「annotations」です。適切に設定することでCloud Buildで新しいイメージがビルドされた際に、自動でコンテナが作り替えられるようになります。これによってGitリポジトリとの違いを検出して差分を自動でデプロイしてくれます。
また「spec.syncPolicy.automated」という設定があるのですが、本番環境ではこの設定を削除することでArgocdが差分検知を行い、デプロイは人間が行うことで意図しない変更が自動でデプロイされてしまうことを防いでいます。
(5) 学びと次のステップ
KubernetesだけでなくCI/CDも扱うことで新規で行うインフラ構築の一連の流れを経験しました。今回の経験によってKubernetes周辺の知識を体系的に学ぶことが出来ました!
特に重要だと感じたのは全てのマニフェストを書いてからデプロイするのではなく、テスト環境で機能ごとに細かくデプロイを行い、トライアンドエラーを繰り返して完成に近づけることです。これによって開発の速度とKubernetesのリソースへの理解がかなり向上すると感じました。
また先輩エンジニアが書いた既存コードのコードリーディングも重要です。私も今回の構築で参考にさせていただきました。
下期はCKAを受験し、さらにレベルアップしたKubernetesエンジニアになりたいと思います!
(6) 最後に
最後にインフラの知識ゼロからKubernetesを使用したインフラ構築をする上で基本概念の理解や実際の構築に役に立ったサイトを共有させていただきます。
・Cloud Build:https://qiita.com/nirasan/items/81f742e1c269bdfb78ab
・Kubernetesマニフェスト:https://zenn.dev/tamago0224/articles/f50d57c238aef4
・Argocd×Kustomize:https://argo-cd.readthedocs.io/en/stable/user-guide/kustomize (結局公式ドキュメントが最強)
キャッチアップする時間が取れるかな…と不安になる方もいらっしゃると思いますが大丈夫です!ZUUでは業務時間内でキャッチアップする時間を設けることが出来ます。分からないことがあっても、周りのエンジニアに質問すると快く答えてくれます。
最後までお読みいただきありがとうございました!
一緒に働くエンジニア募集!
ZUUでは一緒に働く仲間を募集しています!
詳しくは下記をご参照ください。